generate_rewrite_rules (действие) vs add_rewrite_rule (функция): какой из них предпочтительнее?

Я вижу, что эти два метода могут быть использованы для создания нового пользовательского правила перезаписи, поэтому при какой ситуации предпочтительнее? Полагаю, они делают то же самое?

Я могу либо использовать:

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

Solutions Collecting From Web of "generate_rewrite_rules (действие) vs add_rewrite_rule (функция): какой из них предпочтительнее?"

Они совершенно разные: generate_rewrite_rules – это крюк действия, а add_rewrite_rule – это функция. Тем не менее, используйте add_rewrite_rule() если вы хотите определить пользовательские правила перезаписи. Используйте generate_rewrite_rules для выполнения действия (от codex) «после того, как все правила перезаписи были созданы».

Это не означает, что вы не можете добавлять правила перезаписи с помощью 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']) ) { //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' ); } );