WordPressサイトに限らず、大前提として404にならないようにすることがベストです。
内部リンク、被リンク、検索エンジン等からリンクしているページは、正しく閲覧できる、または代替ページにリダイレクトしていることが好ましいです。
が、なんらかの事情により404が発生しており、404ページを表示するよりもトップページや固定ページにリダイレクトしたい場合のやり方を紹介します。
トップページにリダイレクトする場合
以下のソースをfunction.php
に記載すればOKです。
add_action( 'template_redirect', 'is404_redirect' ); function is404_redirect() { if ( is_404() ) { wp_safe_redirect( home_url( '/' ), 301 ); exit(); } }
これで、404ページに遷移するアクセスは全て、トップページにリダイレクトされます。
wp_safe_redirect
の第一引数でリダイレクト先のURL、第二引数でHTTP レスポンスステータスコードを設定しています。
トップページでなく、固定ページへリダイレクトさせたい場合
第一引数を変えることで、トップページ以外にもリダイレクトさせることができます。
例えば、リダイレクト先を固定ページにする際は以下の様に記載します。
add_action( 'template_redirect', 'is404_redirect' ); function is404_redirect() { if ( is_404() ) { wp_safe_redirect( get_permalink( get_page_by_path( '固定ページのスラッグ' ) ), 301 ); exit(); } }
HTTP レスポンスステータスコードってなんぞや
wp_safe_redirect
の第二引数で設定している数値です。
これは、HTTPリクエストが正常に完了したどうかを示すもので、簡単に言うとロボットへの結果報告です。
「今見ようとしたページはリダイレクトでした!」という結果報告のためには、主に以下2つのステータスコードを使います。
301 Moved Permanently
リクエストされたリソースの URL が永遠に変更されたことを示します。レスポンスで新しい URL が与えられます。302 Found
このレスポンスコードは、リクエストされたリソースの URI が一時的に変更されたことを示します。 URI は将来、さらに変更される可能性があります。従って、クライアントは将来のリクエストでも同じ URI を使用するべきです。
つまり、301は「旧URLは復活することはなく、この先はずっとこの新URLでやっていきます。」という宣言であり、302は「今だけはリダイレクトしてるけど、そのうち旧URLでの公開を再開します。」という具合です。
リニューアルにより、大量にページを削除した場合など
サイトのリニューアルなどにより、ページ(コンテンツ)を削除し、代替ページもなければ、404ページを表示するのが自然の流れです。
この場合、404ページには「お探しのページは無くなりましたよ」というメッセージも含まれます。
これにより、閲覧者はページが既にお無くなりになったことを知ることができます。
上記の認知の為にも、トップページへ一括リダイレクトさせるのではなく、代替ページを作りご案内するのが閲覧者にとって最も親切です。
「あなたが探しているコンテンツはなくなりました。代わりに○○はどうでしょう。」のような内容の固定ページへリダイレクトすれば、ユーザーは困惑することなく新たな選択肢から目的を達成できるかもしれません。
参考:
https://wpdocs.osdn.jp/関数リファレンス/wp_safe_redirect
https://www.nxworld.net/wordpress/wp-is404-redirect-other-page.html