特定のページや投稿へのアクセスを制限したい場面は、ウェブサイト運営で時折発生するでしょう。例えば、テスト中のページや期間限定公開を終了したコンテンツ、あるいは特定の条件を満たしたユーザーにのみ見せたいページなどが該当します。
WordPressでは、そのページにアクセスされた際に、意図的に404 Not Foundエラーページを返すという設定が可能です。これにより、コンテンツを物理的に削除することなく、検索エンジンや一般ユーザーからのアクセスを効果的に遮断できます。
この記事では、Webデザイナーとして知っておくべき、2025年現在でも有効な、特定のページを404として処理する最も確実なPHPコードと、その設定方法を詳しく解説します。
なぜ特定のページを意図的に404にする必要があるのか?
コンテンツを非公開にするだけなら、WordPressの投稿ステータスを「下書き」や「非公開」に変更すれば済む話です。しかし、それでは特定のURL自体が存在しないという状態にはなりません。意図的に404を返す目的は、主に以下の2点に集約されます。
①検索エンジンへの正確な伝達(SEO対策)
ページステータスを「非公開」にした場合、ログインしたユーザーには見えますが、ログアウト状態のクローラーや一般ユーザーにはアクセスできず、サーバーは404ではない別のステータスコード(例: 403 Forbidden や 302 Found)を返すことがあります。完全に「このURLはもう存在しない」と検索エンジンに伝え、インデックスから速やかに削除を促すには、明確な404 Not Found(または410 Gone)ステータスを返すことが最も効果的です。
②ユーザー体験の向上
非公開ページに誤ってアクセスしたユーザーに対し、意味不明なエラー画面ではなく、サイトのデザインに沿ったカスタム404ページを表示し、サイト内の別の有用なコンテンツへ誘導することが可能です。特定ページへのアクセスを404にする実装コード(2025年版)
最も信頼性が高く、WordPressの処理フローを尊重した実装方法は、template_redirectアクションフックを利用することです。これにより、WordPressがページを読み込み始める直前のタイミングで処理を割り込ませることができます。
functions.phpに追加するコード
使用中のテーマ、または子テーマのfunctions.phpファイル末尾に、以下のコードスニペットを追記してください。|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 特定のページIDまたはスラッグのアクセスを404 Not Foundとして処理する function webantena_return_status404_for_specific_pages() { // ターゲットとするページを定義(IDまたはスラッグで指定可能) // IDは管理画面のURLや一覧画面で確認できます。 $target_pages = array( '2', // IDが '2' の固定ページ(例: サンプルページ) 'old-campaign', // スラッグが 'old-campaign' の固定ページまたは投稿 'test-post-id-10', // 投稿IDやカスタム投稿タイプも指定可能 ); // 条件判定: ターゲットリストのいずれかのページにアクセスされた場合 if ( is_page( $target_pages ) || is_single( $target_pages ) ) { // グローバル変数 $wp_query に404ステータスを設定 global $wp_query; $wp_query->set_404(); // HTTPヘッダーに404ステータスを送信 status_header( 404 ); // これ以降の通常のテンプレート読み込み処理を中断し、404テンプレートを強制読み込み // ※ is_404() が true になるため、WordPressは自動で 404.php を探しに行きます return; } } add_action( 'template_redirect', 'webantena_return_status404_for_specific_pages' ); |
コードの解説
| 関数/変数 | 役割と動作 |
|---|---|
is_page() / is_single() |
ユーザーがアクセスしているページが、引数で指定したIDまたはスラッグに該当するかを判定します。固定ページならis_page()、投稿ならis_single()を使用するのが一般的でしょう。 |
$target_pages |
制御したいページのIDやスラッグを格納する配列です。複数ページに対応させるために配列形式がベストです。 |
$wp_query->set_404() |
WordPressのメインクエリオブジェクトに対し、「これは404エラーである」というフラグを設定します。これにより、is_404()関数がtrueを返します。 |
status_header( 404 ) |
ユーザーのブラウザおよび検索エンジンのクローラーに対して、HTTPステータスコード 404 Not Foundを送信します。この処理が最も重要で、検索エンジンのインデックス登録を抑制する主たる機能です。 |
add_action( 'template_redirect', ... ) |
テンプレートを読み込む直前に、このカスタム関数を実行させるフックです。このタイミングが最も処理の割り込みに適しています。 |
コード中の$target_pages配列を、必ずあなたの環境のページIDやスラッグに置き換えて使用してくださいね。
実行後の確認と検証作業
コードを追加したら、必ず以下の手順で意図通りに動作しているかを確認しましょう。動作確認
①ブラウザでアクセス: 制御対象のURLにアクセスし、カスタム404ページのデザインが表示されるかを確認します。表示されれば第一段階はクリアです。②別のURLで確認: 制御対象外のページ(例: トップページや別の固定ページ)にアクセスし、問題なく表示されることを確認します。予期せぬ巻き込みエラーがないかをチェックしましょう。
ステータスコードの検証
最も肝心なのは、ブラウザ上で表示される見た目ではなく、サーバーが返しているHTTPステータスコードの確認です。Google Search Console(GSC)のURL検査ツールを使うか、ブラウザの開発者ツール(Chrome DevToolsなど)を開き、
Networkタブでリロードして、該当URLのレスポンスヘッダーを確認してください。レスポンスヘッダーのStatus Codeが404 Not Foundであることを確認できれば、実装は完璧に成功です。


コメント