Jak wyłączyć pojedynczy widok dla niestandardowego typu postu?

47

Utworzyłem niestandardowy typ postu:

register_post_type('sample_post_type',array(
    'labels' => array(
        'name' => _x('Sample Posts', 'post type general name'),
        'singular_name' => _x('Sample Post', 'post type singular name')
    ),
    'public' => true,
    'show_in_nav_menus' => false,
    'exclude_from_search' => true
));

Jak mogę wyłączyć widok pojedynczego wpisu dla tego konkretnego typu wpisu? Wyświetlenie zwykłego 404 jest w porządku lub przekierowanie na stronę główną. Jest to wewnątrz wtyczki, więc nie mogę utworzyć pliku single-sample_post_type.php w celu ustawienia pustej strony.

passatgt
źródło

Odpowiedzi:

43

Możesz użyć template_redirecthook do przekierowania niestandardowego typu postu, możesz użyć dowolnego URL-a zamiast home_url()kodu błędu w innym argumencie.

<?php
add_action( 'template_redirect', 'wpse_128636_redirect_post' );

function wpse_128636_redirect_post() {
  $queried_post_type = get_query_var('post_type');
  if ( is_single() && 'sample_post_type' ==  $queried_post_type ) {
    wp_redirect( home_url(), 301 );
    exit;
  }
}
?>

Zaktualizowano:

Alternatywnym podejściem byłoby ustalenie:

'publicly_queryable'  => false`

podczas rejestrowania niestandardowego postu, jak wspomniano wcześniej przez @gustavo. Ale po prostu całkowicie usuwa stronę i przekierowuje do strony 404. Ukrywa także stronę pojedynczą i archiwalną, w zasadzie całkowicie ukrytą przed interfejsem i można ustawić tylko dla niestandardowych postów.

^ To podejście działa, jeśli chcesz zarejestrować niestandardowy post tylko do użytku administratora / zaplecza

Kumar
źródło
Dobre rozwiązanie. get_current_user_id()
Przekonałem
2
Sprawdź formularz odpowiedzi @Gustavo
Richard
2
dlaczego nie używać tylko is_singular('post-type-slug')w if()warunkach zamiast 2 warunkach?
Akash K.,
@AkashK. Tak, to też może działać, nie byłem świadomy tej funkcji.
Kumar
75

Po prostu ustawiam argument

'publicly_queryable'  => false

kiedy wywołasz register_post_type ()

Gustavo
źródło
1
Wygląda to na odpowiedź, która powstrzyma Twoje CPT przed tworzeniem rzeczywistych stron internetowych przy jednoczesnym tworzeniu wszystkich odniesień do bazy danych.
Ben Racicot,
27
To również ukrywa archiwum
kosmita
1
To powinna być zaakceptowana odpowiedź.
SinisterBeard
Dla mnie powoduje to przekierowanie na stronę główną zamiast 404. Jakieś pomysły, dlaczego? Rejestruję typ postu w Piklist, na wypadek, gdyby było to istotne.
emersonthis
8

Prostszym sposobem na to może być przekazanie następujących argumentów podczas rejestracji niestandardowego typu postu

register_post_type('sample_post_type',array(
'labels' => array(
    'name' => _x('Sample Posts', 'post type general name'),
    'singular_name' => _x('Sample Post', 'post type singular name')
),
'public' => true,
'exclude_from_search' => true,
'show_in_admin_bar'   => false,
'show_in_nav_menus'   => false,
'publicly_queryable'  => false,
'query_var'           => false
));
0v3rth3d4wn
źródło
1
Prawdę publically_querablemówiąc, by działało, musisz być prawdziwy.
Howdy_McGee
To mi nie działa. Po prostu przekierowuje z powrotem na stronę główną podczas próby przejścia do archiwum
Yahya Uddin
7

Jeden. Z pliku funkcji.

add_action( 'template_redirect', 'redirect_cpt_singular_posts' );
    function redirect_cpt_singular_posts() {
      if ( is_singular('your-cpt-slug') ) {
        wp_redirect( home_url(), 302 );
        exit;
      }
    }

Dwa. Z pliku single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>
Brad Dalton
źródło
Podobała mi się druga opcja. Ale muszę wiedzieć, czy ta druga opcja ma jakąś wadę.
user2584538,
@ user2584538 Jeśli nie masz niestandardowego single-cpt_name.phppliku, nie możesz tego zrobić. Jeśli umieścisz tę funkcję w prostym pliku wtyczki, możesz aktywować / dezaktywować bez edytowania żadnego pliku.
EliasNS,
2

Opierając się na naprawdę dobrej odpowiedzi Svena, przepisałem jego funkcję, aby ułatwić dodawanie wielu typów postów za pomocą in_array()instrukcji if, a następnie przekierowanie na stronę archiwum zamiast na stronę główną.

(nawiasem mówiąc, myślę, że ustawienie query_vari / lub publically_queryablefalse spowoduje wyłączenie nie tylko pojedynczych widoków, ale także natywnego widoku archiwum, nadpisywanie 'has_archive' => true. W takim przypadku nadal możesz skonfigurować niestandardowe WP_query i utworzyć własną stronę archiwum w szablon, ale główne zapytanie już tego nie zrobi, prawda?)

function fq_disable_single_cpt_views() {
  $queried_post_type = get_query_var('post_type');
  $cpts_without_single_views = array( 'my-post-type', 'my-other-post-type' );
  if ( is_single() && in_array( $queried_post_type, $cpts_without_single_views )  ) {
    wp_redirect( home_url( '/' . $queried_post_type . '/' ), 301 );
    exit;
  }
}

add_action( 'template_redirect', 'fq_disable_single_cpt_views' );
slashbob
źródło
2

Przetestowano wszystkie wyżej wymienione, a rzeczywiste rozwiązanie jest prostsze niż jakiekolwiek sugerowane przekierowania.

Aby archiwum było dostępne i zawierało listę elementów, pojedynczy post nie był dostępny i automatyczne przekierowanie do zestawu 404

'query_var' => false

podczas rejestracji CPT. Jeśli ustawisz wartość publicly_queryablefalse, twoje archiwa zostaną przekierowane do domu, inne kombinacje nie będą działać. Ustaw na query_varfalse i to wszystko.

Oto pełny CPT https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

patrz wiersz 50 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

jak stwierdzono tutaj

https://codex.wordpress.org/Function_Reference/register_post_type

Uwaga: Jeśli zapytanie_var jest puste, puste lub logiczne FAŁSZ, WordPress nadal będzie próbował go zinterpretować (4.2.2), a podgląd / widok niestandardowego postu zwróci 404s.

Benn
źródło
To trochę jak hack, ale wydaje się, że działa. Szkoda, że ​​zamiast tego nie dodają dedykowanej właściwości has_single wraz z istniejącą właściwością has_archive.
powerbuoy
0

W przypadku, gdy chcesz całkowicie wyłączyć niestandardowy typ pojedynczego widoku posta w interfejsie użytkownika, ale móc wyświetlać stronę archiwum, sprawy stają się nieco skomplikowane.

Ustawianie publicly_queryablesię falsealbo rewritedo falseuniemożliwi wyświetlania pojedynczej i archiwum pogląd. W register_post_typeargumentach funkcji nie ma flagi, aby zapobiec tworzeniu tylko reguł przepisywania pojedynczego widoku.

https://github.com/WordPress/WordPress/blob/5.2.3/wp-includes/class-wp-post-type.php#L540

Możesz jednak usunąć tag przepisywania po zarejestrowaniu typu posta, co pozostawi nietknięte reguły przepisywania widoku archiwum, ale usuniesz tylko reguły przepisywania pojedynczego widoku.

/**
 * Register event post type
 */
function wpse_128636_register_event_post_type() {

    $labels = array(
        'name' => __( 'Events' ),
        'singular_name' => __( 'Event' ),
        'add_new' => __( 'Add new' ),
        'add_new_item' => __( 'Add new' ),
        'edit_item' => __( 'Edit' ),
        'new_item' => __( 'New' ),
        'view_item' => __( 'View' ),
        'search_items' => __( 'Search' ),
        'not_found' => __( 'Not found' ),
        'not_found_in_trash' => __( 'Not found Events in trash' ),
        'parent_item_colon' => __( 'Parent' ),
        'menu_name' => __( 'Events' ),

    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'supports' => array( 'title', 'page-attributes' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'event'),
        'capability_type' => 'post',
    );

    register_post_type( 'event', $args );
    remove_rewrite_tag( '%event%' ); // This line will remove event rewrite rules for single view
}

add_action( 'init', 'wpse_128636_register_event_post_type' );

Kolejną zaletą jest to, że od teraz możesz tworzyć proste strony WordPress za pomocą struktury permalink typu post po zdarzeniu, event/simple-pagektóra może być pomocna w złożonych witrynach.

Pamiętaj, aby opróżnić reguły przepisywania po modyfikacji kodu.

kierzniak
źródło