Când ar trebui folosit add_rewrite_tag()?
Am petrecut câteva zile încercând să învăț cum să adaug reguli de rescriere în cel mai bun mod. Până acum am înțeles că o metodă potrivită pentru a adăuga reguli simple este folosirea add_rewrite_rule()
, cu mulțumiri speciale pentru Jan Fabry pe acest forum, ale cărui explicații au fost foarte utile.
Deși el menționează add_rewrite_tag()
, nu am găsit un ghid care să explice când este benefic să-l folosești, în comparație cu alte metode de adăugare a regulilor de rescriere, sau exemple bune de utilizare. Pare a fi o unealtă mai puternică, dar cam atât am reușit să înțeleg. Exemplele din Codex mi se par prea criptice sau incomplete. Poate cineva să ofere mai multe detalii sau să recomande o resursă? Nu am găsit nimic util pe Google.
edit:
Pagina din Codex menționează că 'în general' ar trebui folosită împreună cu add_rewrite_rule()
, dar nu oferă detalii. Similar, pagina Codex pentru add_rewrite_rule()
face referire la add_rewrite_tag()
, dar și aceasta este foarte săracă în informații. Când și cum ar trebui folosită o astfel de combinație? Singurul exemplu pe care l-am găsit este acest răspuns de la Rob Vermeer pe care nu-l înțeleg.

Diferența fundamentală este:
add_rewrite_rule()
adaugă o regulă specifică care este interpretatăadd_rewrite_tag()
adaugă un placeholder pentru a fi folosit în structurile URL. Acest placeholder este apoi folosit pentru a genera multiple reguli.
De exemplu - să presupunem că ești un agent de turism care promovează hoteluri în diferite țări. Poți dori ca URL-ul unui hotel să fie de forma
www.example.com/hoteluri/UK/Balmoral
Unde țara (UK în acest exemplu) este un termen de taxonomie personalizat, iar Balmoral este un hotel (tip de postare). Am putea adăuga reguli de rescriere pentru asta, dar atunci ar trebui să generăm o regulă pentru:
- hotelul în sine
- atasamentele hotelului
- O regulă pentru hoteluri (postări) care se întind pe mai multe pagini etc.
Generarea acestor reguli poate deveni complicată. În plus, probabil vom intra în competiție cu regulile proprii ale WordPress pentru acel tip de postare - generate din structura de permalink pe care o setăm la înregistrarea tipului de postare. (În orice caz, lasă WordPress să facă treaba.)
Această 'structură de permalink' - similară cu ce setăm pentru postări în setările de permalink - determină regulile de rescriere pe care WordPress le generează. Dar din moment ce vrem o structură care conține ceva necunoscut (țara) - pe care vrem să fie interpretat - trebuie să oferim un placeholder de forma %country%
. (Este aproape identic cu %category%
pentru postări).
De exemplu:
add_action_init('init','wpse71305_register_types');
function wpse71305_register_types(){
//Aici va trebui să înregistrezi și taxonomia pentru țară.
//Adaugă tagul 'country'.
add_rewrite_tag('%country%', '([^&/]+)'));
//Înregistrează tipul de postare hotel cu tagul %country%
$args = array(
...
'has_archive'=>true,
'rewrite' => array(
'slug'=>'hoteluri/%country%',
'with_front'=> false,
'feed'=> true,
'pages'=> true
)
...
);
register_post_type('hotel',$args);
}
Notă: WordPress nu știe cum să genereze URL-ul din tagul %country%
- trebuie să îi spui cum să facă asta. (Acopăr acest lucru într-un articol pe care l-am menționat mai jos).
În final, WordPress va stoca și valoarea potrivită, astfel încât să o poți recupera via get_query_var()
(ceva ce nu faci cu o regulă standard de rescriere).
Poți crea și taguri pentru a fi folosite în structura de permalink a postărilor (seteaz-o în pagina de setări Permalink).
Prin adăugarea unui tag, îl putem folosi în structurile de permalink. WordPress știe apoi:
- Ce să aștepte
- Cum să interpreteze URL-ul (verifică dacă se potrivește)
- Cum să interpreteze valoarea (adică 'UK')
(Ca referință, vezi acest articol pe care l-am scris: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/).
Editare
După cum s-a menționat în comentarii, exemplul de mai sus este slab deoarece register_taxonomy()
de fapt apelează add_rewrite_tag()
.
Referitor la documentația Codex despre utilizarea lor 'în combinație': acest lucru poate fi înșelător, deoarece ambele pot fi folosite independent. După cum s-a menționat mai sus, totuși, add_rewrite_tag()
adaugă numele tagului la 'variabilele de interogare' înțelese de WordPress. În practică, acest lucru îți permite să recuperezi valoarea cu get_query_var()
. Astfel, când add_rewrite_rule()
este folosit cu add_rewrite_tag()
, variabila va fi stocată de WordPress. Dar există și alte modalități de a face acest lucru (vezi acest răspuns - notează și comentariul lui Rob Vermeer).
De asemenea, legat: Cum să recuperezi variabilele $_GET din URL-uri rescrise?

Mulțumesc pentru asta. Un lucru pe care îl înțeleg din răspunsul tău este că add_rewrite_tag()
poate fi folosit pentru a crea substituenți (placeholders) care să fie utilizați în Settings->Permalinks
. În legătură cu folosirea unei taxonomii, este o cerință pentru utilizarea add_rewrite_tag()
? Impresia mea din pagina Codex este că nu este, dar se pare că este folosită în mod obișnuit.
Am extins întrebarea mea în legătură cu utilizarea add_rewrite_tag()
împreună cu add_rewrite_rule()
așa cum este sugerat în pagina Codex.

Ai absolută dreptate în legătură cu taxonomiile (un exemplu prost din partea mea). Vezi această parte din register_taxonomy()
. Un exemplu mai bun ar fi când vrei să folosești ceva de genul %country%
, dar când country este doar o variabilă comună de interogare și nu o taxonomie. Aceste cazuri sunt rare - nu a trebuit niciodată să folosesc add_rewrite_tag()
.

@StephenHarris când ar trebui să alegem add-rewrite_tag()
pentru a adăuga substituenți în comparație cu filter hook-ul query_vars
?
