web-dev-qa-db-fra.com

Comment désactiver la vue unique pour un type de publication personnalisé?

J'ai créé un type de message personnalisé:

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

Comment puis-je désactiver l'affichage de publication unique pour ce type de publication spécifique? Afficher un simple 404 est correct, ou rediriger vers la page d'accueil. C'est à l'intérieur d'un plugin, donc je ne peux pas créer un fichier single-sample_post_type.php pour configurer une page vide.

44
passatgt

Vous pouvez utiliser le hook template_redirect pour rediriger un type d'article personnalisé. Vous pouvez utiliser n'importe quelle autre URL à la place de home_url() et le code d'erreur dans un autre argument.

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

Mis à jour:

Une autre approche consisterait à définir 'publicly_queryable' => false lors de l’enregistrement de la publication personnalisée, comme mentionné précédemment par @gustavo. Mais cela vous donnera simplement 404 directement, il cacherait les archives individuelles, ainsi que complètement cachées du serveur frontal et ne peut être configuré que pour les publications personnalisées.

35
sven

Juste mettre l'argument

'publicly_queryable'  => false

lorsque vous appelez register_post_type ()

65
Gustavo

Une méthode plus simple consiste à passer les arguments suivants lors de l’enregistrement du type de publication personnalisé.

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

Un. À partir de votre fichier de fonctions.

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

Deux. À partir de votre fichier single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>
7
Brad Dalton

Travaillant à partir de la très bonne réponse de Sven, j'ai réécrit sa fonction pour faciliter l'ajout de plusieurs types de publication en utilisant in_array() dans l'instruction if, puis en redirigeant vers la page d'archive au lieu de la page d'accueil.

(au fait, je pense que le réglage de query_var et/ou publically_queryable sur false désactivera non seulement les vues uniques, mais également la vue de l'archive native, en remplaçant 'has_archive' => true. Dans ce cas, vous pouvez toujours configurer un WP_query personnalisé et créer votre propre archive page, dans un modèle, mais la requête principale ne le fera plus, n'est-ce pas?)

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

Testé tous ceux mentionnés ci-dessus et la solution réelle est plus simple que toutes les redirections suggérées.

Pour que les archives soient accessibles et listent les éléments, et que seul post not soit accessible et redirection automatique vers 404 set

'query_var' => false

lors de l'enregistrement de votre CPT. Si vous définissez publicly_queryable sur false, vos archives seront redirigées vers la maison, toute autre combinaison ne fonctionnera pas. Définissez le query_var sur false et c'est tout.

Voici le CPT complet https://Gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

voir la ligne 50 https://Gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

comme indiqué ici

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

Remarque: Si query_var est vide, NULL ou un booléen FALSE, WordPress tentera toujours de l'interpréter (4.2.2) et les prévisualisations/vues de votre publication personnalisée renverront 404.

2
Benn