Kiedy należy użyć metody add_rewrite_tag ()?

22

Spędziłem kilka dni, próbując nauczyć się, jak najlepiej dodawać reguły przepisywania. Do tej pory rozumiem, że odpowiednim sposobem na dodanie prostych reguł jest użycie add_rewrite_rules(), z dużymi podziękowaniami dla Jana Fabry'ego z tej wymiany, który bardzo się przydał.

Chociaż wspomina add_rewrite_tags(), że nie widziałem w nim przewodnika wyjaśniającego, kiedy warto go używać, w przeciwieństwie do innych sposobów dodawania reguł przepisywania lub jakichkolwiek dobrych przykładów jego użycia. Wydaje się, że jest to potężniejsze narzędzie, ale to wszystko, co mogę pojąć. Uważam, że przykłady w Kodeksie są zbyt tajemnicze lub niekompletne . Czy ktoś może go rozwinąć lub wskazać jakiś zasób? Nie znalazłem nic przydatnego w Google.

edit: Jego strona Codex mówi o „ogólnie” używanie go w połączeniu zadd_rewrite_rules(), ale nie rozwinął. Podobnieodnosi się do strony Kodeksu dla,ale również jest bardzo mało informacji. Kiedy i jak można zastosować taką kombinację? Jedyny przykład, jaki znalazłem, to odpowiedź Roba Vermeera, której nie rozumiem.add_rewrite_rules()add_rewrite_tags()

seron
źródło

Odpowiedzi:

21

Podstawowa różnica polega na:

  • add_rewrite_rule()Dodaje konkretny przepis , który jest interpretowany
  • add_rewrite_tag()Dodaje zastępczy do stosowania w konstrukcjach URL. Ten symbol zastępczy jest następnie używany do generowania wielu reguł.

Załóżmy na przykład, że jesteś biurem podróży reklamującym hotele w różnych krajach. Możesz chcieć, aby adres URL hotelu był jak

  www.example.com/hotels/UK/Balmoral

Gdzie kraj (w tym przykładzie Wielka Brytania) to niestandardowy termin taksonomiczny, a Balmoral to hotel (typ pocztowy). Moglibyśmy dodać do tego reguły przepisywania, ale wtedy musielibyśmy wygenerować regułę dla:

  • sam hotel
  • załączniki do hotelu
  • Reguła dla hoteli (postów), w których rozlewa się na kilka stron itp.

Generowanie tych reguł może się skomplikować. Ponadto prawdopodobnie będziemy konkurować z własnymi regułami WordPress dla tego typu postów - generowanymi na podstawie struktury permastralnej, którą ustaliliśmy podczas rejestracji typu posta. (W każdym razie pozwól, aby WordPress wykonał pracę).

Ta „permastruktura” - podobna do tej, którą ustawiasz dla postów w ustawieniach permalink - określa reguły przepisywania generowane przez WordPress. Ale ponieważ chcemy struktury zawierającej jakieś nieznane (kraj) - które chcemy interpretować - musimy podać symbol zastępczy formularza %country%. (Jest prawie identyczny jak w %category%przypadku postów).

Na przykład:

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

Uwaga: WordPress nie wie, jak wygenerować adres URL z %country%tagu - musisz to powiedzieć. (Omawiam to w artykule, który zamieściłem poniżej).

Wreszcie WordPress zapisze również dopasowaną wartość, abyś mógł ją odzyskać get_query_var()(coś, czego nie ma w przypadku standardowej reguły przepisywania).

Możesz także tworzyć tagi do użycia w permastruktury postów (ustaw go na stronie ustawień Permalink).

Dodając tag, możemy go użyć w permastrukturach. WordPress to wie

  • Czego oczekiwać
  • Jak interpretować adres URL (sprawdź, czy pasuje)
  • Jak interpretować wartość (tj. „Wielka Brytania”)

(Jako odniesienie patrz ten artykuł, który napisałem: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ ).

Edytować

Jak zauważono w komentarzach, powyższy przykład jest kiepski, jak register_taxonomy()w rzeczywistości wzywa add_rewrite_tag().

Odnośnie do dokumentacji Kodeksu dotyczącej używania ich „w połączeniu”: być może jest to mylące, ponieważ można ich używać niezależnie. Jak wspomniano powyżej, add_rewrite_tag()dodaje jednak nazwę znacznika do WordPress-zrozumienia „zmiennych zapytań”. W praktyce pozwala to odzyskać wartość za pomocą get_query_var(). Tak więc, gdy add_rewrite_rule()jest używany z add_rewrite_tag(), zmienna będzie przechowywana przez WordPress. Ale są na to inne sposoby (zobacz tę odpowiedź - zwróć uwagę również na komentarz Roba Vermeera).

Powiązane również: Jak odzyskać zmienne $ _GET z przepisanych adresów URL?

Stephen Harris
źródło
Dzięki za to. Jedną rzeczą, którą rozumiem z twojej odpowiedzi jest to, że add_rewrite_tag()można jej użyć do tworzenia symboli zastępczych Settings->Permalinks. Czy przy korzystaniu z taksonomii jest to wymagane add_rewrite_tag()? Mam wrażenie ze strony Kodeksu, że tak nie jest, ale wydaje się powszechnie używane. Rozszerzyłem swoje pytanie dotyczące używania add_rewrite_tag()w połączeniu z, add_rewrite_rule()jak sugerowano na stronie Kodeksu .
seron
Masz absolutną rację co do taksonomii (zły przykład z mojej strony). Zobacz tę część register_taxonomy(). Lepszym przykładem może być sytuacja, gdy chcesz użyć czegoś takiego, %country%ale gdy kraj jest zwykłą zmienną zapytania, a nie taksonomią. Te przypadki są rzadkie - nigdy nie musiałem używać add_rewrite_tag().
Stephen Harris,