wake-up-neo.com

generate_rewrite_rules (Aktion) vs add_rewrite_rule (Funktion): Welche ist bevorzugt?

Ich sehe, dass diese beiden Methoden verwendet werden können, um eine neue benutzerdefinierte Regel für das Neuschreiben zu erstellen. Ich nehme an, sie machen dasselbe?

Ich kann entweder verwenden:

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

oder

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

Sie sind völlig verschieden: generate_rewrite_rules ist ein Aktions-Hook und add_rewrite_rule ist eine Funktion. Verwenden Sie add_rewrite_rule(), wenn Sie benutzerdefinierte Umschreiberegeln definieren möchten. Verwenden Sie generate_rewrite_rules, um eine Aktion (aus dem Codex) auszuführen, "nachdem alle Umschreiberegeln erstellt wurden".

Das bedeutet nicht, dass Sie keine Umschreibregeln über generate_rewrite_rules hinzufügen können. Tatsächlich bedeutet dies, dass jeder Entwickler erwartet, dass alle Umschreibregeln zum Zeitpunkt des Auslösens von generate_rewrite_rules festgelegt werden:

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

Aber das wird wie erwartet funktionieren:

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