WordPress как на ладони
WordCamp Saint Petersburg 2018 wordpress jino

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

Позволяет изменить отсортированный список объектов пунктов меню, прежде чем на их основе будет сгенерирован HTML-код меню.

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

add_filter( 'wp_nav_menu_objects', 'filter_function_name_8034', 10, 2 );
function filter_function_name_8034( $sorted_menu_items, $args ){
	// Делаем что-либо...

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

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

wp_nav_menu() остальные хуки:

Код хука-фильтра wp_nav_menu_objects

Фрагмент из: wp-includes/nav-menu-template.php VER 4.9.6
...
			if ( isset( $menu_items_with_children[ $menu_item->ID ] ) )
				$menu_item->classes[] = 'menu-item-has-children';
		}
	}

	unset( $menu_items, $menu_item );

	/**
	 * Filters the sorted list of menu item objects before generating the menu's HTML.
	 *
	 * @since 3.1.0
	 *
	 * @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.
	 */
	$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );

	$items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );
	unset($sorted_menu_items);

	// Attributes
	if ( ! empty( $args->menu_id ) ) {
		$wrap_id = $args->menu_id;
	} else {
		$wrap_id = 'menu-' . $menu->slug;
		while ( in_array( $wrap_id, $menu_id_slugs ) ) {
			if ( preg_match( '#-(\d+)$#', $wrap_id, $matches ) )
				$wrap_id = preg_replace('#-(\d+)$#', '-' . ++$matches[1], $wrap_id );
			else
				$wrap_id = $wrap_id . '-1';
		}
...
campusboy 2782youtube.com/c/wpplus
Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Комментариев нет

    Здравствуйте, !