CPT 化に先立つ、URL 構造の整理
長く運用された WordPress サイトには、過去の判断の層が重なっていく。お知らせ、実績紹介、読み物。本来なら別種の情報として扱われるはずのものが、「投稿」という単一の機能の配下に、関連性のないカテゴリとして少しずつ寄せ集まっていく。テーマファイルもそれを前提に作り込まれる。小さく始めたサイトが運用を積み重ねるなかで、自然とそういう構造に落ちていく。
弊社でも、サイトを本格運用する段階になって、この構造が課題として立ち上がってきた。投稿一覧にはジャンルの違う記事が一緒くたに並び、カテゴリを軸にした導線も、そもそも別種のものを並べているために説明が効かない。これを根本から解くために、各ジャンルを独立したカスタム投稿タイプ(CPT)に切り出し、それぞれが独立したページ配下に記事を積んでいく構造へ、サイト全体の企画を進めていた。
この記事は、その移行の第一手として、既存の標準投稿側の URL 構造に手を入れた話である。URL は、サイトが情報をどう分節化しているかの表明でもある。構造の移行には、URL の整理が先立って必要になった。そして、既存記事の URL を変えないために、URL の中身(slug)を先に書き換える、という一見遠回りの判断を採った。
公開サイトには、お知らせ用のカテゴリとして news を置いている。記事は標準投稿として積まれ、URL は /%category%/%year%-%monthnum%-%day%-%hour%/ のパーマリンクテンプレートから /news/2025-12-01-14/ の形で組み立てられる。
この上に、新しいジャンルを独立した CPT として追加しようとしていた。CPT 側で運用したい URL 構造は /{投稿タイプ}/%postname%/。標準投稿側の URL 構造とは粒度が揃わない。
標準投稿側の URL も %postname% ベースへ寄せ、CPT 側と粒度を揃える方針を採った。標準投稿側のテンプレートは /%category%/%postname%/ に切り替えた。あわせて、既存の news 記事の URL がテンプレート切り替えに引きずられて変わらないよう、各記事の slug を先に書き換えた。
URL を運んでいるものの棚卸し
WordPress の記事 URL は、パーマリンクテンプレートとポストのフィールドの組み合わせで決まる。
現行の news 記事の URL は、テンプレートの %year%-%monthnum%-%day%-%hour% という書式が、各記事の公開日時から計算した値を埋め込んだ結果として組み立てられている。各記事の slug フィールドは別に存在しているが、このテンプレートでは参照されない。
テンプレートを %postname% 側に切り替えると、URL の組み立てに使われるのは slug フィールドの値となる。現行のテンプレートで運ばれていた 2025-12-01-14 のような文字列は、各記事の slug として独立に保持されていない限り、テンプレート変更と同時に URL から消える。
取り得た選択肢
既存の news 記事を残したままテンプレートを動かす場合、選択肢は3つに分けられた。
1つは、テンプレートを切り替え、変更前後で URL が変わった既存記事に 301 リダイレクトを設定する案。リダイレクトの保守対象が以後も残る前提を抱える。
2つめは、news と新しい CPT でパーマリンク設定を分け、CPT 側の rewrite ルールで /{投稿タイプ}/%postname%/ を独立に定義する案。標準投稿側の URL も %postname% ベースへ寄せる方針からは外れる。
3つめは、既存 news 記事の slug を、現在の URL に出ている date-time 文字列に書き換え、その上でテンプレートを /%category%/%postname%/ に切り替える案。切り替え後も既存記事の URL は変わらず、リダイレクトも生じない。
採ったのは、3つめ。対象の記事数が10件程度であり、slug の書き換えに要する手間と、以後リダイレクトを保守し続ける手間を比べて、前者を選んだ。
手順
最初に、各 news 記事の slug を、現行 URL に出ている2025-12-01-14 形式の文字列に手で書き換えた。現行テンプレートでは slug は参照されないため、この時点で公開 URL は変わらない。
次に、各 news 記事のカテゴリ設定を確認した。/%category%/%postname%/ における %category% は、複数カテゴリがある場合そのうち1つに解決される。news 以外のカテゴリが付与されていれば permalink に出る可能性があるため、news カテゴリのみに属していることを確認した。
その上で、サイトのパーマリンク設定を /%category%/%postname%/ に変更した。
変更後、既存の news 記事の URL を数本開き、変更前と同じ URL のまま開ける状態であることを確認した。
これで、以降に追加する新しい CPT は、/{投稿タイプ}/%postname%/ の URL 構造で素直に追加できる状態となった。
この判断の射程
この方式は、対象の記事数が手作業で slug を書き換えられる範囲にあること、および各記事のカテゴリ付与が permalink の %category% 解決と整合していることを前提にしている。記事数が大きく、書き換えコストがリダイレクト保守を上回る規模になれば、テンプレート切り替え + 301 案の側に判断は寄り得る。
