Sincronizar El Menú De Woocommerce Con Las Categorías De Productos

Sincronizar el menú de Woocommerce con las categorías de productos

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 == 3 por 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);