Página personalizada con variables en la URL. URL limpia con add_rewrite_rule

24 mar 2011, 19:11:55
Vistas: 17.2K
Votos: 8

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.

0
Todas las respuestas a la pregunta 1
0
16

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.

24 mar 2011 20:05:00