wp_nav_menu_objects
Позволяет изменить отсортированный список объектов пунктов меню, прежде чем на их основе будет сгенерирован HTML-код меню.
Использование
add_filter( 'wp_nav_menu_objects', 'wp_kama_nav_menu_objects_filter', 10, 2 ); /** * Function for `wp_nav_menu_objects` filter-hook. * * @param array $sorted_menu_items The menu items, sorted by each menu item's menu order. * @param stdClass $args An object containing wp_nav_menu() arguments. * * @return array */ function wp_kama_nav_menu_objects_filter( $sorted_menu_items, $args ){ // filter... return $sorted_menu_items; }
- $sorted_menu_items(массив)
- Массив с объектами элементов меню, отсортированных по ключу
menu_order
. То есть порядок элементов повторяет порядок пунктов, выставленных в админ-панели при создании меню. - $args(stdClass)
- Объект параметров переданых функции wp_nav_menu().
Примеры
#1 Удалим один из пунктов меню
Задача: для авторизованных пользователей нужно удалить со всех меню пункты, ведущие на страницу авторизации. Зная ID этой страницы, это можно сделать так:
## Удалим один из пунктов меню add_filter( 'wp_nav_menu_objects', 'change_nav_menu_objects', 10, 2 ); function change_nav_menu_objects( $sorted_menu_items, $args ) { foreach ( $sorted_menu_items as $index => $item ) { if ( is_user_logged_in() && 'page' == $item->object && 214 == $item->object_id ) { unset( $sorted_menu_items[ $index ] ); } } return $sorted_menu_items; }
#2 Добавим родительским элементам меню свой css класс
add_filter( 'wp_nav_menu_objects', 'add_css_class_for_menu_item_has_child_elements' ); function add_css_class_for_menu_item_has_child_elements( $items ) { // Собираем ID пунктов меню, имеющих дочерние элементы $parents = wp_list_pluck( $items, 'menu_item_parent' ); foreach ( $items as $item ) { // Проверяем, относится ли к ним текущий в цикле пункт меню и добавляем css класс if ( in_array( $item->ID, $parents ) ) { $item->classes[] = 'has-child-elements'; } } return $items; }
#3 Добавим активному элементу меню свой css класс
Активным элементом меню называют тот, на чьей странице находится пользователь.
add_filter( 'wp_nav_menu_objects', 'add_css_class_for_current_menu_item' ); function add_css_class_for_current_menu_item( $items ) { foreach ( $items as $item ) { if ( $item->current ) { $item->classes[] = 'current-element'; } } return $items; }
Список изменений
С версии 3.1.0 | Введена. |
Где вызывается хук
wp_nav_menu_objects
wp-includes/nav-menu-template.php 234
$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );