¿Cómo puedo crear rutas URL personalizadas?

20 ago 2011, 01:24:08
Vistas: 123K
Votos: 70

Tengo un requerimiento muy particular, pero espero poder explicarlo sin que sea demasiado confuso. Creé una plantilla de página donde listo algunas propiedades que obtengo de un archivo XML externo. Hasta ahora sin problemas, y digamos que la URL es así:

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

Cada propiedad tiene un enlace que debería redirigir al usuario a una página de "Propiedad Individual" que muestra más información sobre ella. Me preguntaba si hay alguna manera de hacer el enlace así:

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

Donde 123 sería el id de la propiedad. Entonces, si tengo la URL como properties/some_id, quiero poder cargar un archivo de vista (como los archivos single.php o page.php), pero específico para esta condición de URL.

¿Es esto posible?

0
Todas las respuestas a la pregunta 2
10
86

Añade esto al functions.php de tu tema, o colócalo en un plugin.

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'propiedades/([0-9]+)/?$',
        'index.php?pagename=propiedades&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 añade una regla de reescritura que dirige las solicitudes a /propiedades/ con cualquier combinación de números siguientes al nombre de página propiedades, con la variable de consulta property_id establecida. Asegúrate de visitar la página de configuración de enlaces permanentes y guardar para actualizar las reglas de reescritura, de modo que esta nueva regla se incluya.

En tu plantilla page-propiedades.php, get_query_var('property_id') devolverá el ID de la propiedad si estaba establecido, si no es así, mostrará la página de propiedades por defecto.

20 ago 2011 02:44:23
Comentarios

Esto estuvo CASI funcionando para mí, pero necesité agregar: add_filter('init','flushRules');
function flushRules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); }

tooshel tooshel
13 nov 2012 19:52:34

@tooshel definitivamente no quieres vaciar las reglas en cada solicitud, es una operación costosa y ralentizará tu sitio hasta dejarlo inutilizable. Solo necesitas vaciar las reglas una vez, al activar el plugin, o simplemente visitando la página de configuración de enlaces permanentes.

Milo Milo
13 nov 2012 22:17:06

Sí, lo entiendo... ¡pero cuando estás probando es útil tenerlo ahí!

tooshel tooshel
14 nov 2012 22:32:02

Una expresión regular más inteligente para reescribir la URL podría ser ^properties/([0-9]+)/?. De lo contrario, coincidiría con algo como example/properties/1

Ryan Taylor Ryan Taylor
12 dic 2014 19:34:52

@RyanTaylor ¿estás seguro de eso? no captura example/properties/1 cuando lo pruebo.

Milo Milo
12 dic 2014 20:14:15

¿Cuál es la ubicación del archivo page-properties.php? Lo puse dentro del directorio del plugin. ¿Es correcto?

Farid Movsumov Farid Movsumov
30 jun 2016 09:09:56

@FeridMovsumov los archivos del tema siempre se cargan desde el directorio del tema activo actual, a menos que agregues un filtro para cargarlos desde otro lugar.

Milo Milo
30 jun 2016 18:52:36

Hola @Milo, este es un fragmento de código hermoso. ¿Sabes cómo hacer que esto no entre en conflicto cuando se usa $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ? La función está capturando $page (y dejándolo en blanco) y no puedo continuar con la paginación.

Jaypee Jaypee
8 ago 2017 20:27:05

@Milo ¿qué quieres decir con ponerlo en un plugin? ¿exactamente dónde? ¿Se puede poner en cualquier parte del plugin? o en wp-content/plugins/myPlugin/myPlugin.php ?

SL5net SL5net
17 may 2021 14:54:39

El filtro query_vars parece no estar funcionando (WP 5.7), muestra un error: Warning: Invalid argument supplied for foreach() in wp/wp-includes/class-wp.php on line 296

jnaklaas jnaklaas
4 jul 2021 19:13:44
Mostrar los 5 comentarios restantes
5
11

Otra forma de hacerlo:

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

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

API de Reescribir en Codex/añadir regla de reescritura

API de Reescribir en Codex/añadir etiqueta de reescritura

21 may 2017 12:24:24
Comentarios

La respuesta aceptada funciona con 4.7 (y 4.8), no estoy seguro por qué crees que no. Tu código está haciendo esencialmente lo mismo, add_rewrite_tag agrega la variable de consulta al mismo array que el filtro query_vars.

Milo Milo
7 jul 2017 20:45:11

@Milo probablemente no funcionó para mí, pero ya no tengo una versión 4.7 a mano para verificarlo. Editaré mi respuesta.

Christian Lescuyer Christian Lescuyer
8 jul 2017 10:28:30

@Milo Aunque personalmente prefiero la etiqueta de reescritura, igual probé la respuesta aceptada y funciona. Simplemente son gustos personales.

Johansson Johansson
8 jul 2017 18:36:11

@JackJohansson las reescrituras de etiquetas son necesarias cuando las estás usando en una estructura de enlaces permanentes. Es solo un dato adicional que WordPress nunca utiliza en este caso.

Milo Milo
8 jul 2017 18:47:38

ambas reglas pueden agregarse al mismo método, lo que resulta en una función más limpia y útil para volver a consultar y comprender si se está realizando trabajo de mantenimiento

eballeste eballeste
14 jul 2018 18:51:40