WordPressでカテゴリーの自動リダイレクトを停止する方法です。
サーチコンソールで“ページにリダイレクトがあります”という未登録のページが増えていたので確認したところ、変更前のカテゴリーから変更後のカテゴリーに対して自動リダイレクトが効いているようです...。
これはWordPressの仕様ですが、過去に行った自動補完リダイレクトの停止ではカテゴリー部分まで対応できていなかったようなので、今回対処しました。
アクセスされたURLが現在のカテゴリーと異なる場合に404を返す方法です。
この記事の目次
WordPressのカテゴリーの自動リダイレクトを停止する
はじめに...当記事はWordPressのパーマリンク設定でカテゴリー名(/%category%)を使っている場合、つまりページURLにカテゴリー名が入っている方向けです。
WordPressの仕様上、このような設定だと後から投稿のカテゴリーを変更した際に、旧カテゴリーが含まれるURLにアクセスしても404とはならず、新しいカテゴリーURLの方に自動でリダイレクトされるようです。
このリダイレクトを停止する方法についてです。では早速参りましょう・w・
サーチコンソールで“ページにリダイレクトがあります”が増加
WordPressを使っていると、とにかくサーチコンソールの未登録ページが増えます。
内容は「ページにリダイレクトがあります」という項目で、主な原因はWordPressの自動補完リダイレクト機能によるものです。
関連記事
自動補完リダイレクトについて詳しくはコチラ(↓)
Wordpressの自動補完リダイレクトを完全に停止する方法。
自動補完リダイレクトについて詳しくは関連記事も参照していただきたいのですが、当サイトは既にこの自動補完リダイレクト(2種類)をfunctions.phpで停止済です。
にも関わらず、依然としてサーチコンソールで“ページにリダイレクトがあります”が80ページも残っていました。次は何が原因??
カテゴリー変更後にリダイレクトが発生する
早速サーチコンソールでリダイレクトがあるページを確認します。
するとリダイレクトが設定されているページのほとんどが、旧カテゴリーのスラッグが含まれるページであることが判明しました。
当サイトにはすでに「SEO」というカテゴリーは存在しないのですが...
当サイトURL/seo/pc-font-size-responsive-websites/
というURLにアクセスすると
当サイトURL/make-website/pc-font-size-responsive-websites/
という新しい現在のカテゴリーに自動でリダイレクトされます。
分かりやすくするために、その時の様子をGIFにしたものが以下です。
このように公開した投稿のカテゴリーを後から変更すると、変更前のカテゴリーから変更後のカテゴリーに自動的にリダイレクトが発生してしまっています...。
どうやらWordPressには、
- URL前方一致の自動補完リダイレクト
- 旧スラッグ情報を元にした自動補完リダイレクト
の他にもう1つ、
- 変更前のカテゴリーから変更後のカテゴリーのURLへと補完するリダイレクト
という合計3種類の自動リダイレクトが存在する様子です。
当サイトは完全一致しないURLは全て404にしたいので、これも停止させたい...。
カテゴリーの自動リダイレクトを停止する方法
早速WordPressで、カテゴリーの自動リダイレクトを停止する方法を模索しました。
過去に補完リダイレクトを停止した時のようにdo_redirect_guess_404_permalink
フックや、wp_old_slug_redirect
関数のようなものを上手く使って、カテゴリーの自動リダイレクトを停止する方法があるはずだと予想したのですが...なさそうです。
困り果てていた時、WordPressのサポートサイトに全く同じ質問があるのを発見!
外部リンク
WordPressサポートにある回答を見る限り、やはりWordPress6.0時点でもカテゴリーの自動リダイレクトを制御するフックや関数は用意されていない様子です。
しかし、質問の回答で対処法となるコードを公開して下さっていました!!
functions.phpにコードを追記する
今回はありがたく回答にあったコードを使わせていただきました。
追記
後日RSS用のfeedページ「URL/feed」にもリダイレクトが効かず、404になってしまうことが判明したため、コードにis_feed()の条件分岐を足しました。
「.htaccess」を使う方法も考えましたが、この方がシンプルかつ合理的です。
functions.phpに以下を追加することで、カテゴリーの自動リダイレクトを停止することが出来ます。
//カテゴリーの自動補完リダイレクト停止 function disable_category_redirect_canonical( $redirect_url, $requested_url ) { global $wp_rewrite, $wp_query; if ( $redirect_url !== $requested_url ) { if ( is_single() && !is_feed() && strpos( $wp_rewrite->permalink_structure, '%category%' ) !== false ) { $category_name = get_query_var( 'category_name' ); if ( $category_name ) { $the_category = get_the_category(); if ( ! array_search( $category_name, array_column( $the_category, 'slug' ) ) ) { status_header( 404 ); nocache_headers(); $wp_query->set_404(); return false; } } } } return $redirect_url; } add_filter( 'redirect_canonical', 'disable_category_redirect_canonical', 10, 2 );
$wp_rewrite
と$wp_query
を使うことで見事にアクセスしたページのカテゴリーが現在のカテゴリーと異なる場合に、404ステータスを出し、キャッシュをキャンセルしつつ、404ページを呼び出すという処理を行っています。すばらしい!
コードはサンプルで使用は自己責任とのことですが上手くできていますねぇ・w・
これなら問題なくカテゴリーの自動リダイレクトを停止することができそうです!
関連記事
functions.phpが分からない方はこちらもご参考に
Wordpressのfunctions.phpとは?場所と編集方法、コードの書き方を初心者向けに解説します。
コード追記後の動作確認
コードをfunctions.phpに追記したら、さっそく動作確認してみます。
ブラウザのキャッシュを削除し、リダイレクトがあった旧カテゴリーが含まれるURLにアクセスしてみましょう。
カテゴリー部分が書き換えられてリダイレクトされることなく、404(Not Found)のページが無事に出ました!
動作確認時の注意点として、ブラウザにリダイレクトの記録が残っているとコードを追記してもリダイレクトが解消されません。つまりブラウザのキャッシュ(Cookie)を削除してからでないと404にならないということです。
Chromeなら「キャッシュされた画像とファイル」か「Cookieと他のサイトデータ」を削除しないとリダイレクトされ続けてしまいました。
この辺がややこしいなら他のブラウザで試すか、後述するサーチコンソールから確認すればOKです。
サーチコンソールでリダイレクトが検出されないか確認する
最後に肝心のサーチコンソールの方でも、リダイレクトが検出されないか確認です。
“ページにリダイレクトがあります”が発生していた旧カテゴリーが含まれるページをサーチコンソールで検証し、インデックスの「再リクエスト」を行ってみます。
作業が上手くいっていればここで、インデックス登録リクエストが失敗します。
404なのでインデックスできませんよ!ということですね・w・やったー!
これでWordPressのカテゴリーの自動リダイレクトによる問題が解決!
最後にサーチコンソールで修正報告を行う
最後の仕上げとして、サーチコンソールの“ページにリダイレクトがあります”が出るページで「修正を検証」ボタンを押しておきましょう。
「修正を検証」ボタンを押して、検証:開始になればOK!
別にこの作業はやらなくても、検索エンジンのクローラーが回ってきた時点で、徐々に“ページにリダイレクトがあります”のページは減っていくはずです...
が、少しでも早く検知・反映してほしいならやっておいて損はないでしょう。
まとめ
以上、WordPressのカテゴリーの自動リダイレクトを停止する方法でした。
普通ならリダイレクトがあるページなんてURLに「www」が付いたトップページくらいかと思うのですが、WordPressの場合は3種類の自動リダイレクト機能があるせいでリダイレクトが設定されたページがやたらと増えてしまいます。面倒すぎ!!
今様子見中ですが、これでやっとサーチコンソールでのページにリダイレクトがあります地獄から解放されるかな?ではではこのへんで・w・