Quando add_rewrite_tag () deve ser usado?

22

Passei alguns dias tentando aprender a melhor maneira de adicionar regras de reescrita. Até agora, meu entendimento é que uma maneira adequada de adicionar regras simples é usar add_rewrite_rules(), com grandes agradecimentos a Jan Fabry nessa troca , cujas elaborações têm sido de grande utilidade.

Embora ele mencione que add_rewrite_tags()eu não vi um guia explicando quando é benéfico usá-lo, em vez de outras maneiras de adicionar regras de reescrita ou quaisquer bons exemplos de uso. Parece ser uma ferramenta mais poderosa, mas é tudo o que consigo entender. Acho que os exemplos no Codex são muito enigmáticos ou incompletos . Alguém poderia elaborar sobre ele ou apontar para algum recurso? Não encontrei nada útil no Google.

edit: Sua página do Codex fala sobre 'geralmente' usá-lo em conjunto comadd_rewrite_rules(), mas não o elabora. Da mesma forma, a página do Codex paraadd_rewrite_rules()refere-se,add_rewrite_tags()mas também é muito escassa em informações. Quando e como essa combinação seria usada? O único exemplo que encontrei é esta resposta de Rob Vermeer, que não entendo.

seron
fonte

Respostas:

21

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?

Stephen Harris
fonte
Obrigado por isso. Uma coisa que entendi da sua resposta é que add_rewrite_tag()pode ser usado para fazer com que os espaços reservados sejam usados Settings->Permalinks. Sobre o uso de uma taxonomia, é um requisito para o uso add_rewrite_tag()? Minha impressão na página do Codex é que não é, mas parece comumente usada. Expandi minha pergunta com relação ao uso add_rewrite_tag()em conjunto com add_rewrite_rule()o sugerido na página do Codex .
seron 4/11/12
Você está absolutamente certo sobre taxonomias (um mau exemplo da minha parte). Veja esta parte de 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 usar add_rewrite_tag().
Stephen Harris