Cómo reescribir los enlaces permanentes de productos en Woocommerce para usar slugs de categoría
Sé que hay información sobre este problema, pero no encontré una solución completa que funcione.
Necesito utilizar los slugs de categoría de producto en mis enlaces permanentes para que las URLs queden como example.com/portatiles/algún-portátil
Seleccioné la opción Base personalizada en mis Ajustes de Enlaces Permanentes, escribí /%product-cat%/
en el campo y guardé. Luego agregué el siguiente código al archivo functions.php
de mi tema:
add_filter('post_type_link', 'category_slug_in_product_permalink', 10, 2);
function category_slug_in_product_permalink($permalink, $post) {
if($post->post_type == 'product') {
$categories = wp_get_object_terms($post->ID, 'product_cat');
$permalink = str_replace('%product-cat%', $categories[0]->slug, $permalink);
}
return $permalink;
}
El código funciona bien y veo que los enlaces permanentes de productos ahora son exactamente como los necesito.
Pero cuando hago clic en cualquiera de los enlaces, recibo el error 400 Bad Request. Según leí en el enlace wordpress.stackexchange.com/a/334902 el filtro post_type_link
solo cambia las URLs, pero "no cambia ninguna regla de reescritura y la estructura de los enlaces permanentes sigue siendo la misma".
Entonces, ¿cómo puedo resolver esta segunda parte del problema?
Encontré menciones sobre $GLOBALS['wp_rewrite']
, 'slug' => '%...%', 'with_front' => false
y similares, pero no encontré una solución completa que funcione o simplemente no sé cómo usar las existentes
Bien, entonces el segundo código es:
function custom_rewrite_basic() {
$prodCatArgs = ['taxonomy' => 'product_cat'];
$wooCats = get_categories($prodCatArgs);
$catSlugs = [];
foreach($wooCats as $wooCat) {
$catSlugs[] = $wooCat->slug;
}
add_rewrite_rule(
'^('.implode('|', $catSlugs).')/([^/]*)/?',
'index.php?post_type=product&category=$matches[1]&product=$matches[2]',
'top'
);
flush_rewrite_rules();
}
add_action('init', 'custom_rewrite_basic');

Alternativamente, puedes usar mi plugin y ajustar los enlaces permanentes de los productos directamente desde el panel de administración de WordPress.
- Primero, necesitas instalar Permalink Manager Lite desde el Directorio de Plugins de WordPress.
- Luego, debes ir a la página de administración "Herramientas -> Permalink Manager -> Permaestructuras" y desplazarte hasta "Productos".
- Ahora, deberías reemplazar el formato de enlace permanente predeterminado con: %product_cat%/%product%
- Los nuevos ajustes de permaestructura se aplicarán solo a los nuevos productos, pero si lo necesitas, puedes regenerar los enlaces permanentes de los productos antiguos en la sección "Herramientas -> Permalink Manager -> Herramientas -> Regenerar/Reiniciar".
Puedes encontrar las instrucciones completas aquí: https://permalinkmanager.pro/docs/tutorials/taxonomy-slugs-in-custom-post-type-permalinks/
