¿Cómo crear rutas URL personalizadas?

50

Tengo un requisito muy peculiar, espero poder explicarlo sin ser demasiado confuso. Creé una plantilla de página donde enumero algunas propiedades que obtengo de un archivo XML externo, hasta ahora no hay problemas, digamos que la URL es así:

http://www.example.com/properties/

Cada propiedad tiene un enlace que debe redirigir al usuario a una página de "Propiedad única" que muestra más información al respecto. Me preguntaba si hay una manera de hacer el enlace así:

http://www.example.com/properties/123

¿Dónde 123estaría la identificación de la propiedad? Entonces, si tengo la URL como properties/some_idquiero poder cargar un archivo de vista (como los archivos single.phpo page.php) pero específico para esta condición de URL.

es posible?

Javier Villanueva
fuente

Respuestas:

57

Agregue esto a las funciones de su tema.php, o póngalo en un complemento .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Esto agrega una regla de reescritura que dirige las solicitudes a /properties/cualquier combinación de números que siguen al nombre de la página properties, con la consulta var property_idset. Solo asegúrese de visitar su página de configuración de enlaces permanentes y guardar para borrar las reglas de reescritura, por lo que se incluirá esta nueva regla.

En su page-properties.phpplantilla, get_query_var('property_id')devolverá la identificación de la propiedad si se estableció, si no es así, mostrará la página de propiedades predeterminada.

Milo
fuente
44
Esto estaba CERRADO para trabajar para mí, pero necesitaba agregar: add_filter ('init', 'flushRules'); función flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel
19
@tooshel definitivamente no desea eliminar las reglas en cada solicitud, es una operación costosa y ralentizará su sitio. solo necesita eliminar las reglas una vez, en la activación del complemento, o simplemente visitando la página de configuración de enlaces permanentes.
Milo
Sí, entiendo eso. . . ¡pero cuando estás probando es bueno que esté ahí!
tooshel
3
Una reescritura de URL más inteligente podría ser regexp ^properties/([0-9]+)/?. De lo contrario, coincidiría con algo comoexample/properties/1
Ryan Taylor
@ RyanTaylor, ¿estás seguro de eso? no captura example/properties/1cuando lo pruebo.
Milo
9

Otra forma de hacerlo:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codex Rewrite API / add rewrite rule

Codex Rewrite API / agregar etiqueta de reescritura

Christian Lescuyer
fuente
2
La respuesta aceptada funciona con 4.7 (y 4.8), no estoy seguro de por qué cree que no. Su código esencialmente está haciendo lo mismo, add_rewrite_tagagrega la consulta var a la misma matriz que el query_varsfiltro.
Milo
@Milo probablemente no funcionó para mí, pero ya no tengo un 4.7 a mano, así que no puedo verificarlo. Editaré mi respuesta.
Christian Lescuyer
@Milo Aunque personalmente prefiero reescribir la etiqueta, aún así probé la respuesta aceptada y funciona. Sin embargo, solo algunos gustos personales.
Jack Johansson
1
Las etiquetas de reescritura de @JackJohansson son necesarias cuando se usa en una permastruct . Es solo un bit extra de datos que WordPress nunca usa en este caso.
Milo
ambas reglas se pueden agregar al mismo método, terminando en una función más limpia y útil a la que volver y averiguar si se realiza un trabajo de mantenimiento
eballeste