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. І порядковий номер елемента меню додається до об’єкта елемента в нову властивість $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 з однаковими полями (поля меню).

Багато полів просто не потрібні і не мають сенсу, тому що ставляться до записів. Використовуйте останні значення з 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-sylka-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.0.2

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

	if ( ! $menu ) {
		return false;
	}

	static $fetched = array();

	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,
		'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();
	}

	// Prime posts and terms caches.
	if ( empty( $fetched[ $menu->term_id ] ) ) {
		$fetched[ $menu->term_id ] = true;
		$post_ids = array();
		$term_ids = array();
		foreach ($ items as $ item) {
			$object_id = get_post_meta( $item->ID, '_menu_item_object_id', true );
			$type = get_post_meta( $item->ID, '_menu_item_type', true );

			if ( 'post_type' === $type ) {
				$post_ids[] = (int) $object_id;
			} elseif ( 'taxonomy' === $type ) {
				$term_ids[] = (int) $object_id;
			}
		}

		if ( ! empty( $post_ids ) ) {
			_prime_post_caches($post_ids, false);
		}
		unset($post_ids);

		if ( ! empty( $term_ids ) ) {
			_prime_term_caches($term_ids);
		}
		unset ($ term_ids);
	}

	$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 navigation menu items being returned.
	 *
	 * @ Since 3.0.0
	 *
	 * @param array $items На array of menu item post objects.
	 * @param object $menu The menu object.
	 * @param array $args На array of arguments use retrieve menu item objects.
	 */
	return apply_filters( 'wp_get_nav_menu_items', $items, $menu, $args );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *