Quando dovrebbe essere usato add_rewrite_tag()?
Ho passato alcuni giorni cercando di imparare come aggiungere al meglio le regole di riscrittura. Finora ho capito che un modo adatto per aggiungere regole semplici è usare add_rewrite_rules()
, con grande ringraziamento a Jan Fabry in questo scambio le cui spiegazioni sono state molto utili.
Sebbene menzioni add_rewrite_tags()
, non ho trovato una guida che spieghi quando sia vantaggioso usarlo, rispetto ad altri modi per aggiungere regole di riscrittura, o buoni esempi sul suo utilizzo. Sembra essere uno strumento più potente, ma questo è tutto ciò che riesco a capire. Trovo che gli esempi nel Codex siano troppo criptici o incompleti. Qualcuno potrebbe approfondire o indicare qualche risorsa? Non ho trovato nulla di utile su Google.
modifica:
La sua pagina del Codex parla di usarlo 'generalmente' in combinazione con add_rewrite_rules()
, ma non approfondisce. Allo stesso modo la pagina del Codex per add_rewrite_rules()
fa riferimento a add_rewrite_tags()
ma è molto scarna di informazioni. Quando e come verrebbe usata una tale combinazione? L'unico esempio che ho trovato è questa risposta di Rob Vermeer che non capisco.

La differenza fondamentale è:
- La funzione
add_rewrite_rule()
aggiunge una regola specifica che viene interpretata - La funzione
add_rewrite_tag()
aggiunge un segnaposto da utilizzare nelle strutture degli URL. Questo segnaposto viene poi usato per generare più regole.
Ad esempio - supponiamo che tu sia un agente di viaggio che pubblicizza hotel in vari paesi. Potresti volere che l'URL di un hotel sia simile a:
www.example.com/hotels/UK/Balmoral
Dove il paese (UK in questo esempio) è un termine di una tassonomia personalizzata e Balmoral è un hotel (tipo di post). Potremmo aggiungere regole di rewrite per questo, ma poi dovremmo generare una regola per:
- l'hotel stesso
- gli allegati dell'hotel
- Una regola per gli hotel (post) che si estendono su più pagine, ecc.
Generare queste regole può diventare complicato. Inoltre, probabilmente entreremmo in conflitto con le regole predefinite di WordPress per quel tipo di post - generate dalla struttura dei permalink che impostiamo durante la registrazione del tipo di post. (In ogni caso, lascia che sia WordPress a fare il lavoro).
Questa 'struttura dei permalink' - simile a quella che imposti per i post nelle impostazioni dei permalink - determina le regole di rewrite che WordPress genera. Ma poiché vogliamo una struttura che contenga qualcosa di sconosciuto (il paese) - che vogliamo venga interpretato - dobbiamo fornire un segnaposto nella forma %country%
. (È quasi identico a %category%
per i post).
Per esempio:
add_action_init('init','wpse71305_register_types');
function wpse71305_register_types(){
//Qui dovrai registrare anche la tassonomia del paese
//Aggiungi il tag 'country'
add_rewrite_tag('%country%', '([^&/]+)'));
//Registra il tipo di post hotel con il tag %country%
$args = array(
...
'has_archive'=>true,
'rewrite' => array(
'slug'=>'hotels/%country%',
'with_front'=> false,
'feed'=> true,
'pages'=> true
)
...
);
register_post_type('hotel',$args);
}
Nota: WordPress non sa come generare l'URL dal tag %country%
- devi dirgli come fare. (Copriro questo argomento in un articolo che ho linkato sotto).
Infine WordPress memorizzerà anche il valore corrispondente in modo che tu possa recuperarlo tramite get_query_var()
(cosa che non accade con una regola di rewrite standard).
Puoi anche creare tag da utilizzare nella struttura dei permalink dei post (impostala nella pagina delle impostazioni dei permalink).
Aggiungendo un tag, possiamo usarlo nelle strutture dei permalink. WordPress quindi sa:
- Cosa aspettarsi
- Come interpretare l'URL (verificare che corrisponda)
- Come interpretare il valore (es. 'UK')
(Come riferimento vedi questo articolo che ho scritto: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/).
Modifica
Come notato nei commenti, l'esempio sopra è poco efficace poiché register_taxonomy()
in realtà chiama add_rewrite_tag()
.
Per quanto riguarda la documentazione del Codex sull'uso 'in combinazione': questo forse è fuorviante in quanto possono essere usati entrambi indipendentemente. Come notato sopra, tuttavia, add_rewrite_tag()
aggiunge il nome del tag alle 'variabili di query' comprensibili da WordPress. In pratica questo ti permette di recuperare il valore con get_query_var()
. Quindi, quando add_rewrite_rule()
viene usato con add_rewrite_tag()
, la variabile verrà memorizzata da WordPress. Ma ci sono altri modi per farlo (vedi questa risposta - nota anche il commento di Rob Vermeer).
Vedi anche: Come recuperare le variabili $_GET dagli URL riscritti?

Grazie per questo. Una cosa che ho capito dalla tua risposta è che add_rewrite_tag()
può essere usato per creare segnaposto da utilizzare in Impostazioni->Permalink
. Riguardo all'uso di una tassonomia, è un requisito per utilizzare add_rewrite_tag()
? La mia impressione dalla pagina Codex è che non lo sia, ma sembra essere comunemente usato.
Ho ampliato la mia domanda riguardo all'uso di add_rewrite_tag()
in congiunzione con add_rewrite_rule()
come suggerito nella pagina Codex.

Hai perfettamente ragione riguardo alle tassonomie (un cattivo esempio da parte mia). Vedi questa parte di register_taxonomy()
. Un esempio migliore sarebbe quando vuoi usare qualcosa come %country%
ma quando country è solo una comune query variable e non una tassonomia. Questi casi sono rari - non ho mai dovuto usare add_rewrite_tag()
.

@StephenHarris quando si dovrebbe scegliere add-rewrite_tag()
per aggiungere segnaposto rispetto al filter hook query_vars
?
