恐らく日本一 flush_rewrite_rules に悩まされている男、Toro_Unit です。
カスタム投稿タイプのパーマリンクがどーのこーのでよく出てくる、flush_rewirte_rules ですが。これをテーマとかに書くのはホントに勘弁してってお話です。
Flushing the rewrite rules is an expensive operation, there are tutorials and examples that suggest executing it on the 'init' hook. This is bad practice.
Rewrite API/add rewrite rule « WordPress Codex
関数リファレンス/flush rewrite rules – WordPress Codex 日本語版
毎回実行するのはバッドプラクティスとCodexにもしっかり書かれているので、絶対にやめましょう。
と言う前に、そもそも flush_rewrite_rules って地味に有名だけど、正直何の関数なのかサッパリ解ってない人多いとは思いますので、なんでこれがダメなのか、ちょっとしっかり解説しようと思います。
長いので面倒な人は、一番下のまとめだけ読んでください。
そもそも flush ってどういう意味なの?
ポーカーのフラッシュとか顔を赤くするとか様々な意味がありますが、ここでの用法だと、水とかをどっと流すと言った意味合いです。
プログラムの文脈だと、バッファとかキャッシュをクリアしたりすることを指すようです。
要はトイレで水を流すようなイメージなんですかね。
flush_rewrite_rules ってなんだろう?
flush_rewrite_rules は WP_Rewite::flush_rules の ラッパーです。なのでこっちの話。
WordPressでリライトルールは、rewrite_rules ってオプションにシリアライズされて保存されています。こいつを参照してWordPressはURLをパースしています。
なんでわざわざそんな面倒な実装になっているかというと、リライトルールの生成というのが結構コストの高い処理なんです。ただパーマリンク構造なんて運用中にそうそう変更するものでも無いので、ページにアクセスするたびにそんなことやってられないよ!って話です。
flush_rewrite_rules を実行すると、rewrite_rules 削除し、その後 WP_Rewrite::wp_rewirte_rules を叩いてリライトルールを生成するという流れになります。
また、flush_rewrite_rules の引数が true もしくは空の場合、.htaccess なんかも再生成されます。
じゃぁなぜ使っちゃだめなの?
当然かなり重いと言うのもあるんですが、これをよくわからないタイミングで実行されるとリライトルールがバグったりします。ついでに僕が出してるプラグイン1号と2号もバグります。
カスタム投稿のパーマリンクまわりの不具合のほとんどは、flush_rewire_rules です。ほんと止めましょう。
検証した結果、flush_rewire_rules 書いてたんかい!!!!みたいなのがあると結構辛い!!!
代わりにどうしたら良いの?
管理画面から設定→パーマリンク設定に入り、変更を保存すれば良いです。別に変更し無くても大丈夫です。このとき、デフォルト(http://example.org/?p=123)以外のパーマリンク構造になっていれば、flush_rewrite_rules が適切なタイミングで実行されます。
とりあえず、カスタム投稿タイプ、カスタムタクソノミー、エンドポイントなどを追加、編集した際はこれやっておけば大丈夫です。
flush_rewrite_rules を使うシチュエーション
プラグインなどで register_post_type 等パーマリンク周りを取り扱う場合は、register_activation_hook や、register_deactivation_hook 等で登録しておくと良いかもです。
まぁ設定画面でボタン押せば良いだけなので、やらなくても大きな問題では無いと思います。
まとめ
- flush_rewirte_rules をテーマとかプラグインにとりあえず書かない。毎回実行は厳禁。不用意なタイミングで実行するとバグる。
- register_post_type とか、 register_taxonomy 等を書いたり、rewriteパラメーターを変更したりした場合は管理画面のパーマリンク設定に行って、「変更を保存」。
- 日本語Codexにもページ作成したから読んで。ついでに翻訳しよう。