Quando deve add_rewrite_tag () ser usado?

21

Eu passei alguns dias tentando aprender a melhor forma de adicionar regras de reescrita. Até agora, meu entendimento é que uma maneira adequada de adicionar regras simples é usar add_rewrite_rules() , com muito obrigado a Jan Fabry neste intercâmbio, as elaborações têm sido de grande utilidade.

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

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

    
por seron 02.11.2012 / 14:44
fonte

1 resposta

19

A diferença fundamental é:

  • O add_rewrite_rule() adiciona uma regra específica que é interpretada
  • O add_rewrite_tag() adiciona um espaço reservado para usar nas estruturas de URL. Este espaço reservado é então usado para gerar várias regras.

Por exemplo - suponha que você seja um agente de viagens anunciando 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 taxonomia personalizada e Balmoral é um hotel (tipo de postagem). Poderíamos adicionar regras de reescrita para isso, mas então teríamos que gerar uma regra para:

  • o próprio hotel
  • os anexos do hotel
  • Uma regra para hotéis (postagens), onde 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 post - gerado a partir da permastructure que definimos ao registrar o tipo de postagem. (De qualquer forma, deixe o WordPress fazer o trabalho).

Essa 'permastructure' - semelhante ao que você define para posts nas configurações do permalink - determina as regras de reescrita geradas pelo WordPress. Mas como queremos uma estrutura que contenha algum desconhecido (o país) - que queremos interpretar - precisamos fornecer um marcador de posição do formulário %country% . (É quase idêntico a %category% para posts).

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

Observação: O WordPress não sabe como gerar o URL da tag %country% - você precisa dizer para fazer isso. (Eu cubro isso em um artigo que eu tenho linkado abaixo).

Por fim, o WordPress também armazenará o valor correspondente para que você possa recuperá-lo por meio de get_query_var() (algo que você não faz com uma regra padrão de reescrita).

Você também pode criar tags para serem usadas na permastructure de posts (configurá-lo na página Permalink settings).

Ao adicionar uma tag, podemos usá-la em permastruturas. WordPress então sabe

  • O que esperar
  • Como interpretar o URL (verifique a correspondência)
  • Como interpretar o valor (por exemplo, 'UK')

(Como referência ver este artigo eu escrevi: enlace ).

Editar

Como observado nos comentários, o exemplo acima é ruim, pois register_taxonomy() de fato chama 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 mencionado 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() é usado com add_rewrite_tag() , a variável será armazenada pelo WordPress. Mas existem outras maneiras de fazer isso (veja esta resposta nota também o comentário de Rob Vermeer).

Relacionado também: Como recuperar $ _GET variáveis de URLs reescritos?

    
por Stephen Harris 02.11.2012 / 16:01
fonte