【WordPress】URL構造を /post_id/ から /category/post_id/ へリダイレクトする方法

WordPressを運営していると、途中でパーマリンク構造を変更したくなることがあります。
例えば、最初はシンプルに「/%post_id%/」で運用していたけれど、記事が増えるにつれて「カテゴリ」もURLに入れた方が整理しやすい…というケースです。

今回は、旧URL /post_id/ を新URL /category/post_id/ へリダイレクトする方法を解説します。


1. リダイレクトが必要な理由

パーマリンクを変えると、当然ながら過去に公開した記事のURLも変わってしまいます。
もし旧URLにアクセスがあった場合、そのままでは「404エラー」になってしまい、SEOにも悪影響です。

そこで「301リダイレクト」を設定して、旧URLから新URLへ自動転送してあげる必要があります。
これにより、検索エンジンにも「恒久的にURLが変わった」と伝えられます。


2. .htaccessでの設定(Apache環境)

もっともシンプルなのが、.htaccess にルールを書く方法です。

RewriteEngine On

# /12345/ → /カテゴリ/12345/
RewriteRule ^([0-9]+)/?$ /カテゴリ/$1/ [R=301,L]

これで「https://example.com/12345/」へアクセスがあった場合、自動的に「https://example.com/カテゴリ/12345/」へ転送されます。


3. Nginxでの設定

サーバーがNginxの場合はこちら。

location ~ ^/([0-9]+)/?$ {
    return 301 /カテゴリ/$1/;
}

4. WordPressのfunctions.phpで処理する方法

サーバーの設定を触れない場合は、WordPressのテーマ(または子テーマ)のfunctions.phpに書くこともできます。

add_action('template_redirect', function() {
    $request_uri = $_SERVER['REQUEST_URI'];

    // /数字/ → /カテゴリ/数字/ へ転送
    if (preg_match('#^/([0-9]+)/?$#', $request_uri, $m)) {
        wp_redirect(home_url("/カテゴリ/{$m[1]}/"), 301);
        exit;
    }
});

5. 固定カテゴリか、動的カテゴリか?

ここで注意したいのは「カテゴリ部分」をどう扱うか。

  • 固定で /カテゴリ/ にする場合 → 上記の方法でOK。
  • 記事ごとに違うカテゴリを反映させたい場合get_the_category() を使って記事IDからカテゴリを取得し、リダイレクト先を動的に生成する必要があります。

まとめ

  • パーマリンクを変えたら必ずリダイレクト設定が必要
  • .htaccess or functions.php で301リダイレクトを設定
  • SEOのためにも「301」で恒久的に転送するのがベスト

これで、旧URLからアクセスが来ても新URLへスムーズに誘導でき、検索エンジンからの評価も引き継げます。