Página personalizada con variables en la URL. URL limpia con add_rewrite_rule
Usando WP3.1
Tengo una página personalizada con WP_Query que obtiene variables dinámicas desde la URL. Y quiero variables seguras y URLs limpias.
Ejemplo:
carpage/?carmodel=honda&location=finland
A
carpage/honda/finland/
Creé una add_rewrite_rule en functions.php y funciona, pero no estoy seguro si es seguro usar esto.
Functions.php
function fcars() {
// Añadir regla de reescritura para URLs limpias
add_rewrite_rule('carpage/[/]?([a-zA-Z-]*)[/]?([a-zA-Z-]*)$', 'index.php?pagename=carpage&var1=$matches[1]&var2=$matches[2]');
// Registrar tags para las variables
add_rewrite_tag('%var1%', '[a-zA-Z]+');
add_rewrite_tag('%var2%', '[a-zA-Z]+');
}
add_action('init', 'fcars');
Y en la plantilla personalizada obtengo las variables
¿Alguien podría ayudarme con esto? ¿Cómo puedo hacer esto seguro de usar y es esta la forma correcta en WP3.1?
¿Cuál es la forma correcta de hacer add_rewrite_rule en este caso:
carpage/honda/finland/
(solo guiones y letras minúsculas en la URL) carpage es la página de plantilla estática.

Creo que el add_rewrite_tag()
no es necesario, y puede ser reemplazado agregando las variables directamente a las query vars públicas:
// Ya sea directamente (en tu hook init):
$wp->add_query_var( 'var1' );
$wp->add_query_var( 'var2' );
// O mediante un filtro:
add_filter( 'query_vars', 'wpse12965_query_vars' );
function wpse12965_query_vars( $query_vars )
{
$query_vars[] = 'var1';
$query_vars[] = 'var2';
return $query_vars;
}
Además, actualmente permites una o dos barras al principio pero ninguna al final. Creo que deberías mover el /?
al final de la expresión regular. La parte [a-zA-Z-]
para el slug a veces se escribe como [^/]
(todo excepto una barra), pero en este caso probablemente no haga diferencia.
Yo escribiría la regla de reescritura así:
add_action( 'init', 'wpse12065_init' );
function wpse12065_init()
{
add_rewrite_rule(
'carpage(/([^/]+))?(/([^/]+))?/?',
'index.php?pagename=carpage&var1=$matches[2]&var2=$matches[4]',
'top'
);
}
El (/([^/]+))?
hace que todo el grupo sea opcional, por lo que /carpage
, /carpage/honda
y /carpage/honda/finland
deberían funcionar, con una barra opcional al final. Como necesitamos un grupo extra para la /
, las variables están en el siguiente grupo de captura, así que lo que era $matches[1]
se convierte en $matches[2]
y $matches[2]
en $matches[4]
.
Si quieres depurar tus reglas de reescritura, recomiendo mi plugin Rewrite analyzer, que te permite probar con la URL y ver las variables de consulta resultantes.
