WordPressで投稿ページを非公開にすると404エラーが表示されて困ったことはありませんか?
例えば、求人情報サイトや不動産物件サイトなどで、掲載情報が終了して詳細ページを非公開にすると、WordPressのデフォルト設定では404エラーとなってしまいます。
再訪した人が404エラーを見ると、URLを間違えたかな?あの情報どうなったのかな?など訪問者に誤解や混乱を与えてしまいます。
404エラーではなく掲載終了ページを表示することで、訪問者により分かりやすく、親切な体験を提供することができます。
今回この記事では、ページを非公開化した際の404エラーを適切なページ(掲載終了ページ)にリダイレクトする方法を解説していきます。
この設定を行うことで不用意な404エラー表示を回避し、サイトの信頼性とユーザー満足度を向上させることが可能になります。
以下のコードをfunctions.php
に記述することで、特定の条件を満たす非公開ページを自動的にリダイレクトできます。
function redirect_private_page_404() {
if (is_404() && strpos($_SERVER['REQUEST_URI'], '/detail/') !== false) {
wp_redirect(home_url('/close-page/'));
exit;
}
}
add_action('template_redirect', 'redirect_private_page_404');
それぞれ一行ずつ処理を見ていきます。
function redirect_private_page_404() {
redirect_private_page_404という名前の関数を定義し、特定の条件下でリダイレクト処理を実行。
if (is_404() && strpos($_SERVER['REQUEST_URI'], '/detail/') !== false) {
条件分岐のif文の開始
is_404()
・・・404エラーページであるかどうかをチェックし、404エラーページの場合trueを返す。
$_SERVER['REQUEST_URI']
・・・現在のページのURLを取得するスーパーグローバル変数
strpos($_SERVER['REQUEST_URI'], '/detail/')
・・・$_SERVER[‘REQUEST_URI’]の中に/detail/という文字列が含まれているかチェックする関数。文字列が含まれている場合、その文字列の開始位置(0以上の整数)を返し、含まれていない場合falseを返す。
!== false
・・・strpos()の結果がfalseでないかどうかをチェック(=URLに/detail/が含まれているかどうかのチェック)
&&
・・・AND演算子で、両方の条件がtrueの場合にif文の中の処理が実行される。(=「現在のページが404エラー」かつ「URLに/detail/が含まれている」場合、次の行の処理が実行される。)
wp_redirect(home_url('/close-page/'));
関数wp_redirect()を使用して、指定されたURLにリダイレクト。(※このままでは302での転送。301での転送は下記参照)
home_url('/close-page/')
・・・関数home_url()を使用して、サイトのホームURLに/close-page/を付け加えたURLを生成します。
exit;
exitステートメントでスクリプトの実行を終了し、リダイレクト後、不要な処理が実行されるのを防ぐ。
}
if文の終わり
add_action('template_redirect', 'redirect_private_page_404');
関数add_action()を使用して、redirect_private_page_404関数をtemplate_redirectアクションフックに登録。template_redirectアクションフックは、WordPressがテンプレートを読み込む前に実行されるアクションなので、WordPressがページを表示する前にredirect_private_page_404関数が実行され、条件に一致する場合にリダイレクト処理が行われる。
301での転送方法(推奨)
上記の設定では302での転送になってしまうので、301で転送したい場合、以下のようにwp_redirect()
関数の第2引数に、HTTPステータスコード301を指定することで、301リダイレクトに変更できます。
function redirect_private_page_404() {
if (is_404() && strpos($_SERVER['REQUEST_URI'], '/detail/') !== false) {
wp_redirect(home_url('/close-page/'), 301);
exit;
}
}
add_action('template_redirect', 'redirect_private_page_404');