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 & 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); Подскажите, что я делаю не так ?