Add_rewrite_rule verstehen


11

Ich versuche, add_rewrite_ruleeinen Parameter aus der URL zu extrahieren und an die Anfrage weiterzuleiten. Ich habe eine Reihe von Posts darüber gesehen, aber es scheint nicht zu funktionieren.

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

Beispielanforderungs-URL:

http://domain.com/foo/my_page

Dies würde sich verwandeln in

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

Wenn 'foo' nicht vorhanden ist, sollte es nur als normale Anfrage durchlaufen werden. Diese Logik sollte für jede Seiten-URL oder benutzerdefinierte Post-Typ-URL auf meiner Website gelten (im Grunde foo / *). Ich denke, es würde wie ein Durchgang wirken, wenn die URL 'foo' entfernt und dann einfach an Wordpress weitergegeben wird, um es normal 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 (Benutzerdefinierte Post Single)

eine URL, dh Beiträge, Kategorien, Tags usw., nicht nur den pageBeitragstyp oder nur eine Seite? Was ist mit übergeordneten / untergeordneten Seiten in der Hierarchie?
Milo

@ Milo Ich habe das für dich geklärt. Ich verwende nur Seiten und benutzerdefinierte Beitragstypen (Archiv und einzelne Seiten).
Louis W

Antworten:


8

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 danach kommt, foo/und setzt das wie pagenamefür die Abfrage und paramerhält dann den statischen Wert foo. Wenn Sie unterschiedliche URL-Muster benötigen, benötigen Sie zusätzliche Regeln für jedes eindeutige Muster. In den WP_QueryDokumenten finden Sie die verschiedenen Abfragevariablen, die innerhalb der Umschreiberegeln festgelegt werden können. Vergessen Sie nicht, die Umschreiberegeln nach dem Hinzufügen neuer Regeln zu löschen. Dies kann durch Aufrufen der Seite Permalinks-Einstellungen erfolgen.

Besuchen Sie jetzt Ihre Beispiel-URL:

http://domain.com/foo/my_page

lädt die richtige Seite, verhält sich aber nicht genau wie ein Besuch:

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

Denn bei Verwendung interner Umschreibungen paramwird innerhalb des $wp_queryAbfrageobjekts nicht das $_GETSuperglobal festgelegt. Wenn Sie mit Code arbeiten müssen, der nach einem Wert in sucht $_GET, 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 andere zu berücksichtigende Methode ist die Verwendung von Endpunkten, /foo/die sich eher am Ende von URLs als als Präfix befinden. Dies hat den Vorteil, dass die APIs das add_rewrite_endpointHinzufügen aller benötigten Regeln vereinfachen, einschließlich der Aktivierung der Paginierung.


Danke für die ausführliche Erklärung. Scheint nah, funktioniert für Seiten, gibt mir aber einen 404-Fehler für benutzerdefiniertes Post-Archiv und einzelne URLs.
Louis W

Nun ja, wie gesagt, Sie müssen zusätzliche Regeln hinzufügen, die jedem dieser Muster entsprechen. Ich weiß nicht, wie diese URLs in Ihrem Setup aussehen.
Milo

Ich habe einen benutzerdefinierten Seitentyp namens "Projekte", der ein Archiv und einzelne Seiten enthält. Können Sie ein Beispiel dafür geben, und ich kann alle anderen machen.
Louis W

Außerdem scheint es für Unterseiten nicht zu funktionieren.
Louis W

1
Bearbeiten Sie Ihre Frage, um ein Beispiel für jedes URL-Muster hinzuzufügen, für das eine Regel erforderlich ist. Ich bin nicht wirklich besorgt darüber, dass meine Antwort akzeptiert wird. Manchmal kann ich Leute dazu bringen, ihre eigenen Fragen zu beantworten, indem ich ihnen zunächst etwas gebe.
Milo

6

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

Nach unzähligen Änderungen und dem Aktualisieren der Permalinks wurde mir klar, dass es viel einfacher war, die URLs außerhalb von add_rewrite_url herauszufinden, und sobald sie funktionierten, definieren Sie das Umschreiben. Beispiel dafür index.php?param=foo&post_type=example_type.

Eine andere offensichtliche Sache, aber fügen Sie es hier hinzu, damit es jemand anderem helfen kann. 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 Post-Typen hinzuzufügen. Denken Sie daran, dass Sie die benutzerdefinierten Regeln für den Beitragstyp add_rewrite_rule definieren müssen, bevor Sie die Platzhalterregeln für Seiten / Unterseiten 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 weitergegeben hat, war sehr hilfreich, um besser zu verstehen, wie Wordpress Seiten / Beiträge abfragt.


Spät zur Show, aber kann ich Sie für ein anderes Beispiel anpingen? Wohlgemerkt, ich verstehe den $ tag-Parameter der add_rewrite_rule überhaupt nicht. Habe keine Ahnung, was es bedeutet. Ich verstehe auch kein Beispiel mit Seitenname = $ Übereinstimmungen [1] '. HUH ??? Ich habe eine URL wie domain.com/detail?id=2&it=3. Ich möchte, dass die Seite domain.com/detail/2-3/ lautet. Bist du bereit?
Debbie Kurth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.