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を転送したくない場合は、対象の数字を限定することもできます。
例えば、123 と 456 だけを転送したい場合は、次のように書けます。
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整理ができます。
