nav_menu_item_idхук-фильтрWP 3.0.1

Позволяет изменить атрибут ID элемента <li> у пункта меню.

Чтобы удалить или изменить атрибут class у элемента меню, используйте фильтр nav_menu_css_class.

Код формирования атрибута ID для элемента <li> в движке:

$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

Это значит, что по умолчанию ID атрибут выглядит так: menu-item-{ID элемента пункта меню}. Но мы можем полностью изменить этот ID через этот фильтр. Если фильтр ничего не возвращает, то атрибут ID вообще не добавляется к элементу <li>.

Не забывайте, что ID атрибут тега должен быть уникальным на странице!

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

add_filter( 'nav_menu_item_id', 'wp_kama_nav_menu_item_id_filter', 10, 4 );

/**
 * Function for `nav_menu_item_id` filter-hook.
 * 
 * @param string   $menu_item_id The ID attribute applied to the menu item's `<li>` element.
 * @param WP_Post  $menu_item    The current menu item.
 * @param stdClass $args         An object of wp_nav_menu() arguments.
 * @param int      $depth        Depth of menu item. Used for padding.
 *
 * @return string
 */
function wp_kama_nav_menu_item_id_filter( $menu_item_id, $menu_item, $args, $depth ){

	// filter...
	return $menu_item_id;
}
$menu_id(строка)
ID элемента <li> пункта меню.
$item(WP_Post)

Объект текущего пункта меню. Пример:

WP_Post Object(
	[ID] => 265
	[post_author] => 1
	[post_date] => 2018-04-07 09:45:46
	[post_date_gmt] => 2018-04-07 06:45:46
	[post_content] =>
	[post_title] => Обратная связь
	[post_excerpt] =>
	[post_status] => publish
	[comment_status] => closed
	[ping_status] => closed
	[post_password] =>
	[post_name] => 265
	[to_ping] =>
	[pinged] =>
	[post_modified] => 2018-04-19 00:20:29
	[post_modified_gmt] => 2018-04-18 21:20:29
	[post_content_filtered] =>
	[post_parent] => 0
	[guid] => http://wp-test.ru/?p=265
	[menu_order] => 1
	[post_type] => nav_menu_item
	[post_mime_type] =>
	[comment_count] => 0
	[filter] => raw
	[db_id] => 265
	[menu_item_parent] => 0
	[object_id] => 214
	[object] => page
	[type] => post_type
	[type_label] => Страница
	[url] => http://wp-test.ru/post-99
	[title] => Обратная связь
	[target] =>
	[attr_title] =>
	[description] =>
	[classes] => Array
		(
			[0] =>
			[1] => menu-item
			[2] => menu-item-type-post_type
			[3] => menu-item-object-page
		)

	[xfn] =>
	[current] =>
	[current_item_ancestor] =>
	[current_item_parent] =>
)
$args(stdClass)

Объект параметров из функции wp_nav_menu(). Пример:

stdClass Object
(
	[menu] => WP_Term Object
		(
			[term_id] => 21
			[name] => Моё первое меню
			[slug] => moe-pervoe-menu
			[term_group] => 0
			[term_taxonomy_id] => 21
			[taxonomy] => nav_menu
			[description] =>
			[parent] => 0
			[count] => 3
			[filter] => raw
		)

	[container] => div
	[container_class] =>
	[container_id] =>
	[menu_class] => primary-menu
	[menu_id] =>
	[echo] => 1
	[fallback_cb] => wp_page_menu
	[before] =>
	[after] =>
	[link_before] =>
	[link_after] =>
	[items_wrap] => <ul id="%1$s" class="%2$s">%3$s</ul>
	[item_spacing] => preserve
	[depth] => 0
	[walker] =>
	[theme_location] => primary
)
$depth(число)

Уровень пункта меню. Используется для отступов. Верхние пункты меню имеют $depth = 0, вложенные $depth = 1 и так далее.

Добавлен в версии 4.1.0.

Примеры

0

#1 Удалим атрибут ID у пункта(ов) меню

Удалить ID у всех пунктов меню на сайте:

add_filter( 'nav_menu_item_id', '__return_empty_string' );

Удалим id атрибут у всех пунктов меню, выводимых в области меню primary:

add_filter( 'nav_menu_item_id', 'change_menu_item_css_id', 10, 4 );

function change_menu_item_css_id( $menu_id, $item, $args, $depth ) {
	return $args->theme_location === 'primary' ? '' : $menu_id;
}

Заметки

  • C версии 4.1.0 был добавлен параметр $depth.

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

С версии 3.0.1 Введена.
С версии 4.1.0 The $depth parameter was added.

Где вызывается хук

Walker_Nav_Menu::start_el()
nav_menu_item_id
wp-includes/class-walker-nav-menu.php 189
$id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $menu_item->ID, $menu_item, $args, $depth );

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

wp-includes/default-filters.php 646
add_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 );