web-dev-qa-db-ja.com

'publicly_queryable' => falseがカスタムpost_typeに対して期待どおりに機能しない

以下の設定で登録したカスタムのpost_typeがあります。

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

私はどんなtattooer投稿にもURLが欲しくありません。 'publicly_queryable' => falseがこの仕事のためのツールであると私は理解しています。しかし、これをfalseに設定すると、単一のURLはまだアクティブです(例:/ tattooer/foobar /)が、ホームページにリダイレクトします。意図した振る舞いは404であるべきだと思う、それが私が欲しいものです。何が足りないの?

カスタムのpost_typeの登録を促進するために、すばらしい Piklistプラグイン を使用していますが、それなしでもテストしたところ、結果は同じです。

私の情報は ドキュメント および この非常によく似た質問に基づいています

3
emersonthis

アーカイブが欲しいが単数ビューは望まないのなら、'publicly_queryable'は役に立ちません。

あなたがそれを訪問したいのであれば、単数の投稿に404を送ってください...ちょうどそれをしてください。

'template_redirect'をフックして手動で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();
        }
    }
);

残念ながら、WPに force 404の機能はありません。手動で行う必要があります。

7
gmazzap