WordPressページで404 not foundの場合にトップページにリダイレクトを行う

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

パーマリンクを変えたリニューアルなどで古い URL が 404 になるとき、移したページだけを新しい URL へ 301 リダイレクトし、それ以外は 404(消したページは 410)を返すカスタマイズ。404 をまとめてトップページへ飛ばすと、Google はそのページを「ソフト 404」として扱い、古い URL の評価も新しいページへ引き継がれないため、おすすめしません。

エラーページの場合にリダイレクト

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 を使います。

WordPress Developer Resources

関連機能

  1. 見る人が少ない WordPress で予約投稿が遅れる:サーバーの cron で WP-Cron を動かしてそろえる

  2. XAMPP の phpMyAdmin で「Maximum execution time of 300 seconds」が出るときの直し方:config.inc.php と php.ini(phpMyA…

  3. WordPress 6.7 アップデートしたらWelcart プラグインの動作がおかしくなった

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP