Wordpressの自動補完リダイレクトを完全に停止する方法をまとめました。
自動補完リダイレクトとは、存在しないURLや曖昧なURL(スラッグ)を入れてアクセスしても404 Not Foundにはならず、自動で補完されて近しいスラッグのページに自動的にリダイレクトされる機能です。
検証したところ「推測リダイレクト」と「旧スラッグ情報を元にリダイレクト」という2種類があるようですが、両者の停止方法を分かりやすく解説します。
Wordpress5.5で実装された新しいコードを使います。WP6.2.2で検証済み!
この記事の目次
WordPressの自動補完リダイレクトを停止する
Wordpressの標準の機能の1つとして自動補完リダイレクトというものがあります。
例えば、公開ページのスラッグを「about-wordpress」と設定した
https://example.com/about-wordpress/
というURLの記事が存在した場合…
https://example.com/about-word/
上記のように「about-word」というスラッグでアクセスすれば普通は404 Not Foundが表示され、そんなURLのページは無い!と言われます。
が、Wordpressの場合は自動補完リダイレクトによって「about-wordpress」というスラッグのページに自動的にリダイレクトされます。
つまりWordpressでは1つのURLしか持たないはずの記事に、複数のURLでアクセスできる訳です。リダイレクトで最終的に着地するのが正規URLという感じです。
自動補完リダイレクトを停止する理由
自動補完リダイレクトは入力したURLにスペルミスがあった場合や、スラッグ変更時に生きる機能で、多くのサイトでは運営者の目線でも、サイトを利用するユーザーにとっても便利な処理だと言えます。
URLを少し間違えると補完してURLが存在するページに自動リダイレクトする…という気が利く機能で停止にはデメリットしかなさそうですが、メリットもあります。
今回、自動補完リダイレクトを停止する理由は以下2つです。
- URLが1文字でも違えば、それは存在しないページ(404)にしたい
- サーチコンソールで“ページにリダイレクトがあります”が多発する
URLを間違っているのに“そのURLに近い記事”にリダイレクトされてアクセスできるのは少し違和感があるのです。
また、自動補完リダイレクトが有効になっている状態だとGoogleサーチコンソールの除外ページで“ページにリダイレクトがあります”という項目のページ数が増えます。
個人的には自動補完リダイレクトは小さな親切大きなお世話な機能なのです。
自動補完リダイレクトは2種類存在する
実際に検証したところ、結構ややこしかったので先に整理しておきます。
Wordpressの自動補完リダイレクトには、実は2種類の処理方法があります。
- スラッグに前方一致する記事を見つけて補完リダイレクトする
- 過去のスラッグ情報を元に現在のスラッグに補完リダイレクトする
1つめはアクセスされるURLの文字列の前半部分が一致するスラッグの記事があればその記事にリダイレクトするという方法です。
2つめは過去に設定していたスラッグ情報を元に現在の記事にリダイレクトするという方法です。なお、先述のサーチコンソールの“ページにリダイレクトがあります”に引っかかるのは後者です。
伝わりにくいと思いますので、GIFを作りました。
では2つの自動補完リダイレクトをそれぞれ停止していきましょう・w・
前方一致の自動補完リダイレクトを停止する
まずスラッグの前方一致による補完リダイレクトを停止する方法です。
これが冒頭でも紹介したURLが曖昧で、途中までの入力であっても自動的に補完されて記事があればそのページにリダイレクトするという機能ですね。
百聞は一見に如かずという事でGIFです。
当サイトURL/seo/about
という公開ページは当サイトにはありません。
しかし"about"という文字列の前方一致による自動補完リダイレクト機能によって
当サイトURL/wordpress/about-indexing-private-articles/
という"about"からスラッグが始まる既存の公開ページが開きました。
URLが補完というよりは、もはや書き換えレベルに変わってますね…
この自動リダイレクトを停止します。
functions.phpにコードを追記する
自動補完リダイレクトについては遥か昔から無効化のコードがあり、色々なコードが出回っていますが、執筆時最新のコードをご紹介します。
Wordpress5.5以降で実装されたdo_redirect_guess_404_permalink
というフィルタを使ってfalse
を返してあげるだけでOKです。
子テーマなどのfunctions.phpに下記のコードを追記すればOKです。
//Wordpress自動補完リダイレクト停止(前方一致) add_filter( 'do_redirect_guess_404_permalink', '__return_false' );
Wordpress5.5以降はこちらのコード1行で済みます。
初心者の方でfunctions.phpが分からない方は関連記事(↓)をどうぞ。
動作確認
コードを保存したら、早速動作確認しましょう。
ポイント
キャッシュが残っていると反映されない可能性があります。
特にキャッシュプラグインを使っている方は一度OFFにして確認して下さい。
(筆者の環境ではブラウザキャッシュはクリアしなくても反映しました。)
当サイトURL/seo/about
先ほどと同じく、上記のURLにアクセスしてみます。
すると自動補完リダイレクトが停止され、無事に404ページが表示されていることが分かります。
なお今回使用したコードについては以下に説明があります。
関連するコード、古いコードについて
前方一致による補完リダイレクトについては上記のコード1行でOKです。
しかし、似たようなコードが複数ありますので補足しておきます。
(※ややこしくなるので省略気味に書きます。)
注意ポイント
これらのコードは基本使いません。分からない方は飛ばして下さい。
何らかの理由で使いたい方は適宜コメントアウトを外して下さい。
strict_redirect_guess_404_permalink
というフィルタも使えるようです。
//strict_redirect_guess_404_permalinkを使うコード //↓return_trueで完全一致比較、falseでlikeクエリ実行。初期値:false add_filter( 'strict_redirect_guess_404_permalink', '__return_true' );
ただ先ほど紹介したdo_redirect_guess_404_permalink
を使えば推測リダイレクト機能自体を無効化できるのでそちらのコードの方が良いでしょう。
外部リンク
他にもredirect_canonical
を使うのもありますが、Wordpress2.3で実装されたものですので今使う必要はありません。
以下のコードはよく見ますが、もう古いので使わないようにしましょう。
//今となっては古いコード(結構よく見る) function remove_redirect_guess_404_permalink( $redirect_url ) { if ( is_404() ) return false; return $redirect_url; } add_filter( 'redirect_canonical', 'remove_redirect_guess_404_permalink' );
また以下のようなコードも見かけますが、非推奨です。
//こちらは非推奨!(リダイレクトを担う関数自体を無効化する方法) //remove_action('template_redirect', 'redirect_canonical');
ポイント
いずれにしても、Wordpress5.5以降の現在の環境では先述のコード1行で対応できますのでそちらを使って下さい。
外部リンク
【参考:redirect_canonicalについて】
redirect_canonical() | Function | WordPress Developer Resources
旧スラッグからの補完リダイレクトを停止する
続いて、旧スラッグ情報から補完される自動リダイレクトを停止する方法です。
Wordpressではスラッグの変更時に、変更前のスラッグがデータベース内に保存されており、この旧スラッグからも自動リダイレクトの補完が行われるようです。
この機能によってサーチコンソールで“ページにリダイレクトがあります”という除外ページが量産されてしまいます。
実際の挙動ですが、こちらもGIFを作りました。
変更前の旧スラッグのURLである
当サイトURL/seo/about-hyperlink-color/
にアクセスしたところ
当サイトURL/seo/hyperlink-color/
という現在のスラッグに自動補完リダイレクトされます。
このような挙動なので、サーチコンソールでは「/about-hyperlink-color/」というURLでリダイレクトがあります。という検査結果になります。
もっとも正規URLはリダイレクト先の「/hyperlink-color/」なので問題はないのですが、自分でリダイレクトを設定したページが分かりにくいので、これも停止します。
functions.phpにコードを追記する
こちらもfuncitons.phpに以下のコードを追記すれば停止できます。
//旧スラッグからの自動補完リダイレクトを停止 remove_action( 'template_redirect', 'wp_old_slug_redirect' );
wp_old_slug_redirect
という関数は、古いスラッグから現在のスラッグを見つけようとする関数ですが、この機能をテンプレートの読み込み時に無効化する感じです。
Wordpress2.1の時に実装されたようですが、多分今もまだ現役なはず…
動作確認
コードを保存したら動作確認しましょう。
こちらもキャッシュクリア、キャッシュ無しの環境で行うのが良いです。
当サイトURL/seo/about-hyperlink-color/
先ほどと同じURLにアクセスしたところ、そんなページないよ!と404ページが無事に表示されました。
旧スラッグの保存場所は_wp_old_data
この項目の前半で、変更前の旧スラッグ情報はWordpressのデータベース内に保存されていると言いましたが、具体的には以下の場所に保存されています。
Wordpress用データベース > wp_postmetaテーブル > _wp_old_slugレコード
この中にある情報と現在のスラッグを照らし合わせて、自動補完リダイレクトの処理を行っているようです。なので先ほどのコードを使わなくても、該当レコードを削除しても自動リダイレクトが停止できるはずです。
_wp_old_slugレコード内の旧スラッグ情報は、phpMyAdminを使うか、WordPressなら「Slugs Manager」というプラグインを使っても削除できます。(↓)
-
- 【WordPress】投稿の古いスラッグを削除するプラグイン「Slugs Manager」の使い方。
続きを見る
自動補完リダイレクト停止用のコードまとめ
長くなったので必要なコードをまとめておきます。
functions.phpに以下のコードを追加すれば、前方一致による推測リダイレクト。
および旧スラッグからの自動リダイレクトを全て停止することができます。
//前方一致による自動補完リダイレクトを停止 add_filter( 'do_redirect_guess_404_permalink', '__return_false' ); //旧スラッグからの自動補完リダイレクトを停止 remove_action( 'template_redirect', 'wp_old_slug_redirect' );
Wordpress5.5以降ならコードはこれだけ!
やっていることは複雑ですが、フィルターが使えるので簡単ですね・w・
これらの方法でWordPressの自動補完リダイレクトを停止できますが、実はもう1つカテゴリーのスラッグ部分にも自動リダイレクトの機能があります。
カテゴリーの自動リダイレクトについて
これは該当するサイトと、該当しないサイトがあるので最後にしました。
この内容はパーマリンク設定にカテゴリー名(/%category%)を使っているサイト、つまり投稿などのURLにカテゴリー名が入るサイトが対象になります。
WordPressにはここまで紹介してきた
- URL前方一致による自動補完リダイレクト
- 旧スラッグ情報を元にした自動補完リダイレクト
の他にもう1つ、
- カテゴリースラッグ部分の自動リダイレクト
というよく似た機能があります。
これは、投稿のカテゴリーを変更した後で「旧カテゴリー→新カテゴリー」へと問題なくアクセスできるようにする為に設定されるリダイレクトです。
コチラについては長くなるので別記事(↓)にしました。
ややこしいですが、該当する方は1度お読みいただければと思います。
まとめ
以上、Wordpressの自動補完リダイレクトを完全停止する方法でした。
便利な機能ではあるのですが、今時URLを手入力することもなく、シェア時もコピペなので個人的には勝手に補完する必要はないと思います。
厄介なのは.htaccess等で本当にリダイレクト設定しているページをサーチコンソールで確認しにくくなる点でしょうか。
最後に、自動補完リダイレクト停止によるSEOについての影響は不明です。
が、そもそも正規URLとして指定していない時点でリダイレクト元の曖昧なURLにはそれほど意味はないと思います。検索結果に表示されるのもシェアされるのも正規URLのはずなのでそれほど影響は無いでしょう。