WordPress を使っていると、最初は「event」というカスタム投稿タイプで記事を管理してたけど、やっぱり「seminar」に名称を変えたい!という場面があります。
上記の例だと、イベント全般の予定がセミナー情報だけの掲載となったのでURLを変更したいといったケースです。
こうした場合、新しい投稿タイプを追加して手作業で記事を移すのは非効率です。記事数が多ければミスも増えますし、分類(カテゴリーやタクソノミー)、カスタムフィールドまで考慮すると現実的ではありません。
方法はいくつかありますが、今回ご紹介するのはテーマ内の functions.phpに処理を記述する形でデータベースを更新して一括変換する方法です。
WordPress の投稿やタクソノミー、カスタムフィールドはデータベースに保存されているため、該当テーブル内の event という文字列を seminar に置き換えます。
実際のコード
以下のコードは、functions.php に一時的に追加して利用する想定です。
処理の流れ
- 投稿タイプを変換
wp_posts.post_type の値を event から seminar に一括更新。
これにより、既存の投稿がすべて seminar 投稿として扱われるようになります。 - タクソノミーを変換
wp_term_taxonomy.taxonomy を書き換えています。
ここでは event_cat を seminar_cat に、event-option を seminar-option に変更。 - カスタムフィールドを変換
wp_postmeta.meta_key を置換しています。
例:event_date → seminar_date。 - リライトルールを更新
flush_rewrite_rules() を実行してパーマリンク設定を再生成し、404 エラーを防ぎます。
上記の4つの過程でデータベースを直接書き換えます。
実行時の注意点
- 必ずデータベースをバックアップしてから実行してください。
- このコードは一度きりの処理です。移行が完了したら
functions.phpから削除してください。 - テスト環境で動作確認してから本番適用してください。
- 他のプラグインの設定によっては不具合が発生する場合があります。
データベースを書き換えるのは正直緊張しますが、落ち着いて対応しましょう。
よくあるケースと追加修正のポイント
- タクソノミーが複数ある場合
今回の例では event_cat と event-option の 2 種類だけを想定しています。
もし他にも event_tag や event_area といったタクソノミーが存在する場合は、同様の UPDATE 文を追加してください。 - カスタムフィールドに複数のプレフィックスがある場合
サンプルでは event_ で始まるフィールドを一括変換していますが、
もし evt_ のような別のキーを使っている場合は、それぞれ対応する UPDATE を追加してください。 - 投稿スラッグ(post_name)は自動では変わらない
投稿タイプやタクソノミーは変わりますが、記事自体のスラッグ(例:event-001)はそのままです。
必要に応じてスラッグを一括置換する処理を追加するか、記事編集画面で手動調整してください。 - 既存コードとの依存関係
テーマやプラグインが event_ のキー名を前提に処理している場合、移行後にエラーやデータ不整合が発生する可能性があります。
移行前にコード全体を grep で検索し、event_ に依存している箇所がないか確認してください。
まとめ
WordPressのカスタム投稿タイプを変更するには、
- wp_posts.post_type を更新
- wp_term_taxonomy.taxonomy を更新
- wp_postmeta.meta_key を置換
- 最後にリライトルールを更新
という流れで対応できます。
ただし、タクソノミーやカスタムフィールドが複数ある場合は追加修正が必要です。
今回のコードは最小構成のサンプルですので、実際のサイト構造に合わせてカスタマイズしてください。
一度きりの処理とはいえ、強力な変更なので必ずテスト環境で試し、安全を確認した上で本番に適用しましょう。
※紹介したコードはサンプルですので、環境によっては動作しない場合や思わぬ不具合が発生する可能性があります。ご利用の際は必ずバックアップを取り、自己責任での実行をお願いいたします。