WordPressにはパーマリンク機能があるんだけどそれは内部のrewrite_ruleとかいう機能で実装されている
そんで、rewrite_ruleはまぁ文字の通り書き換えルール何だけど、リクエストパスを良きように読み替えてくれる機能です。
んで、どうやってrewrite_ruleを書き換えるかと言うと、add_filter で 'rewrite_rules_array' にルールを追加するのが一般的っぽいです。
それを更新するために $wp_rewrite->flush_rules() を実行するんだけど、これ実は、アクセスごとに実行しては行けない機能っぽい。下記みたいな記事でinitフックで実行する用例がネット上には転がってるんだけど、これを鵜呑みに実装するとバグる。
https://qiita.com/M-Ikezawa/items/22d24455f776065865ea
wpdocs.osdn.jp にすらこの方法が書かれてるの…まずくね?
具体的にどうバグるかと言うと、rewrite_rules_array に設定した関数がときどき実行されません。
なんで rewrite_rules_array に登録した関数が呼ばれないかと言うと、WP_Rewrite::wp_rewrite_rulesっていうメソッドの中でget_option('rewrite_rules') して、DBに保存していたルールがなければ、新規にルールを作成するっていう処理をしている。その新規にルールを作成する処理ってのの一環でrewrite_rules_arrayに登録した関数も呼ばれます。
まぁこのDBにアクセスしているのが怪しいですね。怪しいんですよ。そのものズバリflush_rules()を実行するとこのDB値を一旦削除して、ルールを作り直すっていう処理が動くんです。
なので並列アクセスしていると、DBの中身が作成されたり削除されたりといった動作が繰り返され、「flush_rules()実行しているのに、rewrite_rules_arrayに登録した関数が呼ばれない」といった動作になります。つまりバグります。
そもそも rewrite_rules_array に登録された処理はアクセスごとに実行されるべきものではありません。WordPressでのリライトルールは上記の通りDB管理されていて、DBに保存されたものを使い回すので、rewrite_rules_array の実行は一度だけ行われれば十分になるような処理を書くべきです。rewrit_ruleは処理が重いので毎回ルールを書き換えるような利用は想定外なのでしょう。
そして rewrite_rules_array に登録した関数を変更したら、WordPressのパーマリンク設定で設定を変更するボタンを押せば、処理内部でflush_rules()が実行され、rewrite_rules_array に登録した関数の処理が適用されます。
できるといえばできるけど、毎回アクセスごとに動作させるのがNGとなると実質出来ないってことになります。rewrite_ruleで対応するのは諦めましょう。
きーたにも書いてください
はい。わかりました。