Rewrtieルールを追加した例はすべて次のようになります。
function addsomerule() {
add_rewrite_rule(some regex,some parse result);
}
add_action('init','addsomerule');
これは私には計算されません。 rewrite_rule
オプションが空でない場合(つまり、書き換えルールが今すぐフラッシュされていない場合)、この種の書き換えルールへの追加は無視されるので、それをフックするポイントは何ですか?
それはadmin_init
にフックすることはDBへの書き込み、そして書き換えフラッシュのようにはるかに理にかなっているように思えます、そして管理者側だけで起こるべきです。
この関数を使用するためのより論理的なアクションはありませんか、それともinitなのか、それとも低レベルのフィルターを使用するのでしょうか。
あなたは、ルールをフラッシュせずには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の起動時に失われます。