Wie deaktiviere ich die Einzelansicht für einen benutzerdefinierten Beitragstyp?

47

Ich habe einen benutzerdefinierten Beitragstyp erstellt:

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
));

Wie kann ich die Einzelbeitragsansicht für diesen bestimmten Beitragstyp deaktivieren? Das Anzeigen eines einfachen 404 ist in Ordnung oder das Weiterleiten auf die Homepage. Dies befindet sich in einem Plugin, daher kann ich keine single-sample_post_type.php-Datei erstellen, um eine leere Seite einzurichten.

passatgt
quelle

Antworten:

43

Sie können template_redirectHook verwenden, um für einen benutzerdefinierten Beitragstyp umzuleiten. Sie können eine beliebige andere URL anstelle des home_url()Fehlercodes in einem anderen Argument verwenden.

<?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;
  }
}
?>

Aktualisiert:

Ein alternativer Ansatz wäre, Folgendes festzulegen:

'publicly_queryable'  => false`

während der Registrierung des benutzerdefinierten Beitrags, wie zuvor von @gustavo erwähnt. Die Seite wird jedoch nur vollständig entfernt und Sie werden zur 404-Seite weitergeleitet. Außerdem werden sowohl einzelne als auch Archivseiten ausgeblendet, die im Grunde genommen vollständig vom Frontend verborgen sind und nur für benutzerdefinierte Posts festgelegt werden können.

^ Dieser Ansatz funktioniert, wenn Sie einen benutzerdefinierten Beitrag nur für die Verwendung durch Administratoren / Back-End-Benutzer registrieren möchten

Kumar
quelle
Eine gute Lösung. Es hat sich als hilfreich get_current_user_id()
erwiesen
2
Bitte überprüfen Sie das Antwortformular @Gustavo
Richard
2
warum nicht nur is_singular('post-type-slug')im if()zustand statt 2 zuständen verwenden?
Akash K.
@AkashK. Ja, das kann auch funktionieren, war sich der Funktion nicht bewusst.
Kumar
75

Setzen Sie einfach das Argument

'publicly_queryable'  => false

wenn Sie register_post_type () aufrufen

Gustavo
quelle
1
Dies scheint die Antwort zu sein, um zu verhindern, dass Ihr CPT tatsächliche Webseiten erstellt, während weiterhin alle Datenbankreferenzen erstellt werden.
Ben Racicot
27
Dieses Archiv verbirgt sich auch
Spaceman
1
Dies sollte die akzeptierte Antwort sein.
SinisterBeard
Für mich führt dies zu einer Umleitung auf die Homepage anstelle einer 404. Irgendwelche Ideen, warum? Ich registriere den post_type bei Piklist, falls dies relevant ist.
emersonthis
8

Eine einfachere Möglichkeit, dies zu tun, besteht darin, die folgenden Argumente bei der Registrierung des benutzerdefinierten Beitragstyps zu übergeben

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
quelle
1
Eigentlich müssten Sie publically_querabletrue sein, damit Post Type Archives funktionieren.
Howdy_McGee
Das funktioniert bei mir nicht. Es leitet gerade zurück zur Homepage, wenn versucht wird, zum Archiv zu gehen
Yahya Uddin
7

Ein. Aus Ihrer Funktionsdatei.

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;
      }
    }

Zwei. Aus deiner single.cpt.php Datei:

<?php wp_redirect( home_url() ); exit; ?>
Brad Dalton
quelle
Ich mochte die zweite Option. Aber ich muss wissen, ob diese zweite Option einen Nachteil hat.
user2584538
@ user2584538 Wenn Sie keine benutzerdefinierte single-cpt_name.phpDatei haben, können Sie dies nicht tun. Wenn Sie die Funktion in eine einfache Plugin-Datei einfügen, können Sie sie aktivieren / deaktivieren, ohne eine Datei zu bearbeiten.
EliasNS
2

Ausgehend von Svens wirklich guter Antwort habe ich seine Funktion umgeschrieben, um das Hinzufügen mehrerer Beitragstypen mithilfe in_array()der if-Anweisung und das Umleiten auf die Archivseite anstelle der Homepage zu vereinfachen .

(Ich denke übrigens, dass die Einstellung query_varund / oder publically_queryablefalse nicht nur die einzelnen Ansichten, sondern auch die native Archivansicht 'has_archive' => trueaußer Kraft setzt. In diesem Fall können Sie weiterhin eine benutzerdefinierte WP_query einrichten und Ihre eigene Archivseite in erstellen eine Vorlage, aber die Hauptabfrage macht das nicht mehr, oder?)

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
quelle
2

Getestet alle oben genannten und die eigentliche Lösung ist einfacher als alle vorgeschlagenen Weiterleitungen.

Damit auf das Archiv zugegriffen werden kann und die Elemente aufgelistet werden, muss ein einzelner Beitrag nicht verfügbar sein und die automatische Weiterleitung auf 404 erfolgen

'query_var' => false

bei der Registrierung Ihres CPT. Wenn Sie " publicly_queryablefalse" wählen, werden Ihre Archive nach "home" umgeleitet , andere Kombinationen funktionieren nicht. Setzen Sie das query_varauf false und das ist es.

Das vollständige CPT finden Sie unter https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

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

wie hier angegeben

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

Hinweis: Wenn query_var leer, null oder ein boolescher Wert FALSE ist, versucht WordPress immer noch, ihn zu interpretieren (4.2.2), und Vorschauen / Ansichten Ihres benutzerdefinierten Beitrags geben 404s zurück.

Benn
quelle
Es fühlt sich ein bisschen wie ein Hack an, aber es scheint zu funktionieren. Wünschte, sie würden stattdessen nur eine dedizierte has_single-Eigenschaft zusammen mit der vorhandenen has_archive-Eigenschaft hinzufügen.
Boje
0

Wenn Sie die Einzelansicht für benutzerdefinierte Posts im Frontend vollständig deaktivieren möchten, aber die Archivseite anzeigen können, wird es etwas komplizierter.

Einstellung publicly_queryablezu falseoder verhindern wird für sowohl Einzel- als auch Archivansicht angezeigt wird . In Funktionsargumenten ist kein Flag vorhanden , das verhindert, dass nur Umschreibregeln für einzelne Ansichten erstellt werden.rewritefalseregister_post_type

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

Sie können jedoch das Umschreibungs-Tag entfernen, nachdem Sie Ihren Beitragstyp registriert haben. Dadurch bleiben die Umschreibungsregeln für die Archivansicht unverändert, es werden jedoch nur die Umschreibungsregeln für die Einzelansicht entfernt.

/**
 * 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' );

Ein weiterer Bonus ist, dass Sie von nun an einfache WordPress-Seiten mit der Permalink-Struktur ( event/simple-page) erstellen können, die in komplexen Websites hilfreich sein kann.

Denken Sie daran, die Umschreiberegeln nach der Code-Änderung zu löschen.

kierzniak
quelle