¿Cómo crear una url personalizada a un Custom Post Type de WordPress?
En este artículo verás como adaptar las url de WordPress a las necesidades del proyecto, recomendaciones de SEO o analítica.

Sumario
En esta ocasión vamos a retomar los casos prácticos que son los que más me gustan.
Objetivo: Crear enlaces iguales a un tipo de contenido para poder analizar mejor los datos
Vamos a crear un tipo de contenido llamado Evento en nuestro WordPress, y necesitamos que todo el contenido de este tipo esté bajo la ruta «/events/» para manejar fácilmente la analítica de las visitas.
Necesitamos la siguiente estructura de URL:
- /events/ → Será donde mostraremos todos los eventos.
- /events/category-events/ → Aquí visualizaremos los eventos de esa categoría, donde «category-events» tendría el valor del slug de la categoría que corresponda.
- /events/category-events/title-event → Y aquí veremos el evento donde «title-event» tendría el valor del slug del evento.
Podemos crear Custom Post Type, Taxonomía y otros elementos fácilmente a través de GenerateWP.
Vamos a ver en los siguientes pasos como conseguirlo.
Paso 1: Crear el Custom Post Type de Eventos
En este paso vamos a añadir en el código las opciones básicas a la hora de crear un Custom Post Type al que, a partir de aquí, llamaremos CPT. De esta forma no añadiremos complejidad al código y se verá todo más fácil.
Después configuraremos el slug dinámico por así decirlo, y que establezca has_archive a «category-events». El código para crear el evento sería:
register_post_type(
'event',
array(
'rewrite' => array(
'slug' => 'events/%category-events%',
'with_front' => false
),
'has_archive' => 'category-events',
// resto de argumentos...
)
);
Paso 2: Crear Taxonomías de Eventos
En este momento vamos a crear las taxonomía de Eventos. De esta forma organizaremos mejor nuestros contenidos de eventos.
El código para crear la taxonomía sería:
register_taxonomy(
'events-cat',
'event',
array(
'rewrite' => array(
'slug' => 'events',
'with_front' => false
),
// resto de argumentos...
)
);
Paso 3: Modificar url del artículo
Ahora toca agregar el filtro «pre_post_link» para sustituir el enlace dinámico que pusimos a la hora de crear el evento.
Utilizar el filtro «pre_post_link» en lugar de «post_type_link» para que el Sitemap que generaba Yoast dinámicamente construya la url correcta.
El código del filtro post_type_link sería:
function bk_events_permalinks( $post_link, $post ){
if ( is_object( $post ) && $post->post_type == 'event' ){
$terms = wp_get_object_terms( $post->ID, 'events-cat' );
if( $terms ){
return str_replace( '%category-events%' , $terms[0]->slug , $post_link );
}
}
return $post_link;
}
add_filter( 'pre_post_link', 'bk_events_permalinks', 1, 2 );
Paso 4: Añadir reglas de reescritura
Por último, tenemos que agregar la acción «generate_rewrite_rules» para que funcione la paginación en las categorías.
El código de la acción generate_rewrite_rules sería:
function bk_events_category_pagination( $wp_rewrite ) {
// eliminamos la que tiene por defecto.
unset($wp_rewrite->rules['events/([^/]+)/page/?([0-9]{1,})/?$']);
$wp_rewrite->rules = array(
'events/?$' => $wp_rewrite->index . '?post_type=event',
'events/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=event&paged=' . $wp_rewrite->preg_index( 1 ),
'events/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?events=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
) + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'bk_events_category_pagination', 10, 1);
Conclusión
Con estos cuatro sencillos pasos tenemos las url organizadas para analizar el trafico fácilmente.
Nos vemos pronto.