Custom Post Type Permalinks 1.0.0以上で発生する、カスタム投稿へのパーマリンクが404になってしまう現象について。

ちょっと報告が複数あったので対処法などをまとめておきます。

wp_loaded のactionの最後のほうで、Rewrite Ruleの登録を行うように変更したことに絡んで発生した不具合です。

flush_rewrite_rulesをregister_post_typeやregister_taxonomyの直後に動作させている場合に発生します。

register_post_type( 'hoge', $post_type_args );
register_taxonomy( 'piyo', 'hoge', $taxonomy_args );
flush_rewrite_rules();

flush_rewrite_rulesはURLをどのように分解するかというRewrite Ruleというモノを全て削除し再生成するものです。このRewrite Ruleを参照してWordPressはURLを理解しています。

flush_rewrite_rulesはとても重いので毎回実行すべきものでは無いです。ではいつ動作するのかと言うことですが、管理画面のパーマリンク設定を更新したときに実行されます。そのときに、Rewrite Ruleはデータベースに保存されます。

参考:

Custom Post Type Permalinks 1.0.0からは、register_post_typeやregister_taxonomyの時点でrewrite_ruleの登録を行いません。その段階でflush_rewrite_rulesを実行してしまうと、変更されていないモノから生成してしまうので404になってしまうと言うことです。

Codexでもflush_rewrite_rulesは毎回に動作させるのはバットプラクティスだと名言されているので、この問題についてプラグイン側で修正をする予定はありません。

もし、flush_rewrite_rulesをregister_post_typeやregister_taxonomyの後に動作させている場合は、flush_rewrite_rulesを削除してください。