Мне очень часто приходилось сталкиваться с тем, что возможностей функции wp_nav_menu() не хватало для того, чтобы получить то меню, которое мне было нужно.
Иногда проблема решалась при помощи волкера, иногда при помощи не всем известной wp_get_nav_menu_items(), но порой приходилось придумывать более изощрённые способы вывода пунктов. В ходе одного из таких способов я и использовал функцию, которую вы видите ниже.
Преимущество функции в том, что она не делает запросов в базу данных или куда-то ещё, а работает с уже предоставленным ей списком элементов, алгоритм такой:
- Предоставляем функции параметр
$nav_menu_items
— массив объектов элементов меню, который очень удобно получить при помощи wp_get_nav_menu_items(). - Указываем в параметрах также ID элемента, дочерние элементы которого нужно получить.
- Из предоставленного массива функция отбирает нужные нам элементы и возвращает их также в виде массива объектов.
/** * Возвращает дочерние элементы пункта меню * * @param целое ID родительского элемента * @param массив Массив объектов элементов меню, по которым будет проходить отбор * @param логическое Нужно ли учитывать дочерние элементы всех уровней вложенности * @return массив Массив объектов дочерних элементов */ function true_get_nav_menu_children_items( $parent_id, $nav_menu_items, $dpth = true ) { $dochernie = array(); foreach ( (array) $nav_menu_items as $nav_item ) { if ( $nav_item->menu_item_parent == $parent_id ) { $dochernie[] = $nav_item; // если вам не нужны дочерние всех уровней вложенности, то даже можете удалить следующие 5 строк кода if ( $dpth ) { if ( $dch = get_nav_menu_item_children( $nav_item->ID, $nav_menu_items ) ) $dochernie = array_merge( $dochernie, $dch ); } } } } return $dochernie; } |
Вот по сути и всё — добавляете её в functions.php
и потом где хотите используете на сайте.
Источник: misha.blog