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

- リンク: https://torounit.com/blog/%e3%81%84%e3%81%84%e5%8a%a0%e6%b8%9b-flush_rewrite_rules-%e3%82%92%e6%9b%b8%e3%81%8f%e3%81%ae%e3%81%af%e3%82%84%e3%82%81%e3%81%a6%e3%81%8f%e3%81%a0%e3%81%95%e3%81%84%ef%bc%81%ef%bc%81/
- 公開日: 2015-09-02T16:43:07+09:00
- 作成者: Toro\_Unit

恐らく日本一 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'](https://codex.wordpress.org/Plugin_API/Action_Reference/init)
> hook. **This is bad practice.**

[Rewrite API/add rewrite rule « WordPress Codex](http://codex.wordpress.org/Rewrite_API/add_rewrite_rule)

[関数リファレンス/flush rewrite rules – WordPress Codex 日本語版](http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/flush_rewrite_rules)

毎回実行するのはバッドプラクティスとCodexにもしっかり書かれているので、**絶対にやめ
ましょう**。

と言う前に、そもそも flush_rewrite_rules って地味に有名だけど、正直何の関数なのか
サッパリ解ってない人多いとは思いますので、なんでこれがダメなのか、ちょっとしっかり
解説しようと思います。

長いので面倒な人は、一番下のまとめだけ読んでください。

## そもそも flush ってどういう意味なの？

ポーカーのフラッシュとか顔を赤くするとか様々な意味がありますが、ここでの用法だと、
水とかをどっと流すと言った意味合いです。

プログラムの文脈だと、バッファとかキャッシュをクリアしたりすることを指すようです。

要はトイレで水を流すようなイメージなんですかね。

##  flush_rewrite_rules ってなんだろう？

flush_rewrite_rules は [WP_Rewite::flush_rules](http://codex.wordpress.org/Rewrite_API/flush_rules)
の ラッパーです。なのでこっちの話。

WordPressでリライトルールは、rewrite_rules ってオプションにシリアライズされて保存
されています。こいつを参照してWordPressはURLをパースしています。

なんでわざわざそんな面倒な実装になっているかというと、リライトルールの生成という
のが結構コストの高い処理なんです。ただパーマリンク構造なんて運用中にそうそう変更
するものでも無いので、ページにアクセスするたびにそんなことやってられないよ！って
話です。

flush_rewrite_rules を実行すると、rewrite_rules 削除し、その後 [WP_Rewrite::wp_rewirte_rules](https://developer.wordpress.org/reference/classes/wp_rewrite/wp_rewrite_rules/)
を叩いてリライトルールを生成するという流れになります。

また、flush_rewrite_rules の引数が true もしくは空の場合、.htaccess なんかも再生
成されます。

## じゃぁなぜ使っちゃだめなの？

当然かなり重いと言うのもあるんですが、これをよくわからないタイミングで実行される
とリライトルールがバグったりします。ついでに[僕が出してるプラグイン1号](https://wordpress.org/plugins/custom-post-type-permalinks/)
と[2号](https://ja.wordpress.org/plugins/simple-post-type-permalinks/)もバグります。

カスタム投稿のパーマリンクまわりの不具合のほとんどは、flush_rewire_rules です。ほんと
止めましょう。

検証した結果、flush_rewire_rules 書いてたんかい！！！！みたいなのがあると結構辛い！！！

## 代わりにどうしたら良いの？

管理画面から設定→パーマリンク設定に入り、変更を保存すれば良いです。別に変更し無く
ても大丈夫です。このとき、デフォルト（http://example.org/?p=123）以外のパーマリンク
構造になっていれば、flush_rewrite_rules が適切なタイミングで実行されます。

とりあえず、カスタム投稿タイプ、カスタムタクソノミー、エンドポイントなどを追加、
編集した際はこれやっておけば大丈夫です。

## flush_rewrite_rules を使うシチュエーション

プラグインなどで register_post_type 等パーマリンク周りを取り扱う場合は、[register_activation_hook](http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_activation_hook)
や、[register_deactivation_hook](http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_deactivation_hook)
等で登録しておくと良いかもです。

まぁ設定画面でボタン押せば良いだけなので、やらなくても大きな問題では無いと思います。

## まとめ

 * flush_rewirte_rules をテーマとかプラグインにとりあえず書かない。毎回実行は厳禁。
   不用意なタイミングで実行するとバグる。
 * register_post_type とか、 register_taxonomy 等を書いたり、rewriteパラメーター
   を変更したりした場合は管理画面のパーマリンク設定に行って、「変更を保存」。
 * [日本語Codexにもページ作成した](http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/flush_rewrite_rules)
   から読んで。ついでに翻訳しよう。
