Как вывести в под меню родителя?

Ссылка скопирована
PHP
1 ответ

Возник такой вопрос. Сделал меню вот код:

<?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

Дополнительно

А создать меню нормальным средствами ВП - религия не позволяет?

  • https://wp-kama.ru/function/walker_nav_menu
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Редакция DevOps Ответ

    В меню 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>';
    }

    $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() можно закэшировать транзиентом, но обычно это не требуется.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно