存在しないURLから似た記事への推測転送だけを止めたい場合は、do_redirect_guess_404_permalinkフィルターを使います。redirect_canonical全体の解除は、URL正規化まで止めるため別の変更です。
先に転送元を調べる
ブラウザーの開発者ツールのネットワークで、最初のURL・HTTPステータス・Locationヘッダーと転送先を確認します。サーバー、CDN、プラグイン、WordPressのどこが転送しているかを分けてください。HTTPSとHTTP、wwwの有無などの設定が競合するループは、このコードだけでは直りません。
404の推測転送だけを止めるコード
WordPress 5.5以降が対象です。変更前のファイルを保存し、テスト環境の子テーマのfunctions.phpのPHP領域に次の1行を追加します。既存のPHP開始タグを重ねて書かないでください。親テーマを直接編集せず、PHP構文エラー時にファイルを戻せる手段を確保します。
add_filter( 'do_redirect_guess_404_permalink', '__return_false' );この設定はサイト全体の404推測転送を止めます。既存の正規化や、プラグイン・サーバーの転送をまとめて無効にするものではありません。WordPress公式のフィルター仕様を参照してください。
推測停止で変わるHTTP応答の実例
| 確認するもの | 確認・修正する場所 | 判断の目安 |
|---|---|---|
| 存在しない似たスラッグ・停止前 | 隔離環境のテスト用投稿に似たURLをGETで取得 | 301で投稿のURLへ転送し、その先は200 |
| 同じURL・停止後 | 掲載の1行をテスト時だけ読み込んで取得 | 転送せず404。Locationヘッダーは付かなかった |
| 実在する投稿 | 投稿の正しいURLを停止前・停止後に取得 | どちらも200。推測停止のために実在ページを404へ変えるコードではない |
| 解除後 | 次のリクエストで追加フィルターを読み込まず取得 | 再び301から200へ戻ることを確認 |
| HEAD / POST | 同じURLをHEADとPOSTで取得 | HEADは停止前301、停止後404。POSTは停止前でも404。WordPressのcanonical転送はGET/HEADが対象。この試験では転送ループそのものは再現していない |
2026年10月2日、WordPress 7.1.2の隔離環境で実DBの投稿を使い、WP_Queryで投稿・404の状態を作って標準のredirect_canonicalをHTTP経由で確認しました。通常のクエリー形式(/?p=投稿ID)のURLで検証しています。サーバー・CDN・他プラグインの転送や、全パーマリンク形式の試験ではありません。
調査では、転送元と転送先ごとにステータスとLocationを控えます。停止しても別URLへ転送する場合は別の処理が残っているため、さらにコードを追加する前に生成元を確認してください。
この1行はフィルターを登録したサイト全体の404推測に適用されます。特定ページだけのURL正規化を停止したい要件には、そのまま使いません。問題が出たら追加した1行を外し、同じURLで応答が戻ることを確認します。
変更後に確認するURLと戻し方
似たスラッグを持つ存在しないURL、実在する投稿、トップページ、既存の明示的な転送をそれぞれ確認します。推測転送を止めたURLが本当に404になるかは、ほかの転送設定も含めてHTTP応答で確認してください。追加した1行を外すと、このフィルターによる変更を戻せます。
以前の例には、引数を2つ受け取る関数に対してadd_filterの受け取り引数数を指定していない不備と、URL全体の部分一致で判定する問題がありました。その例は撤回しました。クエリー文字列に特定の語があるだけで転送停止の対象になる実装は使いません。
ローカルのWordPressでフィルターによる推測停止と解除後の復帰を確認しています。本番の転送設定は変更しておらず、読者のサイトで発生しているループを再現したものではありません。旧GitHub掲載例はこの更新と同期していないため、本ページのコードを使用してください。
関連する手順は、Redirectionの転送設定、WordPressのカスタマイズまとめも参照してください。
よくある質問:WordPressの404推測リダイレクトを止めるとき
404の「推測転送」とは、何ですか?
記事では、存在しないURLから、似た記事へ転送されることです。この推測転送だけを止めたい場合は、do_redirect_guess_404_permalinkフィルターを使います。WordPress 5.5以降が対象です。
redirect_canonical全体を解除してもよいですか?
別の変更です。記事では、redirect_canonical全体の解除は、URL正規化まで止めるため、推測転送だけを止める方法とは別の変更です。
コードは、どこに追加しますか?
記事では、変更前のファイルを保存し、テスト環境の子テーマのfunctions.phpのPHP領域に1行を追加します。既存のPHP開始タグを重ねて書かず、親テーマを直接編集せず、PHP構文エラー時にファイルを戻せる手段を確保します。
このコードは、特定のページだけに適用できますか?
適用できません。記事では、この設定はサイト全体の404推測転送を止めます。特定ページだけのURL正規化を停止したい要件には、そのまま使いません。また、既存の正規化や、プラグイン・サーバーの転送をまとめて無効にするものではありません。
転送のループが起きているときは、これで直りますか?
直りません。記事では、HTTPSとHTTP、wwwの有無などの設定が競合するループは、このコードだけでは直りません。先にブラウザーの開発者ツールのネットワークで、最初のURL・HTTPステータス・Locationヘッダーと転送先を確認し、サーバー、CDN、プラグイン、WordPressのどこが転送しているかを分けます。
推測転送を止めると、HTTP応答はどう変わりますか?
記事の隔離環境の確認では、似たスラッグの存在しないURLは、停止前は301で投稿のURLへ転送されその先は200でしたが、停止後は転送せず404で、Locationヘッダーは付きませんでした。実在する投稿は、停止前・停止後のどちらも200で、実在ページを404へ変えるコードではありません。
停止しても別のURLへ転送されるときは?
記事では、停止しても別URLへ転送する場合は別の処理が残っているため、さらにコードを追加する前に生成元を確認します。
変更したあと、何を確認しますか?
記事では、似たスラッグを持つ存在しないURL、実在する投稿、トップページ、既存の明示的な転送をそれぞれ確認します。問題が出たら追加した1行を外し、同じURLで応答が戻ることを確認します。なお、本番の転送設定は変更しておらず、読者のサイトで発生しているループを再現したものではありません。



