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

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

Luis Ruiz

Escrito por Luis Ruiz el Actualizado el

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ías 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 «post_type_link» para sustituir el enlace dinámico o custom link en WordPress que pusimos a la hora de crear el evento.

El código del filtro post_type_link sería:

function custom_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( 'post_type_link', 'custom_events_permalinks', 10, 2 );

Qué diferencia existe entre el filtro de WordPress «pre_post_link» y «post_type_link»

El filtro pre_post_link y el filtro post_type_link en WordPress tienen diferencias específicas en cuanto a su funcionalidad y uso para personalizar / custom url

Filtro pre_post_link

Este filtro se aplica a la estructura del permalink de un post antes de que ocurra el reemplazo de tokens. Solo se aplica a posts con el tipo post.

Parámetros:

  • $permalink: El permalink del post.
  • $post: El objeto WP_Post en cuestión.
  • $leavename: Un booleano para indicar si se debe mantener el nombre del post.

Ejemplos de uso: Se podría utilizar para modificar la estructura de permalink de un post estándar, por ejemplo, añadiendo o eliminando ciertas partes del URL.

function custom_pre_post_link($permalink, $post, $leavename) {
    // Aquí puedes añadir lógica para modificar el permalink.
    // Por ejemplo, ponerdelante /blog/
    return $permalink;
}
add_filter('pre_post_link', 'custom_pre_post_link', 10, 3);

Pros y Contras:

  • Pros: Permite personalizar los permalinks de posts estándar de forma flexible.
  • Contras: Su alcance se limita solo a posts con el tipo post, lo que significa que no afecta a tipos de post personalizados (Custom post type).

Filtro post_type_link

Este filtro se aplica al permalink de un post de un tipo de post personalizado (CPT).

Parámetros:

  • $post_link: El permalink del post.
  • $post: El objeto WP_Post en cuestión.
  • $leavename: Un booleano para indicar si se debe mantener el nombre del post.
  • $sample: Un booleano para indicar si es un permalink de muestra.

Ejemplos de uso: Se puede usar para añadir o modificar elementos en el permalink de un tipo de post personalizado, como agregar argumentos de consulta o cambiar su estructura. Tal como hemos visto en el ejemplo anterior.

function custom_post_type_link($post_link, $post, $leavename, $sample) {
    // Aquí puedes modificar el permalink para tipos de post personalizados.
    // Por ejemplo, añadir un query string o cambiar una parte del URL.
    return $post_link;
}
add_filter('post_type_link', 'custom_post_type_link', 10, 4);

Pros y Contras:

  • Pros: Ofrece una gran flexibilidad para personalizar los permalinks de tipos de post personalizados.
  • Contras: No se aplica a posts estándar, lo que limita su uso a tipos de post personalizados.

Ambos filtros ofrecen potentes maneras de personalizar url en WordPress, pero su elección depende del tipo de contenido que se esté manejando: posts estándar o tipos de post personalizados (custom Post Type).

La personalización de permalinks puede ser una herramienta poderosa para mejorar la estructura de URLs y la SEO en un sitio de WordPress.

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

Qué diferencia hay entre los hooks «generate_rewrite_rules» y «rewrite_rules_array»

A la hora de crear una taxonomía o un Custom post type es muy importante saber qué hook usar si necesitas cambiar la url (slug) en WordPress.

Aunque tienen propósitos similares, pero con diferencias clave en su implementación y uso.

Acción generate_rewrite_rules

Esta acción te permite interactuar con el objeto WP_Rewrite para modificar o añadir reglas de reescritura. Se ejecuta durante la generación de las reglas de reescritura.

Ejemplo de Uso: Esta acción se utiliza para interactuar directamente con el objeto WP_Rewrite durante el proceso de generación de reglas de reescritura. Es ideal para situaciones en las que necesitas un control más granular sobre las reglas de reescritura y su proceso de creación.

function custom_rewrite_rules($wp_rewrite) {
    $new_rules = ['nueva-regla' => 'index.php?custom-variable=valor'];
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'custom_rewrite_rules');

Escenarios Comunes:

  • Añadir reglas de reescritura personalizadas que requieren lógica compleja.
  • Modificar el proceso de generación de reglas de reescritura para casos de uso avanzados.
  • Implementar estructuras de URL personalizadas que requieren una lógica específica más allá de las capacidades estándar de WordPress.

Pros y Contras:

  • Pros: Permite una manipulación directa y dinámica del objeto WP_Rewrite, ofreciendo más control sobre el proceso de generación de reglas.
  • Contras: Requiere un conocimiento más profundo del objeto WP_Rewrite y su funcionamiento, lo que puede ser más complejo para los desarrolladores menos experimentados.

Filtro rewrite_rules_array

El filtro «rewrite_rules_array» permite modificar el array completo de reglas de reescritura después de que se han generado. Es útil para hacer cambios en las reglas existentes o añadir nuevas.

Ejemplo de Uso: Este filtro es utilizado para modificar el conjunto completo de reglas de reescritura después de que se han generado. Es más adecuado para ajustes más directos y sencillos en las reglas existentes o para añadir nuevas reglas de una manera más accesible.

function custom_rewrite_rule_array($rules) {
    $new_rules = ['otra-regla' => 'index.php?otra-variable=otro-valor'];
    return $new_rules + $rules;
}
add_filter('rewrite_rules_array', 'custom_rewrite_rule_array');

Escenarios Comunes:

  • Añadir o modificar reglas de reescritura de una manera más simple y directa.
  • Realizar ajustes rápidos en las URLs sin necesidad de manipular directamente el objeto WP_Rewrite.
  • Crear redirecciones o estructuras de URL personalizadas de manera sencilla.

Pros y Contras:

  • Pros: Es una forma más sencilla y directa de añadir o modificar reglas de reescritura, ideal para ajustes rápidos o adicionales.
  • Contras: Ofrece un control menos detallado sobre el proceso de generación de las reglas y podría ser menos eficiente si se necesita modificar profundamente la lógica de reescritura.

La elección entre generate_rewrite_rules y rewrite_rules_array depende de tus necesidades específicas y tu nivel de comodidad con la API de reescritura de WordPress.

Ambas herramientas son esenciales en la personalización avanzada de las reglas de reescritura y estructuras de URL en WordPress. La elección entre una y otra dependerá de la complejidad de los requisitos de reescritura y el nivel de control deseado sobre el proceso de generación de reglas.

La acción generate_rewrite_rules te ofrece mayor control y flexibilidad, pero requiere un conocimiento más profundo de la API de reescritura de WordPress, mientras que rewrite_rules_array es más fácil de usar y adecuado para la mayoría de las tareas comunes de personalización de URL.

Conclusión

Con estos cuatro sencillos pasos tenemos las url organizadas para analizar el tráfico fácilmente.

Nos vemos pronto.

Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.

Cookies estrictamente necesarias

Las cookies estrictamente necesarias tiene que activarse siempre para que podamos guardar tus preferencias de ajustes de cookies.

Cookies de terceros

Esta web utiliza Google Analytics para recopilar información anónima tal como el número de visitantes del sitio, o las páginas más populares.

Dejar esta cookie activa nos permite mejorar nuestra web.