wp_nav_menu_objectsхук-фильтрWP 3.1.0

Позволяет изменить отсортированный список объектов пунктов меню, прежде чем на их основе будет сгенерирован 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().

Примеры

2

#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;
}
0

#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;
}
0

#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()
wp_nav_menu_objects
wp-includes/nav-menu-template.php 234
$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );

Где используется хук в WordPress

Использование не найдено.