web-dev-qa-db-fra.com

'public_queryable' => false ne fonctionne pas comme prévu pour le post_type personnalisé

J'ai un post_type personnalisé que j'ai enregistré avec les paramètres suivants:

  'labels' => piklist('post_type_labels', 'Tattooer')
  ,'title' => __('Enter the name of the tattooer')
  ,'supports' => array(
    'title',
    'editor',
    'thumbnail',
    'page-attributes'
  )
  ,'public' => true
  ,'has_archive' => true
  ,'rewrite' => array(
    'slug' => 'tattooer'
  )
  ,'publicly_queryable' => false
  ,'capability_type' => 'post'
  ,'edit_columns' => array(
    'title' => __('Name')
  )
  ,'hide_meta_box' => array(
    'author'
  )

Je ne souhaite pas que des URL versent des articles tattooer uniques. Si j'ai bien compris, 'publicly_queryable' => false est l'outil idéal pour ce travail. Mais lorsque je le règle sur false, l'URL unique est toujours active (Ex:/tattooer/foobar /) mais redirige vers la page d'accueil. Je pense que le comportement souhaité est que ce soit un 404, ce que je veux. Qu'est-ce que je rate?

Notez que j'utilise le merveilleux plugin Piklist pour accélérer l'enregistrement de post_type (s) personnalisé (s), mais j'ai également testé sans lui et les résultats étaient les mêmes.

Mes informations sont basées sur la documentation et cette question très similaire .

3
emersonthis

Si vous voulez des archives, mais pas une vue unique, alors 'publicly_queryable' ne pourra pas vous aider.

Si vous voulez que visiter un poste singulier envoyer un 404 ... faites-le.

Vous pouvez accrocher 'template_redirect' et définir manuellement le 404:

add_action(
    'template_redirect',
    function () {
        if (is_singular('tattooer')) {
           global $wp_query;
           $wp_query->posts = [];
           $wp_query->post = null;
           $wp_query->set_404();
           status_header(404);
           nocache_headers();
        }
    }
);

Malheureusement, il n'y a pas de fonction dans WP à force 404, et vous devez le faire manuellement.

7
gmazzap