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



