WordPress Как получить все дочерние элементы меню?

У меня есть задача на реализацию меню для WP специфического вида. (С изображениями записи и кратким описанием в пунктах этого меню второго уровня) Краткий пример меню...

<ul class="menu">
  <li><a href="#0">About</a></li>
  <li class="has-mega-menu">
    <a href="#">Vehicles</a>
    <ul class="mega-menu">
      <li>
        <div class="container">
          <a class="menu-vehicle-card" href="#0">
            <div class="menu-vehicle-card__image">
              <img src="img/img-32.jpg" alt="image description" srcset="img/[email protected] 2x">
            </div>
            <div class="menu-vehicle-card__text">
              <h4>Elite Vehicles</h4>
              <p>The biggest and best! The cost matches the size but so does its impression.</p>
            </div>
          </a>
          <a class="menu-vehicle-card" href="#0">
            <div class="menu-vehicle-card__image">
              <img src="img/img-32.jpg" alt="image description" srcset="img/[email protected] 2x">
            </div>
            <div class="menu-vehicle-card__text">
              <h4>Gamers</h4>
              <p>Hustlers &amp; go-getters! Hard hitters that over-achieve through second effort.</p>
            </div>
          </a>
        </div>
      </li>
    </ul>
  </li>
</ul>

Поскольку с Walker_Nav_Menu у меня что-то не заладилось... то пришел к решению создания свого уникального шаблона. <?php am_get_main_menu_view(); ?>

Полностью все меню выглядит так


function is_current_item($menu_item) {
    global $is_blog;
    $trim_url = trim($menu_item->url, '/');
    if ($is_blog && strpos($trim_url, 'blog') !== false) {
        return true;
    }
    return $trim_url && !in_array($trim_url, ['#', '#!', '!#', 'javascript:void(0)']) && $trim_url === am_get_current_url();
}

function am_get_main_menu_view() {
    $menu_name = 'mainmenu';

    $menu_view = '';

    if (($locations = get_nav_menu_locations()) && isset($locations[$menu_name])) {
        $menu = wp_get_nav_menu_object($locations[$menu_name]);
        $menu_items = wp_get_nav_menu_items($menu->term_id);

        $menu_view .= '<div class="menu-drop">';
        $menu_view .= '<nav class="menu-drop__wrap">';
        $menu_view .= '<ul class="menu">';

        foreach ((array) $menu_items as $key => $menu_item) {
            $menu_view .= am_get_sub_menus_view($menu_item, $menu_name);
        }

        $menu_view .= '</ul>';
        $menu_view .= '</nav>';
        $menu_view .= '</div>';
    }
    echo do_shortcode($menu_view);
}

function am_get_sub_menus_view($menu_item, $menu_name) {
    $submenus_view = '';
    $menu_item_class = 'menu-item';
    $menu_item_class .= is_current_item($menu_item) ? ' current-menu-item' : '';


    // Get child menu items of current menu item
    $menu_items = wp_get_nav_menu_items($menu_name); // Получение всех элементов меню
    $parent_id = $menu_item->ID; // ID родительского пункта меню

    $children_items = array();

    // Добавьте проверку перед циклом
    if ($menu_items && is_array($menu_items)) {
        foreach ($menu_items as $item) {
            if ($item->menu_item_parent == $parent_id) {
                $children_items[] = $item;
            }
        }
    }



        if ($children_items) {
            $menu_item_class .= ' has-mega-menu';

            $submenus_view .= '<ul class="mega-menu">';
            $submenus_view .= '<li>';
            $submenus_view .= '<div class="container">';

            $submenus_view .= '<div class="points-holder">';
            foreach ($children_items as $child_item) {
                $_link = [
                    'url' => $child_item->url,
                    'title' => $child_item->title,
                ];

                $submenus_view .= '<a class="menu-vehicle-card" href="' . $_link['url'] . '">';

                // Assuming you have ACF fields for icon and description
                $icon = get_field('image_item', $child_item->ID);
                $description = get_field('menu_item_desc', $child_item->ID);

                if ($icon) {
                    $submenus_view .= '<div class="menu-vehicle-card__image">';
                    $submenus_view .= '<img src="' . $icon . '" />';
                    $submenus_view .= '</div>';
                }

                $submenus_view .= '<div class="menu-vehicle-card__text">';
                $submenus_view .= '<h4>' . $_link['title'] . '</h4>';

                if ($description) {
                    $submenus_view .= '<p>' . $description . '</p>';
                }

                $submenus_view .= '</div>';

                $submenus_view .= '</a>';
            }

            $submenus_view .= '</div>';
            $submenus_view .= '</div>';

            // Additional logic for other columns or sections here

            $submenus_view .= '</li>';
            $submenus_view .= '</ul>';
        }


    $view = '<li class="' . $menu_item_class . '">';
    $view .= '<a href="' . $menu_item->url . '" target="' . $menu_item->target . '">' . $menu_item->title . '</a>';
    $view .= $submenus_view;
    $view .= '</li>';

    return $view;
}

Столкнулся с проблемой, что не получаеться получить все дочерние элементы списка меню для формирования вложенности. $menu_items = wp_get_nav_menu_items($menu_name); Подскажите, что я делаю не так ?


Ответы (0 шт):