Как вывести в под меню родителя?
Возник такой вопрос. Сделал меню вот код:
<?php if( $menu_items = wp_get_nav_menu_items('Меню') ) { $menu_list = ''; $current_class = ''; foreach ( (array)$menu_items as $key => $menu_item ) { if($menu_item->url == 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] || ($menu_item->url == site_url().'/' && substr_count(get_permalink(), 'p=') != 0 )){$current_class = 'active'; } else { $current_class = ''; } if($menu_items[$key+1]->menu_item_parent != 0 && $menu_items[$key]->menu_item_parent == 0){ if($menu_items[$key]->menu_item_parent == 0){ $link_class = 'hover-li'; }else{ $link_class = ''; } $menu_list .= '<li class="dropdown '.$current_class.'"><a class="dropdown-toggle tut" href="'.$menu_item->url.'">'.$menu_item->title.'<b class="mtm-bullet"></b></a><ul class="dropdown-menu">'; }else{ $menu_list .= '<li class="'.$current_class.'"><a href="'.$menu_item->url.'">'.$menu_item->title.'<b class="mtm-bullet"></b></a></li>'; if($menu_items[$key+1]->menu_item_parent == 0 && $menu_items[$key]->menu_item_parent != 0){ $menu_list .= '<div class="close-sub"><img src="https://www.endocrinolog.by/wp-content/uploads/2024/02/icons8-strelka-100.png" alt /></div></ul></li>'; } } } echo $menu_list; } ?> |
<?php if( $menu_items = wp_get_nav_menu_items('Меню') ) { $menu_list = ''; $current_class = ''; foreach ( (array)$menu_items as $key => $menu_item ) { if($menu_item->url == 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] || ($menu_item->url == site_url().'/' && substr_count(get_permalink(), 'p=') != 0 )){$current_class = 'active'; } else { $current_class = ''; } if($menu_items[$key+1]->menu_item_parent != 0 && $menu_items[$key]->menu_item_parent == 0){ if($menu_items[$key]->menu_item_parent == 0){ $link_class = 'hover-li'; }else{ $link_class = ''; } $menu_list .= '<li class="dropdown '.$current_class.'"><a class="dropdown-toggle tut" href="'.$menu_item->url.'">'.$menu_item->title.'<b class="mtm-bullet"></b></a><ul class="dropdown-menu">'; }else{ $menu_list .= '<li class="'.$current_class.'"><a href="'.$menu_item->url.'">'.$menu_item->title.'<b class="mtm-bullet"></b></a></li>'; if($menu_items[$key+1]->menu_item_parent == 0 && $menu_items[$key]->menu_item_parent != 0){ $menu_list .= '<div class="close-sub"><img src="https://www.endocrinolog.by/wp-content/uploads/2024/02/icons8-strelka-100.png" alt /></div></ul></li>'; } } } echo $menu_list; } ?>
Он мне выводит вот в таком формате:
Родитель 1
Родитель 2
--Дочерний 1
--Дочерний 2
Родитель 3
А как сделать чтобы я мог вывести так:
Родитель 1
Родитель 2
--Родитель 2
--Дочерний 1
--Дочерний 2
Родитель 3
Дополнительно
А создать меню нормальным средствами ВП - религия не позволяет?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В меню WordPress у каждого пункта есть
ID,menu_item_parent,title,url. Чтобы вывести подменю родителя, не нужно сравнивать URL вручную и пытаться собирать всё одним плоским циклом. Сначала определите текущий пункт, затем найдите его родителя и отфильтруйте элементы, у которыхmenu_item_parentравен ID нужного родителя.Пример логики:
$items = wp_get_nav_menu_items('Меню'); $current_url = home_url(add_query_arg([], $wp->request)); $current_item = null; foreach ($items as $item) { if (untrailingslashit($item->url) === untrailingslashit($current_url)) { $current_item = $item; break; } } if ($current_item) { $parent_id = $current_item->menu_item_parent ?: $current_item->ID; echo '<ul class="submenu">'; foreach ($items as $item) { if ((int) $item->menu_item_parent === (int) $parent_id) { printf( '<li><a href="%s">%s</a></li>', esc_url($item->url), esc_html($item->title) ); } } echo '</ul>'; }
Если текущая страница сама является родителем, выводятся её дети. Если текущая страница является дочерним пунктом, выводятся пункты того же уровня. Для сложных многоуровневых меню лучше сначала построить дерево по
menu_item_parent, а потом уже выводить нужную ветку. Сравнение через$_SERVER['HTTP_HOST']хрупкое: слэш в конце, http/https, query-параметры и зеркало сайта легко ломают совпадение.Если нужно подсветить текущий пункт, добавьте сравнение ID текущего элемента и выводите класс только при совпадении. Для страниц WordPress иногда надёжнее сравнивать не URL, а связанный объект меню: у пункта есть
object_id. Если меню содержит произвольные ссылки, тогда URL всё равно нужен, но нормализуйте его черезuntrailingslashit(). Для большого меню результатwp_get_nav_menu_items()можно закэшировать транзиентом, но обычно это не требуется.