WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

wp_get_nav_menu_items() WP 3.0

Получает элементы меню навигации в виде массива, который затем можно обработать.

Ищем WP-разработчика! Фулл-тайм, удаленка, хорошая зарплата, соц. пакет. Подробности.
Компания Boosta.

Возвращает все элементы (ссылки) указанного меню навигации, которое создается в панели: Внешний вид > Меню.

Передав название, ID или слаг меню, функция получит элементы меню навигации.

Работает на основе: wp_get_nav_menu_object()
1 раз — 0.015463 сек (тормоз) | 50000 раз — 124.89 сек (тормоз) | PHP 7.1.2, WP 4.7.3
Хуки из функции

Возвращает

Массив|false. Массив данных о ссылках. False, когда меню нет.

Шаблон использования

$items = wp_get_nav_menu_items( 5, [
	'output_key'  => 'menu_order',
] );

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

wp_get_nav_menu_items( $menu, $args );
$menu(строка/объект) (обязательный)
ID меню или объект меню (термина).
Идентификатор, который задается при регистрации меню (menu location) — указывать нельзя.
$args(массив)

Аргументы в виде массива, которые формируют выводимые данные.

  • $order(строка)
    Направление сортировки: ASC или DESC. Это параметр сортировки для запроса get_posts().
    По умолчанию: 'ASC'

  • $orderby(строка)
    Поле по которому сортировать. Это параметр для запроса get_posts().
    Дополнительное поле по которому сортировать также можно указать в параметре 'output_key'. Подробнее читайте в параметре $output_key.
    По умолчанию: 'menu_order'

  • $output(строка)
    В каком виде нужно получить элементы.

    При ARRAY_A к каждому элементу меню (объекту) добавиться еще одно свойство (поле сортировки). Название добавляемого свойства указывается в параметре $output_key. В значении нового свойства будет число - порядковый номер элемента меню. Также элементы меню будут отсортированы с помощью функции wp_list_sort() по полю $output_key с направлением ASC.

    Другими словами, при ARRAY_A, элементы меню сортируются отдельно, через функцию wp_list_sort(), по полю $output_key с направлением ASC. И порядковый номер элемента меню добавляется в объект элемента в новое свойство $item->$output_key
    По умолчанию: ARRAY_A

  • $output_key(строка)
    Ключ (поле) по которому сортировать элементы меню. Этот ключ не используется в get_posts(), а работает только в этой функции.
    По умолчанию: 'menu_order'

  • $post_type(строка)
    Тип записи, в котором сохраняются элементы меню.
    По умолчанию: 'nav_menu_item'

  • $post_status(строка)
    Статус записи, в которой сохраняются элементы меню.
    По умолчанию: 'publish'

  • $nopaging(true/false)
    Извлекать ли все пункты меню (true) или разбивать на страницы (false).
    По умолчанию: true

По умолчанию: дефолтные параметры

Примеры

#1. Пример построения простого списка меню

// Получим элементы меню на основе параметра $menu_name (тоже что и 'theme_location' или 'menu' в аргументах wp_nav_menu)
// Этот код - основа функции wp_nav_menu, где получается ID меню из слага

$menu_name = 'custom_menu_slug';
$locations = get_nav_menu_locations();

if( $locations && isset( $locations[ $menu_name ] ) ){

	// получаем элементы меню
	$menu_items = wp_get_nav_menu_items( $locations[ $menu_name ] );

	// создаем список
	$menu_list = '<ul id="menu-' . $menu_name . '">';

	foreach ( (array) $menu_items as $key => $menu_item ){
		$menu_list .= '<li><a href="' . $menu_item->url . '">' . $menu_item->title . '</a></li>';
	}

	$menu_list .= '</ul>';
}
else {
	$menu_list = '<ul><li>Меню "' . $menu_name . '" не определено.</li></ul>';
}

#2 Какие данные содержит возвращаемый объект

Не имеет значения какая ссылка добавлена в меню в админке: пост, таксономия или произвольная ссылка. Все они сохраняются в таблице wp_posts c одинаковыми полями (поля меню).

Многие из полей попросту не нужны и не имеют смысла, потому что относятся к записям. Используйте последние значения начиная с db_id они определяют пункт меню.

$items = wp_get_nav_menu_items( 654 );

print_r( $items );

/* выведет:
Array
(
	[1] => WP_Post Object
		(
			// это поля поста использовать их не универсально...
			[ID] => 6364
			[post_author] => 1
			[post_date] => 2015-12-06 12:20:18
			[post_date_gmt] => 2015-12-06 07:20:18
			[post_content] => 
			[post_title] => Произвольная ссылка 2
			[post_excerpt] => 
			[post_status] => publish
			[comment_status] => closed
			[ping_status] => closed
			[post_password] => 
			[post_name] => proizvolnaya-ssylka-2
			[to_ping] => 
			[pinged] => 
			[post_modified] => 2015-12-06 12:20:18
			[post_modified_gmt] => 2015-12-06 07:20:18
			[post_content_filtered] => 
			[post_parent] => 0
			[guid] => http://wp-kama.ru/id_6364/proizvolnaya-ssylka-2.html
			[menu_order] => 4
			[post_type] => nav_menu_item
			[post_mime_type] => 
			[comment_count] => 0
			[filter] => raw

			// это поля меню, используйте их
			[db_id] => 6364
			[menu_item_parent] => 0
			[object_id] => 6364
			[object] => custom
			[type] => custom
			[type_label] => Произвольная ссылка
			[title] => Произвольная ссылка 2
			[url] => http://example.com/foo
			[target] => 
			[attr_title] => 
			[description] => 
			[classes] => Array
				(
					[0] => 
				)

			[xfn] => 
		)
	[1] => WP_Post Object
		(
		... 
		)

)

*/

Список изменений

С версии 3.0.0 Введена.

Код wp_get_nav_menu_items() WP 5.8.2

function wp_get_nav_menu_items( $menu, $args = array() ) {
	$menu = wp_get_nav_menu_object( $menu );

	if ( ! $menu ) {
		return false;
	}

	static $fetched = array();

	$items = get_objects_in_term( $menu->term_id, 'nav_menu' );
	if ( is_wp_error( $items ) ) {
		return false;
	}

	$defaults        = array(
		'order'       => 'ASC',
		'orderby'     => 'menu_order',
		'post_type'   => 'nav_menu_item',
		'post_status' => 'publish',
		'output'      => ARRAY_A,
		'output_key'  => 'menu_order',
		'nopaging'    => true,
	);
	$args            = wp_parse_args( $args, $defaults );
	$args['include'] = $items;

	if ( ! empty( $items ) ) {
		$items = get_posts( $args );
	} else {
		$items = array();
	}

	// Get all posts and terms at once to prime the caches.
	if ( empty( $fetched[ $menu->term_id ] ) && ! wp_using_ext_object_cache() ) {
		$fetched[ $menu->term_id ] = true;
		$posts                     = array();
		$terms                     = array();
		foreach ( $items as $item ) {
			$object_id = get_post_meta( $item->ID, '_menu_item_object_id', true );
			$object    = get_post_meta( $item->ID, '_menu_item_object', true );
			$type      = get_post_meta( $item->ID, '_menu_item_type', true );

			if ( 'post_type' === $type ) {
				$posts[ $object ][] = $object_id;
			} elseif ( 'taxonomy' === $type ) {
				$terms[ $object ][] = $object_id;
			}
		}

		if ( ! empty( $posts ) ) {
			foreach ( array_keys( $posts ) as $post_type ) {
				get_posts(
					array(
						'post__in'               => $posts[ $post_type ],
						'post_type'              => $post_type,
						'nopaging'               => true,
						'update_post_term_cache' => false,
					)
				);
			}
		}
		unset( $posts );

		if ( ! empty( $terms ) ) {
			foreach ( array_keys( $terms ) as $taxonomy ) {
				get_terms(
					array(
						'taxonomy'     => $taxonomy,
						'include'      => $terms[ $taxonomy ],
						'hierarchical' => false,
					)
				);
			}
		}
		unset( $terms );
	}

	$items = array_map( 'wp_setup_nav_menu_item', $items );

	if ( ! is_admin() ) { // Remove invalid items only on front end.
		$items = array_filter( $items, '_is_valid_nav_menu_item' );
	}

	if ( ARRAY_A === $args['output'] ) {
		$items = wp_list_sort(
			$items,
			array(
				$args['output_key'] => 'ASC',
			)
		);

		$i = 1;

		foreach ( $items as $k => $item ) {
			$items[ $k ]->{$args['output_key']} = $i++;
		}
	}

	/**
	 * Filters the navigation menu items being returned.
	 *
	 * @since 3.0.0
	 *
	 * @param array  $items An array of menu item post objects.
	 * @param object $menu  The menu object.
	 * @param array  $args  An array of arguments used to retrieve menu item objects.
	 */
	return apply_filters( 'wp_get_nav_menu_items', $items, $menu, $args );
}

nav_menu (меню навигации)

Меню

13 комментов
Полезные 2 Все
    Войти