Volver a Proyectos Listado de Artículos

¿Cómo crear una url personalizada a un Custom Post Type de WordPress?

Luis Ruiz

Escrito por Luis Ruiz Actualizado el

En este artículo verás como adaptar las url de WordPress a las necesidades del proyecto, recomendaciones de SEO o analítica.

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.