Wann sollte add_rewrite_tag () verwendet werden?

22

Ich habe ein paar Tage damit verbracht zu lernen, wie man am besten Umschreiberegeln hinzufügt. Soweit ich weiß, ist die Verwendung einer geeigneten Methode zum Hinzufügen einfacher Regeln. Ein add_rewrite_rules()großes Dankeschön geht an Jan Fabry für diesen Austausch, dessen Ausarbeitungen von großem Nutzen waren.

Obwohl er erwähnt, dass add_rewrite_tags()ich keinen Leitfaden dafür gesehen habe, der erklärt, wann es von Vorteil ist, es zu verwenden, im Gegensatz zu anderen Methoden, um Regeln zum Umschreiben oder gute Beispiele für seine Verwendung hinzuzufügen. Es scheint ein mächtigeres Werkzeug zu sein, aber das ist ungefähr alles, was ich ergründen kann. Ich finde die Beispiele im Codex zu kryptisch oder unvollständig . Könnte jemand darauf eingehen oder auf eine Ressource verweisen? Bei Google habe ich nichts Nützliches gefunden.

Bearbeiten: Die Codex-Seite spricht von "allgemeiner" Verwendung in Verbindung mitadd_rewrite_rules(), wird jedoch nicht weiter ausgeführt. Ebensodie Codex Seite füradd_rewrite_rules()bezieht sich aufadd_rewrite_tags()aber es ist auch sehr spärlich auf Informationen. Wann und wie würde eine solche Kombination eingesetzt? Das einzige Beispiel, das ich gefunden habe, ist diese Antwort von Rob Vermeer, die ich nicht verstehe.

Seron
quelle

Antworten:

21

Der grundlegende Unterschied ist:

  • Das add_rewrite_rule()fügt eine bestimmte Regel hinzu, die interpretiert wird
  • Das add_rewrite_tag()fügt einen Platzhalter hinzu , der in URL-Strukturen verwendet werden soll. Dieser Platzhalter wird dann verwendet, um mehrere Regeln zu generieren.

Angenommen, Sie sind ein Reisebüro, das Hotels in verschiedenen Ländern bewirbt. Vielleicht möchten Sie, dass die URL eines Hotels so aussieht

  www.example.com/hotels/UK/Balmoral

Wo das Land (UK in diesem Beispiel) ein benutzerdefinierter Taxomony-Begriff ist und Balmoral ein Hotel (Post-Typ). Wir könnten dazu Umschreiberegeln hinzufügen, müssten dann aber eine Regel generieren für:

  • das hotel selbst
  • die Anhänge des Hotels
  • Eine Regel für Hotels (Posts), bei denen es sich über mehrere Seiten usw. erstreckt.

Das Generieren dieser Regeln kann kompliziert werden. Darüber hinaus werden wir wahrscheinlich mit den WordPress-eigenen Regeln für diesen Beitragstyp konkurrieren - generiert aus der Permastruktur, die wir bei der Registrierung des Beitragstyps festgelegt haben. (In jedem Fall lassen Sie WordPress die Arbeit erledigen).

Diese 'Permastruktur' - ähnlich wie Sie sie für Posts in den Permalink-Einstellungen festgelegt haben - bestimmt die Umschreiberegeln, die WordPress generiert. Aber da wir eine Struktur wollen, die etwas Unbekanntes (das Land) enthält - was wir interpretieren wollen - müssen wir einen Platzhalter für das Formular bereitstellen %country%. (Es ist fast identisch mit %category%für Beiträge).

Beispielsweise:

add_action_init('init','wpse71305_register_types');

function wpse71305_register_types(){

     //You'll need to register the country taxonomy here too.

     //Add 'country' tag.
     add_rewrite_tag('%country%', '([^&/]+)'));

     //Register hotel post type with %country$ tag
    $args = array(  
        ...
        'has_archive'=>true,  
        'rewrite' => array(  
            'slug'=>'hotels/%country%',  
            'with_front'=> false,  
            'feed'=> true,  
            'pages'=> true  
        )  
        ...
    );  
    register_post_type('hotel',$args);  
}

Hinweis: WordPress weiß nicht, wie man die URL aus dem %country%Tag generiert - Sie müssen ihm sagen, dass es das tun soll. (Ich beschreibe dies in einem Artikel, auf den ich unten verlinkt habe).

Schließlich speichert WordPress auch den übereinstimmenden Wert, über den Sie ihn abrufen können get_query_var()(etwas, das Sie mit einer Standard-Umschreiberegel nicht tun).

Sie können auch Tags erstellen, die in der Permastruktur von Posts verwendet werden sollen (auf der Seite mit den Permalink-Einstellungen festlegen).

Durch Hinzufügen eines Tags können wir es in Permastrukturen verwenden. WordPress weiß es dann

  • Was zu erwarten ist
  • Wie wird die URL interpretiert?
  • Wie ist der Wert zu interpretieren?

(Als Referenz siehe diesen Artikel, den ich geschrieben habe: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ ).

Bearbeiten

Wie in den Kommentaren erwähnt, ist das obige Beispiel ein schlechter register_taxonomy()Anruf add_rewrite_tag().

In Bezug auf die Codex-Dokumentation zur kombinierten Verwendung ist dies möglicherweise irreführend, da beide unabhängig voneinander verwendet werden können. Wie oben erwähnt, wird add_rewrite_tag()der Tag-Name jedoch zu den WordPress-verständlichen "Abfragevariablen" hinzugefügt. In der Praxis können Sie den Wert mit abrufen get_query_var(). Wenn add_rewrite_rule()also mit verwendet wird add_rewrite_tag(), wird die Variable von WordPress gespeichert. Es gibt aber auch andere Möglichkeiten, dies zu tun (siehe diese Antwort - beachten Sie auch Rob Vermeers Kommentar).

Außerdem: Wie kann man $ _GET-Variablen von umgeschriebenen URLs abrufen?

Stephen Harris
quelle
Danke dafür. Eine Sache, die ich aus Ihrer Antwort verstehe, ist, add_rewrite_tag()dass Platzhalter für die Verwendung in verwendet werden können Settings->Permalinks. Ist die Verwendung einer Taxonomie eine Voraussetzung für die Verwendung add_rewrite_tag()? Mein Eindruck von der Codex-Seite ist, dass es nicht so ist, aber es scheint allgemein verwendet zu werden. Ich habe meine Frage bezüglich der Verwendung add_rewrite_tag()in Verbindung mit erweitert, add_rewrite_rule()wie auf der Codex-Seite vorgeschlagen .
Seron
Sie haben absolut Recht mit Taxonomien (ein schlechtes Beispiel meinerseits). Siehe diesen Teil von register_taxonomy(). Ein besseres Beispiel wäre, wenn Sie etwas wie verwenden möchten, %country%aber wenn country nur eine häufig verwendete Abfragevariable und keine Taxonomie ist. Diese Fälle sind selten - ich musste sie nie verwenden add_rewrite_tag().
Stephen Harris