Snippet para agregar todas las categorias de producto a un menu respetando jerarquia

Snippet para agregar todas las categorias respetando las jerarquias:

<?php

function agregar_categorias_productos_recursivamente($menu_id, $categorias, $menu_item_ids, $parent_id = 0) {
    foreach ($categorias as $categoria) {
        if ($categoria->parent == $parent_id) {
            // Si la categoría tiene un padre, busca su ID de menú
            $menu_item_parent_id = isset($menu_item_ids[$categoria->parent]) ? $menu_item_ids[$categoria->parent] : 0;

            // Crear el elemento del menú
            $menu_item_id = wp_update_nav_menu_item($menu_id, 0, [
                'menu-item-title'      => $categoria->name,
                'menu-item-url'        => get_term_link($categoria->term_id, 'product_cat'),
                'menu-item-status'     => 'publish',
                'menu-item-parent-id'  => $menu_item_parent_id,
                'menu-item-type'       => 'taxonomy',
                'menu-item-object'     => 'product_cat',
                'menu-item-object-id'  => $categoria->term_id,
            ]);

            // Almacenar el ID del elemento del menú
            $menu_item_ids[$categoria->term_id] = $menu_item_id;

            // Llamar recursivamente para agregar subcategorías
            agregar_categorias_productos_recursivamente($menu_id, $categorias, $menu_item_ids, $categoria->term_id);
        }
    }
}

function agregar_categorias_productos_al_menu($menu_id) {
    // Obtén todas las categorías de productos
    $categorias = get_terms([
        'taxonomy'   => 'product_cat',
        'orderby'    => 'name',
        'order'      => 'ASC',
        'hide_empty' => false,
    ]);

    // Mapa para mantener la jerarquía de ID de menú
    $menu_item_ids = [];

    // Comienza con los elementos raíz (parent_id = 0)
    agregar_categorias_productos_recursivamente($menu_id, $categorias, $menu_item_ids);
}



// Hook para ejecutar la función al crear el menú
add_action('init', function () {

	$menu_id = 73;

    // Limpiar el menú antes de agregar categorías
    $menu_items = wp_get_nav_menu_items($menu_id);
    if (!empty($menu_items)) {
        foreach ($menu_items as $menu_item) {
            wp_delete_post($menu_item->ID, true);
        }
    }

    // Agregar categorías al menú
    agregar_categorias_productos_al_menu($menu_id);
});

Leave a Comment