WordPress как на ладони

wp_get_nav_menu_items()WP 3.0.0

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

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

Передав название, 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

Примеры

0

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

#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 6.5.2

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

	if ( ! $menu ) {
		return false;
	}

	if ( ! taxonomy_exists( 'nav_menu' ) ) {
		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,
		'update_menu_item_cache' => true,
		'tax_query'              => array(
			array(
				'taxonomy' => 'nav_menu',
				'field'    => 'term_taxonomy_id',
				'terms'    => $menu->term_taxonomy_id,
			),
		),
	);
	$args     = wp_parse_args( $args, $defaults );
	if ( $menu->count > 0 ) {
		$items = get_posts( $args );
	} else {
		$items = array();
	}

	$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 );
}
13 комментариев
Полезные 2 Все
    Войти