¿Cómo puedo crear rutas URL personalizadas?
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?

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.

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

@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.

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

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

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

@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.

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.

@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
?

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);

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 probablemente no funcionó para mí, pero ya no tengo una versión 4.7 a mano para verificarlo. Editaré mi respuesta.

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

@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.
