いい加減 flush_rewrite_rules を書くのはやめてください!!

恐らく日本一 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にもページ作成したから読んで。ついでに翻訳しよう。