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