Posted at

wp_rewriteではまったこと

More than 5 years have passed since last update.

マルチサイト運用しているwordpressの管理者ならば、一度や二度は全ブログに対して共通の設定をかけたり、共通の記事(ようこそ記事みたいな)を差し込みたくなったことはあるはず。

私の場合、そんなことが一度二度どころか、1年弱で二桁回数くらい生じたので、switch_to_blog関数を使って順繰りに全ブログに対して共通の処理を実行するプラグインを自作してやっている。

この時、switch_to_blogはDBの接続先テーブルは変えてくれるけど、wp_rewriteについてはinitしなおしてくれない、という事実を知らなかったのでけっこう苦労した。

これを知らないとどうなるか。

記事を挿入する(wp_insert_postを実行する)と、save_post_hook関数がsave_postフックで呼び出され、page_type=pageの場合rewrite_rulesを更新する処理が走る。この時、基となるパーマリンク設定は、アップデート対象ブログの値ではなく、switch_to_blogする前の、全ブログアップデート用プラグインを実行したブログの設定が参照された状態になっている(だいたいの場合マスターブログでしょう)。マスターブログのパーマリンク設定からrewriterulesを作成するものの、保存先のテーブルはswitch_to_blogしたアップデート対象のブログになっているので、ここで不整合が起きる。

全ブログのパーマリンク設定が同じであれば気づかないのだろうけど、私の場合、諸事情によりマスターブログのパーマリンク設定が、子ブログのものとは異なっているため、全ブログアップデート後に子ブログの記事がすべてnot foundになってしまった。なので、全ブログをアップデートかけるようなときは、

switch_to_blog($blog_id);

global $wp_rewire;
$wp_rewrite->init();

としておくのが安全。(他に弊害があるかもしれないけど)