web-dev-qa-db-fra.com

generate_rewrite_rules (action) vs add_rewrite_rule (fonction): lequel est préféré?

Je vois que ces deux méthodes peuvent être utilisées pour créer une nouvelle règle de réécriture personnalisée. Dans quelle situation est-il préférable? Je suppose qu'ils font la même chose?

Je peux soit utiliser:

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

ou

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

Ils sont totalement différents: generate_rewrite_rules est un crochet d’action et add_rewrite_rule est une fonction. Cela dit, utilisez add_rewrite_rule() si vous souhaitez définir des règles de réécriture personnalisées. Utilisez generate_rewrite_rules pour effectuer une action (à partir du codex) "après la création de toutes les règles de réécriture".

Cela ne signifie pas que vous ne pouvez pas ajouter de règles de réécriture via generate_rewrite_rules, mais que tout développeur s'attend à ce que toutes les règles de réécriture soient définies au moment où generate_rewrite_rules est déclenché:

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;
} );

Mais cela fonctionnera comme prévu:

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