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


47

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. Ceci 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.

Réponses:


43

Vous pouvez utiliser template_redirecthook pour rediriger un type d'article personnalisé, vous pouvez utiliser n'importe quelle autre URL que vous souhaitez remplacer 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 approche alternative consisterait à définir:

'publicly_queryable'  => false`

lors de l’enregistrement de la publication personnalisée mentionnée précédemment par @gustavo. Mais cela supprime complètement la page et vous redirige vers la page 404. En outre, il masque les pages simples et les pages d’archives, qui sont en fait complètement masquées du système frontal et ne peuvent être définies que pour les publications personnalisées.

^ Cette approche fonctionne si vous souhaitez enregistrer une publication personnalisée à des fins d'administration / d'utilisation uniquement.


Une bonne solution J'ai trouvé utile de n'effectuer cette redirection que pour les utilisateurs non authentifiés, en vérifiant que l' get_current_user_id()évaluation est égale à 0.
RevNoah

2
S'il vous plaît vérifier le formulaire de réponse @ Gustavo
Richard

2
pourquoi ne pas utiliser uniquement is_singular('post-type-slug')dans la if()condition au lieu de 2 conditions?
Akash K.

@ AkashK. Ouais, cela peut fonctionner aussi, n'était pas au courant de la fonction.
Kumar

75

Juste mettre l'argument

'publicly_queryable'  => false

lorsque vous appelez register_post_type ()


1
Cela ressemble à la solution pour empêcher votre CPT de créer des pages Web réelles tout en créant toutes les références de base de données.
Ben Racicot

27
Cette archive cache aussi
astronaute

1
Cela devrait être la réponse acceptée.
SinisterBeard

Pour moi, cela provoque une redirection vers la page d'accueil au lieu d'un 404. Des idées pourquoi? J'enregistre le post_type auprès de Piklist, si c'est pertinent.
emersonthis

8

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

1
En réalité, vous devez publically_querableêtre vrai pour que Post Type Archives fonctionne.
Howdy_McGee

Cela ne fonctionne pas pour moi. Il vient de rediriger vers la page d'accueil lorsque vous essayez d'accéder aux archives
Yahya Uddin

7

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. Depuis votre fichier single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>

J'ai aimé la deuxième option. Mais j’ai besoin de savoir s’il ya un inconvénient à cette deuxième option.
user2584538

@ user2584538 Si vous n'avez pas de single-cpt_name.phpfichier personnalisé , vous ne pouvez pas le faire. Si vous mettez la fonction dans un simple fichier de plug-in, vous pouvez activer / désactiver sans modifier aucun fichier.
EliasNS

2

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()l'instruction if, puis en redirigeant vers la page d'archive au lieu de la page d'accueil.

(au fait, je pense que le paramètre query_varet / ou la valeur publically_queryablefalse désactivera non seulement les vues uniques, mais également la vue d’archive native, qui les redéfinit 'has_archive' => true. Dans ce cas, vous pouvez toujours configurer un WP_query personnalisé et créer votre propre page d’archive, 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

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

Afin que l'archive soit accessible et répertorie les éléments, et que le post simple ne soit pas accessible et redirige automatiquement vers l'ensemble 404

'query_var' => false

lors de l'enregistrement de votre CPT. Si vous définissez publicly_queryablesur false, vos archives seront redirigées vers la maison, toute autre combinaison ne fonctionnera pas. Définissez le query_varsur 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 tente toujours de l'interpréter (4.2.2) et les prévisualisations / vues de votre publication personnalisée renvoient des 404.


Cela ressemble un peu à un bidouillage, mais cela semble fonctionner. Ils souhaiteraient simplement ajouter une propriété has_single dédiée avec la propriété has_archive existante à la place.
powerbuoy le

0

Si vous souhaitez désactiver complètement le mode d'affichage unique de type publication personnalisé sur le front-end, mais que vous puissiez afficher la page d'archivage, les choses deviennent un peu compliquées.

Définir publicly_queryablesur falseou rewritesur falseempêchera l'affichage de la vue unique et de la vue archive. Il n'y a pas d'indicateur dans register_post_typeles arguments de fonction pour empêcher la création de règles de réécriture de vue unique.

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

Cependant, vous pouvez supprimer la balise de réécriture après avoir enregistré votre type de publication, ce qui laissera les règles de réécriture de la vue d'archive intactes, mais supprimera uniquement les règles de réécriture d'une seule vue.

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

Un autre avantage est que vous pouvez désormais créer de simples pages WordPress en utilisant une structure permalink ( event/simple-page) de type publication après type d’événement, ce qui peut être utile pour les sites Web complexes.

N'oubliez pas de vider les règles de réécriture après la modification du code.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.