¿Cuándo se debe usar add_rewrite_tag ()?

21

He pasado unos días tratando de aprender cómo agregar reglas de reescritura. Hasta ahora, mi entendimiento es que una forma adecuada de agregar reglas simples es usar add_rewrite_rules() , con muchas gracias a Jan Fabry en este intercambio, cuyas elaboraciones han sido de gran utilidad.

A pesar de que menciona add_rewrite_tags() , no he visto una guía que explique cuándo es beneficioso usarlo, a diferencia de otras formas de agregar reglas de reescritura, o cualquier buen ejemplo de su uso. Parece ser una herramienta más poderosa, pero eso es todo lo que puedo imaginar. Encuentro que los ejemplos en el Codex son demasiado cryptic o incompleto . ¿Alguien podría elaborar sobre esto o señalar algún recurso? No encontré nada útil en Google.

edit: Su página de Codex habla sobre el uso 'general' junto con add_rewrite_rules() , pero no da más detalles. De manera similar, la página de Codex para add_rewrite_rules() se refiere a add_rewrite_tags() pero también es muy escasa en la información. ¿Cuándo y cómo se usaría tal combinación? El único ejemplo que encontré es esta respuesta de Rob Vermeer que no entiendo.

    
pregunta seron 02.11.2012 - 14:44

1 respuesta

19

La diferencia fundamental es:

  • El add_rewrite_rule() agrega una regla particular que se interpreta
  • El add_rewrite_tag() agrega un marcador de posición para usar en las estructuras de URL. Este marcador de posición se utiliza para generar varias reglas.

Por ejemplo, suponga que es un agente de viajes que anuncia hoteles en varios países. Es posible que desee que la URL de un hotel sea como

  www.example.com/hotels/UK/Balmoral

Donde el país (Reino Unido en este ejemplo) es un término de taxomonía personalizado y Balmoral es un hotel (tipo de publicación). Podríamos agregar reglas de reescritura para esto, pero luego tendríamos que generar una regla para:

  • el propio hotel
  • los archivos adjuntos del hotel
  • Una regla para hoteles (publicaciones) donde se extiende sobre varias páginas, etc.

La generación de estas reglas puede complicarse. Además, probablemente estemos compitiendo con las propias reglas de WordPress para ese tipo de publicación, que se genera a partir de la estructura de infraestructura que establecemos al registrar el tipo de publicación. (En cualquier caso, deje que WordPress haga el trabajo).

Este 'permastructure' - similar a lo que configuró para las publicaciones en la configuración de permalink - determina las reglas de reescritura que genera WordPress. Pero como queremos una estructura que contenga algo de desconocido (el país), que queremos que se interprete, debemos proporcionar un marcador de posición de la forma %country% . (Es casi idéntico a %category% para las publicaciones).

Por ejemplo:

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: WordPress no sabe cómo generar la URL de la etiqueta %country% ; debe decirle que haga eso. (Cubro esto en un artículo que he enlazado a continuación).

Finalmente, WordPress también almacenará el valor coincidente para que puedas recuperarlo a través de get_query_var() (algo que no con una regla de reescritura estándar).

También puede crear etiquetas para usar en la estructura de publicaciones (configúrelas en la página de configuración de Permalink).

Al agregar una etiqueta, podemos usarla en permastructures. WordPress entonces sabe

  • Qué esperar
  • Cómo interpretar la URL (verifica que coincida)
  • Cómo interpretar el valor (es decir, 'UK')

(Como referencia, vea este artículo que escribí: enlace ).

Editar

Como se señaló en los comentarios, el ejemplo anterior es deficiente ya que register_taxonomy() en realidad llama a add_rewrite_tag() .

Con respecto a la documentación del Codex sobre su uso 'en combinación': esto puede ser engañoso ya que ambos pueden usarse de forma independiente. Sin embargo, como se indicó anteriormente, add_rewrite_tag() agrega el nombre de la etiqueta a las "variables de consulta" de WordPress-understand. En la práctica, esto le permite recuperar el valor con get_query_var() . Por lo tanto, cuando se usa add_rewrite_rule() con add_rewrite_tag() , WordPress almacenará la variable. Pero hay otras formas de hacerlo (consulte esta respuesta - note también el comentario de Rob Vermeer).

También relacionado: Cómo recuperar $ _GET variables de las URL reescritas?

    
respondido por el Stephen Harris 02.11.2012 - 16:01

Lea otras preguntas en las etiquetas