WordPress テーマやプラグインで作成されているカスタム投稿タイプを無効化したい場合に便利なのが unregister_post_type()
ですが、実はこれだけでは不十分なケースがあります。
実際に私が遭遇した事例として、親テーマで定義されていたカスタム投稿タイプを削除したところ、予期せず「残しておきたい別のカスタム投稿タイプ(例:work)が正しく機能しない」という問題が起きてしまいました。
そもそもunregister_post_type
なんて使わない構造にするのが当たり前ですが、どうしてもそうせざるを得ないような場合、この記事を参考にしてもらえたらと思います。
カスタム投稿タイプ削除によるリライトルールへの影響
unregister_post_type()
を使うと、該当のカスタム投稿タイプは削除されます。
しかし、WordPress は リライトルールをカスタム投稿タイプなどに基づいて自動生成しているため、単純に削除するだけではリライトルールが不整合を起こす可能性があります。
この「リライトルール」は、
- WordPress が起動するとき(
init
フックのタイミングなど) - パーマリンク設定の画面で「保存」ボタンを押したとき
- プラグインが有効化・無効化されたとき
- テーマを切り替えたとき
…など、いろいろな「イベント」が起こると再生成(更新)されます。
問題は、カスタム投稿タイプを削除したタイミングで、このリライトルールがちゃんと更新されないと、残しておきたい投稿タイプのパーマリンクまで影響を受けてしまうこと。
実際に起きた問題例
function remove_parent_company_post_type()
{
unregister_post_type('service');
}
add_action('init', 'remove_parent_company_post_type', 11);
上記のようにservice
というカスタム投稿タイプを削除する処理を実行したところ、なぜか同じサイトで使っていた works
というカスタム投稿タイプのアーカイブページが index.php
にリダイレクトされる現象が発生しました。
これは、削除後にリライトルールが正しく再生成されておらず、news
のリライト設定まで崩れてしまったことが原因と考えられます。
解決策:flush_rewrite_rules(false); の追加
この問題を回避するためには、カスタム投稿タイプを削除した後にリライトルールを再生成する必要があります。具体的には、以下のように flush_rewrite_rules(false);
を追加します。
function remove_parent_company_post_type()
{
unregister_post_type('service');
flush_rewrite_rules(false); // ← これを追加することでリライトルールを更新
}
add_action('init', 'remove_parent_company_post_type', 11);
flush_rewrite_rules(false);
を呼び出すことで、不要なカスタム投稿タイプを削除した後の状態に合わせてリライトルールが再登録されます。
その結果、別途残しておきたいカスタム投稿タイプのリライト設定が正常に反映され、アーカイブページが正しく表示されるようになります。
まとめ
- WordPressのリライトルールは、「イベント」が起こると再生成(更新)される
- カスタム投稿タイプを削除すると、リライトルール(URL に関する設定)にも影響が出る
- 削除だけではなく、削除した後に
flush_rewrite_rules()
でリライトルールを更新するのが大切
WordPress サイトでカスタム投稿タイプを無効化・削除したい場合は、単に unregister_post_type()
を記述するだけでなく、その後に flush_rewrite_rules(false);
を呼び出しておくことを忘れ。
これにより、想定外のリダイレクトやパーマリンク設定の崩れを防ぎ、他のカスタム投稿タイプの動作に影響が及ばないようにすることができます。
繰り返しますが、そもそもunregister_post_type
なんて使わない構造にするのがいちばんですね。