Wordpressで、固定ページとカスタム投稿の名前が被って、アクセスできなくなったときのはなし

More than 3 years have passed since last update.


現象

Wordpressにおいて、例えば bookmark という名前の固定ページと、 bookmark という名前のカスタム投稿タイプは、同時に存在できません。

固定ページのパーマリンクと、カスタム投稿タイプのアーカイブが、どちらも /bookmark というURLをとりに行こうとするためです。

さてこれを、両方作成してしまうとどうなるか。 後に作成した方にアクセスできなくなります

しかもこちら、衝突に気づいて先に作成した方を リネームしたとしても、アクセスできなくなったままです。

どうやらWordpressは、ルーティングの情報(厳密に言えばmod_rewrite用の情報)を、dumpした形でDB内に保持しているようで、こちらが書き換わらないかぎりは、ルーティングが最新の状態になっているとは限らないようです。


対応

このDB内に保持しているルーティングの情報を、再度生成しなおすための、 flush_rewrite_rulesという関数がありました。これを使いましょう。

衝突しない名前に変更した上で、以下のようなコードを functions.php 等々に埋め込みます。

// ルーティング衝突をなおす

add_action('init', 'my_flush_rewrite_rules');
function my_flush_rewrite_rules () {
flush_rewrite_rules( TRUE );
}

ただしこちら、けっこう重たい処理になっているようなので、 一度実行できたらすぐ元に戻す というような使い方がよさそうです。

なんらかのアクション(themeの切り替え時とか)にフックして実行するのもよいかもしれないですが、基本的にこれを実行するのはイレギュラーケースのときなので、必要なときだけスポットで実行するのがいい気がしております。


参考