it-swarm.com.de

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

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.

44
passatgt

Sie können template_redirect hook verwenden, um für einen benutzerdefinierten Beitragstyp umzuleiten. Sie können eine beliebige andere URL anstelle von home_url() und den Fehlercode 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;
  }
}
?>

Aktualisierte:

Ein alternativer Ansatz wäre, 'publicly_queryable' => false beim Registrieren des benutzerdefinierten Posts festzulegen, wie bereits von @gustavo erwähnt. Aber das gibt dir nur 404 direkt, es würde sowohl einzelne als auch Archive verbergen, im Grunde genommen komplett vom Front-End verborgen und kann nur für benutzerdefinierte Posts eingestellt werden.

35
sven

Setzen Sie einfach das Argument

'publicly_queryable'  => false

wenn Sie register_post_type () aufrufen

65
Gustavo

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
));
8
0v3rth3d4wn

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; ?>
7
Brad Dalton

Nach der wirklich guten Antwort von Sven habe ich seine Funktion umgeschrieben, um das Hinzufügen mehrerer Beitragstypen zu vereinfachen, indem ich in_array() in der if-Anweisung verwende und dann auf die Archivseite anstatt auf die Homepage umleitung.

(Ich denke übrigens, die Einstellung query_var und/oder publically_queryable auf false deaktiviert nicht nur die einzelnen Ansichten, sondern auch die native Archivansicht, die 'has_archive' => true überschreibt. In diesem Fall können Sie weiterhin eine benutzerdefinierte WP_query einrichten und Ihr eigenes Archiv erstellen Seite, in einer 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' );
2
slashbob

Getestet alle oben genannten und die tatsächliche Lösung ist einfacher als alle vorgeschlagenen Weiterleitungen.

Damit das Archiv zugänglich ist und die Elemente aufgelistet werden, muss ein einzelner Beitrag nicht zugänglich sein und die automatische Weiterleitung auf 404 erfolgen

'query_var' => false

bei der Registrierung Ihres CPT. Wenn Sie publicly_queryable auf false setzen, werden Ihre Archive umgeleitet nach Hause, jede andere Kombination funktioniert nicht. Setzen Sie den query_var auf false und fertig.

Hier ist die vollständige CPT 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, es zu interpretieren (4.2.2), und Vorschauen/Ansichten Ihres benutzerdefinierten Beitrags geben 404s zurück.

2
Benn