【WordPress】カスタム投稿のシングルページを生成しない方法|publicly_queryableが正解

WordPressでカスタム投稿タイプを作成すると、通常はシングルページ(個別の投稿ページ)が自動的にアクセスできる状態になります。一覧表示専用にしたいなど、シングルページを生成したくない場合の確実な方法を解説します。

この記事でわかること

  • publicly_queryable => false による確実な無効化(推奨)
  • has_archive はシングルページには影響しないという重要な違い
  • 能動的にブロックしたい場合の正しい404の返し方
スポンサーリンク

最も確実な方法:publicly_queryableをfalseにする(推奨)

register_post_type()publicly_queryablefalse に設定します。

functions.php:シングルページ・アーカイブとも無効化
function my_custom_post_type() {
    $args = array(
        'label'              => 'Custom Post',
        'public'             => true,
        'publicly_queryable' => false, // フロントエンドから個別にクエリできないようにする
        'has_archive'        => false,
    );
    register_post_type( 'custom_post', $args );
}
add_action( 'init', 'my_custom_post_type' );
なぜこれで確実に404になるのか
本番WPコア(WP::parse_request())を確認したところ、WordPressはリクエストを解析する際にpublicly_queryable => true の投稿タイプ以外をクエリ変数から除外する処理を行っています。そのため publicly_queryable => false のカスタム投稿タイプへのURLは、どんなパーマリンク構造であっても該当する投稿が見つからず、自然に本物の404になります。管理画面からは通常どおり編集・一覧表示ができ、フロントエンドの個別URLだけが無効になります。

has_archiveとの違いに注意

has_archiveはアーカイブ(一覧)専用の設定
has_archive => false は、アーカイブページ(一覧ページ)の生成を無効にするだけで、個別のシングルページには一切影響しませんhas_archive => false だけを設定しても、個々のカスタム投稿は通常どおりパーマリンクでアクセスできてしまいます。シングルページを防ぎたい場合は、必ず publicly_queryable を使ってください。

それでもtemplate_redirectで能動的にブロックしたい場合

投稿タイプ全体ではなく、特定の条件の投稿だけを個別にブロックしたい場合はtemplate_redirect フックを使います。ただし、単純に別URLへリダイレクトしたり404風のテンプレートを表示したりするだけでは実際のHTTPステータスコードが200のままになる「ソフト404」になってしまいます。$wp_query->set_404() を使って、正しく404として扱われるようにします。

functions.php:正しく404として応答する
function redirect_custom_post_type_singles() {
    if ( is_singular( 'custom_post' ) ) {
        global $wp_query;

        $wp_query->set_404();
        status_header( 404 );
        nocache_headers();
        include( get_query_template( '404' ) );
        exit;
    }
}
add_action( 'template_redirect', 'redirect_custom_post_type_singles' );
「ソフト404」を避ける
wp_redirect(home_url('/404')) のように存在しないURLへリダイレクトするだけの実装や、get_template_part('404') で404風の見た目だけ表示する実装は、実際のHTTPステータスコードが200のままになりがちです。これは検索エンジンから見ると「存在しないはずのページが200で返ってくる」ソフト404と呼ばれる状態で、Google Search Consoleでも問題として検出されます。$wp_query->set_404()status_header(404) を組み合わせることで、見た目だけでなく実際のステータスコードも正しく404にできます。

関連するカスタム投稿タイプの実装

カスタム投稿タイプの登録全般(show_in_rest・has_archive・labelsなど)についてはカスタム投稿タイプを追加する方法で解説しています。

よくある質問(FAQ)

Qカスタム投稿タイプに単一ページ(single)を作らないようにするには?
Aregister_post_type()のpublicly_queryablefalseに設定します。has_archive => falseと合わせて設定することで、シングルページ・アーカイブとも無効にできます。has_archiveだけではシングルページは防げません。
QシングルページのURLにアクセスしたら別のページにリダイレクトするには?
Atemplate_redirectアクションフックでis_singular('custom_type')を確認し、wp_safe_redirect()で任意のURLにリダイレクトします。404として扱いたい場合はリダイレクトでなく$wp_query->set_404()を使ってください。
Qカスタム投稿タイプを一覧表示専用で使いたい場合の推奨設定は?
Apublicly_queryable = falseshow_in_nav_menus = falsehas_archive = falseを設定し、WP_Queryで管理画面や特定のテンプレートからのみデータを取得する構成が一般的です。

まとめ

  • 推奨publicly_queryable => falseで確実に無効化
  • 注意has_archiveはアーカイブ専用でシングルページには無効
  • 能動的にブロックする場合$wp_query->set_404()でソフト404を避ける

「アーカイブを消したいのか」「シングルページを消したいのか」を区別し、適切な設定項目を選んでください。