エラーページの場合にリダイレクト
functions.php
/*----------------------------------------------------
404 not found の場合、移したページだけ 301 リダイレクト
(それ以外は 404 のまま。消したページは 410 を返す)
----------------------------------------------------*/
if ( !function_exists( 'is404_redirect' ) ){
function is404_redirect() {
if ( !is_404() ) {
return;
}
// 今の URL のパス(クエリは除く)。日本語のパスも比べられるようにデコードし、末尾の / をそろえる
$path = wp_parse_url( $_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH );
if ( !is_string( $path ) ) {
return;
}
$path = trim( rawurldecode( $path ), '/' );
$path = ( $path === '' ) ? '/' : '/' . $path . '/';
// 移したページ:'古いパス' => '新しい URL'(1 対 1 で対応するページだけ書く)
$moved = array(
'/old-page/' => home_url( '/new-page/' ),
'/old-category/sample/' => home_url( '/archives/123' ),
);
if ( isset( $moved[ $path ] ) ) {
wp_safe_redirect( $moved[ $path ], 301 ); // 301 リダイレクト(恒久的に移した)
exit();
}
// 消したページ(もう戻さない):このパスで始まる URL は 410 Gone を返す
$gone = array(
'/campaign-2023/',
);
foreach ( $gone as $prefix ) {
if ( strpos( $path, $prefix ) === 0 ) {
status_header( 410 );
nocache_headers();
return; // 表示は 404 のテンプレート(404.php)のまま
}
}
// どちらにも当たらないものは 404 のまま(トップページへは送らない)
}
add_action( 'template_redirect', 'is404_redirect' );
}
移したページは $moved に「古いパス => 新しい URL」で書きます(1 対 1 で対応するページだけ)。もう戻さないページは $gone に書くと 410(Gone)を返し、検索結果から早めに外れます。どちらにも当たらないものは 404 のままにして、404 ページ(404.php)に検索フォームやトップへのリンクを置くと、訪れた人も迷いません。恒久的な移動には 302 ではなく 301 を使います。行き先が別のドメインのときは wp_safe_redirect では送れないので、allowed_redirect_hosts で許可するか wp_redirect を使います。


