WordPressでカスタム投稿タイプを作成すると、通常はシングルページ(個別の投稿ページ)が自動的にアクセスできる状態になります。一覧表示専用にしたいなど、シングルページを生成したくない場合の確実な方法を解説します。
この記事でわかること
publicly_queryable => falseによる確実な無効化(推奨)has_archiveはシングルページには影響しないという重要な違い- 能動的にブロックしたい場合の正しい404の返し方
最も確実な方法:publicly_queryableをfalseにする(推奨)
register_post_type() の publicly_queryable をfalse に設定します。
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コア(
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_queryableをfalseに設定します。has_archive => falseと合わせて設定することで、シングルページ・アーカイブとも無効にできます。has_archiveだけではシングルページは防げません。QシングルページのURLにアクセスしたら別のページにリダイレクトするには?
A
template_redirectアクションフックでis_singular('custom_type')を確認し、wp_safe_redirect()で任意のURLにリダイレクトします。404として扱いたい場合はリダイレクトでなく$wp_query->set_404()を使ってください。Qカスタム投稿タイプを一覧表示専用で使いたい場合の推奨設定は?
A
publicly_queryable = false、show_in_nav_menus = false、has_archive = falseを設定し、WP_Queryで管理画面や特定のテンプレートからのみデータを取得する構成が一般的です。まとめ
- 推奨:
publicly_queryable => falseで確実に無効化 - 注意:
has_archiveはアーカイブ専用でシングルページには無効 - 能動的にブロックする場合:
$wp_query->set_404()でソフト404を避ける
「アーカイブを消したいのか」「シングルページを消したいのか」を区別し、適切な設定項目を選んでください。

