wake-up-neo.net

Grundlegendes zu add_rewrite_rule

Ich versuche, add_rewrite_rule dazu zu bringen, einen Parameter aus der URL zu extrahieren und an die Anfrage weiterzuleiten. Ich habe eine Reihe von Posts darüber gesehen, kann es aber anscheinend nicht zum Laufen bringen.

Wenn eine URL mit einer bestimmten Zeichenfolge beginnt, möchte ich sie aus der URL entfernen und als Abfrageparameter übergeben.

Beispiel-Anforderungs-URL:

http://domain.com/foo/my_page

Dies würde sich in verwandeln

http://domain.com/my_page?param=foo

Wenn 'foo' nicht vorhanden ist, sollte es einfach als normale Anfrage durchlaufen werden. Diese Logik sollte für alle Seiten-URLs oder benutzerdefinierten Post-URLs auf meiner Website gelten (im Grunde genommen foo/*). Ich denke, es würde als Durchgang funktionieren, wenn die URL 'foo' es entfernt und dann einfach an Wordpress weitergeleitet wird, um es zur normalen Sache zu machen.

Ich habe bereits "param" als zulässige query_vars.

Insgesamt müsste es für Folgendes funktionieren:

  • / foo/my_page (Seite)
  • / foo/my_folder/my_page (Unterseite)
  • / foo/example_type (Benutzerdefiniertes Post-Archiv)
  • / foo/example_type/example_post (Benutzerdefinierter Post Single)
10
Louis W

Ok, ich habe Arbeitsbeispiele für alle drei Arten von Anfragen bekommen. Es dauerte eine Menge Experimente und Herumspielen, um sie zum Laufen zu bringen. Ich denke, Milo ist gut darin, Leute dazu zu bewegen, ihre eigenen Fragen zu beantworten.

Nach unzähligen Änderungen und dem Auffrischen der Permalinks wurde mir klar, dass es viel einfacher war, die URLs außerhalb der add_rewrite_url herauszufinden, und sobald sie funktionierten, dann das Neuschreiben zu definieren. Beispiel ist index.php?param=foo&post_type=example_type.

Eine andere offensichtliche Sache, aber es hier hinzuzufügen, damit es jemand anderem hilft. Sie müssen die Regeln für den benutzerdefinierten Beitragstyp add_rewrite_rule definieren, BEVOR Sie die Platzhalterregeln für Seiten/Unterseiten definieren. Ich habe ziemlich viel Zeit damit verschwendet und denke, es ist die Hauptsache, die mich dazu gebracht hat, nicht zu verstehen, warum die Regeln nicht funktionierten.

Hier sind die 3 Regeln, die für alle meine Bedürfnisse gelten. Die Seiten-/Unterseitenregel wurde zu einer einzigen zusammengefasst.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Außerdem habe ich eine Schleife eingerichtet, um mehrere benutzerdefinierte Regeln für Beitragstypen hinzuzufügen. Denken Sie daran, dass Sie den benutzerdefinierten Beitragstyp "add_rewrite_rule rules" definieren müssen, BEVOR Sie Ihre Seiten-/Unterseiten-Platzhalterregeln definieren.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

Der Rewrite Analyzer , den Milo weitergab, war sehr hilfreich, um besser zu verstehen, wie Wordpress Seiten/Posts abfragt.

6
Louis W

Eine Grundregel, die für Ihr Beispiel funktionieren würde:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Dies nimmt alles, was nach foo/ kommt und setzt es als pagename für die Abfrage, und dann erhält param den statischen Wert foo. Wenn Sie andere URL-Muster benötigen, benötigen Sie zusätzliche Regeln für jedes eindeutige Muster. In WP_Query docs finden Sie die verschiedenen Abfragevarianten, die in Umschreiberegeln festgelegt werden können. Vergessen Sie nicht, nach dem Hinzufügen neuer Regeln die Rewrite-Regeln zu löschen. Dies können Sie tun, indem Sie die Seite Permalinks Settings aufrufen.

Besuchen Sie jetzt Ihre Beispiel-URL:

http://domain.com/foo/my_page

lädt die richtige Seite, verhält sich aber nicht so wie beim Besuch:

http://domain.com/my_page?param=foo

denn bei der Verwendung interner Umschreibungen wird param im Abfrageobjekt $wp_query festgelegt, nicht im superglobalen $_GET. Wenn Sie mit Code arbeiten müssen, der nach einem Wert in $_GET sucht, benötigen Sie einen zusätzlichen Schritt, um diesen Wert festzulegen:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Eine weitere in Betracht zu ziehende Methode ist die Verwendung von Endpunkten. /foo/ befindet sich also am Ende von URLs und nicht als Präfix. Dies hat den Vorteil, dass der add_rewrite_endpoint der API das Hinzufügen aller benötigten Regeln vereinfacht, einschließlich der Aktivierung der Paginierung.

7
Milo