A diferença fundamental é:
- A
add_rewrite_rule()
adiciona uma regra específica que é interpretado
- O
add_rewrite_tag()
adiciona um espaço reservado para uso em estruturas de URL. Esse espaço reservado é usado para gerar várias regras.
Por exemplo - suponha que você seja um agente de viagens que anuncia hotéis em vários países. Você pode querer que o URL de um hotel seja como
www.example.com/hotels/UK/Balmoral
Onde o país (Reino Unido neste exemplo) é um termo de taxomonia personalizado e Balmoral é um hotel (tipo de postagem). Poderíamos adicionar regras de reescrita para isso, mas teríamos que gerar uma regra para:
- o próprio hotel
- acessórios do hotel
- Uma regra para hotéis (postagens) em que ele se espalha por várias páginas etc.
A geração dessas regras pode se tornar complicada. Além disso, provavelmente estaremos competindo com as próprias regras do WordPress para esse tipo de postagem - geradas a partir da estrutura permanente que definimos ao registrar o tipo de postagem. (De qualquer forma, deixe o WordPress fazer o trabalho).
Essa 'estrutura permanente' - semelhante ao que você define para postagens nas configurações de link permanente - determina as regras de reescrita que o WordPress gera. Mas, como queremos uma estrutura que contenha algum desconhecido (o país) - que queremos interpretar - precisamos fornecer um espaço reservado para o formulário %country%
. (É quase idêntico ao %category%
das postagens).
Por exemplo:
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);
}
Nota: O WordPress não sabe como gerar o URL a partir da %country%
tag - você precisa dizer isso. (Cubro isso em um artigo ao qual vinculei abaixo).
Finalmente, o WordPress também armazenará o valor correspondente para que você possa recuperá-lo via get_query_var()
(algo que você não faz com uma regra de reescrita padrão).
Você também pode criar tags para serem usadas na estrutura permanente das postagens (defina-a na página de configurações do Permalink).
Ao adicionar uma tag, podemos usá-la em estruturas permanentes. WordPress então sabe
- O que esperar
- Como interpretar o URL (verifique se ele corresponde)
- Como interpretar o valor (ou seja, 'UK')
(Como referência, consulte este artigo que escrevi: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ ).
Editar
Conforme observado nos comentários, o exemplo acima é ruim, como register_taxonomy()
de fato é chamado add_rewrite_tag()
.
Com relação à documentação do Codex sobre como usá-los 'em combinação': isso talvez seja enganoso, pois ambos podem ser usados independentemente. Como observado acima, no entanto, add_rewrite_tag()
adiciona o nome da tag às 'variáveis de consulta' do WordPress. Na prática, isso permite recuperar o valor com get_query_var()
. Assim, quando add_rewrite_rule()
usada com add_rewrite_tag()
, a variável será armazenada pelo WordPress. Mas existem outras maneiras de fazer isso (veja esta resposta - observe também o comentário de Rob Vermeer).
Também relacionado: Como recuperar variáveis $ _GET de URLs reescritos?
add_rewrite_tag()
pode ser usado para fazer com que os espaços reservados sejam usadosSettings->Permalinks
. Sobre o uso de uma taxonomia, é um requisito para o usoadd_rewrite_tag()
? Minha impressão na página do Codex é que não é, mas parece comumente usada. Expandi minha pergunta com relação ao usoadd_rewrite_tag()
em conjunto comadd_rewrite_rule()
o sugerido na página do Codex .register_taxonomy()
. Um exemplo melhor seria quando você deseja usar algo como,%country%
mas quando country é apenas uma variável de consulta comum e não uma taxonomia. Esses casos são raros - eu nunca tive que usaradd_rewrite_tag()
.