Una de las funcionalidades que más echo en falta siempre al programar una tienda online en Woocommerce es la sincronización entre las categorías de productos y el menú de la parte pública de la web.
Tener la flexibilidad de poner las categorías que desees en el menú es un gran plus, pero a la vez, es un gran problema si no es necesario.
Surfeando por la red encontré este código que tan útil es, y resuelve este problema. Debes añadir este código en el archivo functions.php de tu tema. Es muy sencillo de usar:
- Simplemente hay que cambiar
$menu->term_id == 3por el ID del menú en el que deseas mostrar las categorías de la tienda online. - Debes poner al menos las categorías principales en el menú. Automáticamente, las subcategorías de todos los niveles se añadirán a la categoría padre, si está.
/** CÓDIGO PARA HACER EL MENÚ DE WOOCOMMERCE AUTOMÁTICO, EN BASE A CATEGORÍAS */
/**
* Simple helper function for make menu item objects
*
* @param $title - menu item title
* @param $url - menu item url
* @param $order - where the item should appear in the menu
* @param int $parent - the item's parent item
* @return \stdClass
*/
function LM_crea_menu_desde_categorias_woocommerce_populate_item( $title, $url, $order, $parent = 0 ){
$item = new stdClass();
$item->ID = 1000000 + $order + $parent;
$item->db_id = $item->ID;
$item->title = $title;
$item->url = $url;
$item->menu_order = $order;
$item->menu_item_parent = $parent;
$item->type = '';
$item->object = '';
$item->object_id = '';
$item->classes = array();
$item->target = '';
$item->attr_title = '';
$item->description = '';
$item->xfn = '';
$item->status = '';
return $item;
}
add_filter("wp_get_nav_menu_items", function ($items, $menu, $args) {
// Si el ID menú es el principal
if( $menu->term_id == 3) {
// don't add child categories in administration of menus
if (is_admin()) { return $items; }
$ctr = ($items[sizeof($items)-1]->ID)+1;
foreach ($items as $index => $i)
{
if ("product_cat" !== $i->object) {
continue;
}
$menu_parent = $i->ID;
$terms = get_terms( array('taxonomy' => 'product_cat', 'parent' => $i->object_id ) );
foreach ($terms as $term) {
$new_item = LM_crea_menu_desde_categorias_woocommerce_populate_item( $term->name, get_term_link($term), $ctr, $menu_parent );
$items[] = $new_item;
$new_id = $new_item->ID;
$ctr++;
$terms_child = get_terms( array('taxonomy' => 'product_cat', 'parent' => $term->term_id ) );
if(!empty($terms_child))
{
foreach ($terms_child as $term_child)
{
$new_child = LM_crea_menu_desde_categorias_woocommerce_populate_item( $term_child->name, get_term_link($term_child), $ctr, $new_id );
$items[] = $new_child;
$ctr++;
}
}
}
}
}
return $items;
}, 10, 3);