web-dev-qa-db-ja.com

generate_rewrite_rules(action)とadd_rewrite_rule(function):どちらが望ましいですか?

私はこれら二つの方法が新しいカスタム書き換えルールを作成するために使われることができるのを見ます、それではどの状況の下でどちらが好ましいですか?私は彼らが同じことをしていると思いますか?

私はどちらを使用することができます:

add_action( 'generate_rewrite_rules', function( $wp_rewrite ) {
    $wp_rewrite->rules = array( 'xxx' => 'index.php?xxx' ) + $wp_rewrite->rules;
} );

または

add_rewrite_rule( 'xxx', 'index.php?xxx', 'top' );
6
Yoga

generate_rewrite_rules はアクションフックで、 add_rewrite_rule は関数です。とはいえ、カスタムの書き換え規則を定義したい場合はadd_rewrite_rule()を使用してください。 「すべての書き換えルールが作成された後」に(codexから)アクションを実行するには、generate_rewrite_rulesを使用します。

generate_rewrite_rules経由で書き換えルールを追加できないということではありません。実際には、generate_rewrite_rulesがトリガーされた瞬間にすべての書き換えルールが設定されることを開発者が期待するという意味です。

add_action( 'init', function( ) {
    add_rewrite_rule( 'xxx', 'index.php?xxx', 'top' );
} );

add_action( 'generate_rewrite_rules', function( $wp_rewrite ) {
    //All rewrite rules are expected to be set at this moment
    if( isset($wp_rewrite->rules['yyy']) ) {
        //Ooops. The rewrite rule 'yyy' is not set
    }
} );

//using `generate_rewrite_rules` to add some rewrite rule
add_action( 'generate_rewrite_rules', function( $wp_rewrite ) {
    //All rewrite rules are expected to be set at this moment
    $wp_rewrite->rules = array( 'yyy' => 'index.php?yyy' ) + $wp_rewrite->rules;
} );

しかし、これは期待通りに機能します。

add_action( 'init', function( ) {
    add_rewrite_rule( 'xxx', 'index.php?xxx', 'top' );
} );

add_action( 'generate_rewrite_rules', function( $wp_rewrite ) {
    //All rewrite rules are expected to be set at this moment
    if( isset($wp_rewrite->rules['yyy']) ) {
        //Aha!! Now the rewrite rule 'yyy' is correctly set
    }
} );

add_action( 'init', function( ) {
    add_rewrite_rule( 'yyy', 'index.php?yyy', 'top' );
} );
3
cybmeta