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?