web-dev-qa-db-ja.com

なぜ誰もがinitにadd_rewrite_ruleをフックするのですか

Rewrtieルールを追加した例はすべて次のようになります。

function addsomerule() {
  add_rewrite_rule(some regex,some parse result);
}

add_action('init','addsomerule');

これは私には計算されません。 rewrite_ruleオプションが空でない場合(つまり、書き換えルールが今すぐフラッシュされていない場合)、この種の書き換えルールへの追加は無視されるので、それをフックするポイントは何ですか?

それはadmin_initにフックすることはDBへの書き込み、そして書き換えフラッシュのようにはるかに理にかなっているように思えます、そして管理者側だけで起こるべきです。

この関数を使用するためのより論理的なアクションはありませんか、それともinitなのか、それとも低レベルのフィルターを使用するのでしょうか。

4
Mark Kaplun

あなたは、ルールをフラッシュせずにはadd_rewrite_rule()は機能しない、そしてその理由はWordPressがデータベースからルールをフェッチし、そしてadd_rewrite_rule()notデータベースにルールを追加しない)であるとあなたが言っているとおりです。

ただし、admin_initを使用することは不可能であり、その理由はadmin_initが遅すぎるためです。

WordPressは管理画面上でadmin_initが起動される前にflush_rewrite_rules()を呼び出すことがあり( here など)、WordPressがflush_rewrite_rules()を呼び出すときにルールが追加されるようにするにはinitまたはおそらくwp_loaded)を使用します。

このようなものでうまくいく可能性があります。

function addsomerule() {
  if ( is_admin() ) add_rewrite_rule(some regex,some parse result);
}

add_action( 'init','addsomerule' );

それはルールが管理者の要求の間にだけ追加されるようにします。

しかし、関数を呼び出すifステートメントは、パフォーマンスの面で(少し)コストがかかります。add_rewrite_ruleはそれほど高価ではない(グローバル配列に値を書き込むだけでdbにヒットしない)ことを考えると、その条件を追加する価値はありません。

さらに、あなたはあなたのサイトが使用するすべてのコードを常に管理できるわけではありません。 _(somepluginがフロントエンドのリクエストでflush_rewrite_rules()を呼び出すと、バックエンドにのみ追加されるため、ルールは失われます。

これらすべての理由から、他のチェックなしでinitに書き換え規則を追加することはおそらく正しいことです:問題を回避し、フロントエンド要求に追加される小さなコストはほとんど無関係であり、WordPressの起動時に失われます。

5
gmazzap