WordPressで「数字だけのURL」をカテゴリ付きURLへ301リダイレクトするコードの解説

WordPressを運営していると、過去に使っていたURL構造を変更したい場面があります。

例えば、以前は次のようなURLだったとします。

https://example.com/123/

これを、今後は次のようなURLに統一したい場合があります。

https://example.com/カテゴリ/123/

このようなときに使えるのが、WordPressのリダイレクト処理です。

今回のコードは、数字だけのURLにアクセスされたとき、自動的にカテゴリ付きのURLへ転送するためのものです。

今回のコード

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;
}
});

このコードをWordPressに追加すると、次のような転送が行われます。

/123/

/カテゴリ/123/

例えば、サイトURLが https://example.com の場合は、次のようになります。

https://example.com/123/

https://example.com/カテゴリ/123/

このコードの目的

このコードの目的は、数字だけで構成されたURLを、特定のカテゴリ配下のURLへ自動転送することです。

対象になるURLは、次のような形です。

/1/
/12/
/123/
/9999/

一方で、次のようなURLは対象になりません。

/blog/123/
/カテゴリ/123/
/abc/
/123/test/

つまり、URLの中身が「数字だけ」の場合に限定して処理されます。

add_action(‘template_redirect’)とは

add_action('template_redirect', function() {

この部分では、WordPressの template_redirect というタイミングで処理を実行しています。

template_redirect は、WordPressがページを表示する直前に実行されるフックです。

WordPressでは、ページを表示する前に「どのテンプレートを使うか」を判断します。その直前で処理を入れることで、ページを表示する前に別のURLへ転送できます。

リダイレクト処理を書く場所として、template_redirect はよく使われます。

$_SERVER[‘REQUEST_URI’]で現在のURLを取得している

$request_uri = $_SERVER['REQUEST_URI'];

この部分では、現在アクセスされているURLのパス部分を取得しています。

例えば、次のURLにアクセスされた場合、

https://example.com/123/

$_SERVER['REQUEST_URI'] には、おおよそ次のような値が入ります。

/123/

つまり、ドメイン名を除いた部分です。

preg_matchでURLの形を判定している

if (preg_match('#^/([0-9]+)/?$#', $request_uri, $m)) {

この部分では、現在のURLが「数字だけのURL」かどうかを判定しています。

使われているのは、PHPの preg_match() という関数です。

preg_match() は、文字列が正規表現のルールに合っているかを調べる関数です。

今回の正規表現はこちらです。

#^/([0-9]+)/?$#

これを分解すると、次の意味になります。

^          文字列の先頭
/ 最初のスラッシュ
([0-9]+) 数字が1文字以上
/? 最後のスラッシュはあってもなくてもよい
$ 文字列の終わり

つまり、次のようなURLに一致します。

/123
/123/
/456/
/9999

一方で、次のようなURLには一致しません。

/category/123/
/123/test/
/abc/
/2026/post-title/

([0-9]+)の部分が数字を取り出している

正規表現の中にあるこの部分が重要です。

([0-9]+)

丸括弧で囲まれた部分は、あとから値として取り出すことができます。

例えば、アクセスされたURLが次の場合、

/123/

$m[1] には次の値が入ります。

123

つまり、このコードではURL内の数字を取り出して、その数字を新しいURLに組み込んでいます。

wp_redirectで転送している

wp_redirect(home_url("/カテゴリ/{$m[1]}/"), 301);

この部分で実際にリダイレクトを行っています。

wp_redirect() は、WordPressで別のURLへ転送するための関数です。

home_url() は、サイトのトップURLを基準にURLを作る関数です。

例えば、サイトURLが次の場合、

https://example.com

そして $m[1]123 の場合、

home_url("/カテゴリ/{$m[1]}/")

は、次のURLになります。

https://example.com/カテゴリ/123/

つまり、

/123/

にアクセスされたら、

/カテゴリ/123/

へ転送される仕組みです。

301リダイレクトとは

wp_redirect(home_url("/カテゴリ/{$m[1]}/"), 301);

最後の 301 は、リダイレクトの種類を表しています。

301 は「恒久的な転送」という意味です。

簡単に言うと、

このURLは今後、別のURLに正式に移動しました

とブラウザや検索エンジンに伝えるためのものです。

一時的な転送ではなく、今後もずっと新しいURLを使う場合は、301リダイレクトを使います。

SEOの観点でも、古いURLから新しいURLへ評価を引き継ぎたい場合には、301リダイレクトがよく使われます。

exitで処理を止めている

exit;

リダイレクトを実行したあとに、exit; で処理を止めています。

これがないと、リダイレクト処理のあともWordPress側の処理が続いてしまう場合があります。

リダイレクトしたら、その時点で処理を終了させるのが基本です。

そのため、wp_redirect() のあとには exit; を入れます。

このコードで実現できること

このコードを使うと、次のようなURL変換ができます。

/1/      → /カテゴリ/1/
/12/ → /カテゴリ/12/
/123/ → /カテゴリ/123/
/9999/ → /カテゴリ/9999/

過去に数字だけのURLで記事やページを管理していた場合に、新しいカテゴリ構造へ移行する用途で使えます。

注意点1:数字だけのURLはすべて転送される

このコードは、数字だけのURLをすべて転送します。

例えば、WordPress内に本来次のようなページが存在していたとしても、

/123/

このコードが動くと、

/カテゴリ/123/

へ転送されます。

そのため、数字だけのURLを別の用途で使っている場合は注意が必要です。

注意点2:カテゴリ名が日本語の場合

今回のコードでは、転送先に日本語の「カテゴリ」を使っています。

home_url("/カテゴリ/{$m[1]}/")

WordPressでは日本語スラッグも使えますが、URL上ではエンコードされる場合があります。

例えばブラウザや環境によっては、次のように見える場合があります。

/%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA/123/

見た目や管理のしやすさを考えるなら、日本語ではなく英数字のスラッグを使う方法もあります。

例えば、

/category/123/

/blog/123/

のような形です。

注意点3:クエリ文字列がある場合

現在のコードでは、$_SERVER['REQUEST_URI'] をそのまま使っています。

そのため、次のようなURLでは正しく判定されない場合があります。

/123/?utm_source=test

REQUEST_URI にはクエリ文字列も含まれるため、正規表現に一致しなくなる可能性があります。

この点を考慮するなら、URLのパス部分だけを取り出す書き方にしたほうが安全です。

より安全なコード

実際に使うなら、次のように書くほうがおすすめです。

add_action('template_redirect', function() {
$request_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // /数字/ → /カテゴリ/数字/
if (preg_match('#^/([0-9]+)/?$#', $request_path, $m)) {
wp_safe_redirect(home_url("/カテゴリ/{$m[1]}/"), 301);
exit;
}
});

変更点は主に2つです。

1つ目は、parse_url() を使ってパス部分だけを取得している点です。

$request_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

これにより、次のようなURLでも、

/123/?utm_source=test

判定対象は次の部分だけになります。

/123/

2つ目は、wp_redirect() ではなく wp_safe_redirect() を使っている点です。

wp_safe_redirect(home_url("/カテゴリ/{$m[1]}/"), 301);

wp_safe_redirect() は、WordPress内で安全なURLへリダイレクトするための関数です。

外部サイトへの意図しない転送を防ぎやすくなるため、基本的には wp_safe_redirect() を使うほうが安心です。

英数字スラッグにする場合

日本語の「カテゴリ」ではなく、英数字の category に転送したい場合は、次のようにします。

add_action('template_redirect', function() {
$request_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // /数字/ → /category/数字/
if (preg_match('#^/([0-9]+)/?$#', $request_path, $m)) {
wp_safe_redirect(home_url("/category/{$m[1]}/"), 301);
exit;
}
});

この場合は、次のように転送されます。

/123/

/category/123/

特定の数字だけ転送したい場合

すべての数字URLを転送したくない場合は、対象の数字を限定することもできます。

例えば、123456 だけを転送したい場合は、次のように書けます。

add_action('template_redirect', function() {
$request_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); if (preg_match('#^/([0-9]+)/?$#', $request_path, $m)) {
$allowed_ids = ['123', '456']; if (in_array($m[1], $allowed_ids, true)) {
wp_safe_redirect(home_url("/カテゴリ/{$m[1]}/"), 301);
exit;
}
}
});

この場合、次のURLは転送されます。

/123/
/456/

しかし、次のURLは転送されません。

/789/
/999/

コードを追加する場所

このコードは、主に次のいずれかに追加します。

Code Snippetsプラグインに追加する

WordPress管理画面から安全に追加したい場合は、Code Snippetsなどのプラグインを使う方法があります。

テーマファイルを直接編集しないため、管理しやすいです。

子テーマのfunctions.phpに追加する

子テーマを使っている場合は、子テーマの functions.php に追加することもできます。

ただし、書き間違えるとサイトが表示されなくなる場合があるため、編集前にバックアップを取っておくことをおすすめします。

リダイレクト設定後に確認すること

コードを追加したら、実際にブラウザで確認します。

例えば、次のURLへアクセスします。

https://example.com/123/

そして、次のURLへ転送されれば成功です。

https://example.com/カテゴリ/123/

確認するときは、ブラウザのキャッシュが影響する場合があります。

特に301リダイレクトはブラウザに記憶されやすいため、テスト時はシークレットウィンドウを使うと確認しやすいです。

まとめ

今回のコードは、WordPressで数字だけのURLにアクセスされたとき、カテゴリ付きのURLへ301リダイレクトするためのコードです。

/123/

/カテゴリ/123/

URL構造を変更したときや、古いURLを新しいURLに統一したいときに役立ちます。

ただし、数字だけのURLをすべて転送するため、既存のページや投稿URLと競合しないか確認が必要です。

実際に使う場合は、クエリ文字列の影響を避けるために parse_url() を使い、リダイレクトには wp_safe_redirect() を使う形がおすすめです。

最終的には、次のコードが扱いやすいです。

add_action('template_redirect', function() {
$request_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // /数字/ → /カテゴリ/数字/
if (preg_match('#^/([0-9]+)/?$#', $request_path, $m)) {
wp_safe_redirect(home_url("/カテゴリ/{$m[1]}/"), 301);
exit;
}
});

このコードを使えば、古いURLから新しいURLへ自然に誘導でき、ユーザーにも検索エンジンにも分かりやすいURL整理ができます。