WordPress как на ладони
Официальная конференция по WordPress в Moскве 18-19 августа, начало в 9:00 wordpress jino

walker_nav_menu_start_el хук-фильтр . WP 3.0.0

Позволяет изменить вывод начального элемента пункта меню.

Начальный элемент пункта меню по умолчанию формируется так (код из ядра):

$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . $title . $args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;

То есть фильтр пропускает через себя сформированный html код ссылки пункта меню с включенным в него значениями параметров before, link_before, link_after и after.

В настоящее время нет фильтра для изменения <li> и </li> у элемента меню, чтобы это сделать приходится писать свой аналог класса Walker_Nav_Menu.

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

add_filter( 'walker_nav_menu_start_el', 'filter_function_name_2880', 10, 4 );
function filter_function_name_2880( $item_output, $item, $depth, $args ){
	// Изменяем...

	return $item_output;
}
$item_output(строка)
HTML код начального элемента пункта меню (<a>...</a>).
$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] => 
)
$depth(число)
Уровень пункта меню. Используется для отступов. Верхние пункты меню имеют $depth = 0, вложенные в них $depth = 1 и так далее. Добавлен в версии 4.1.0.
$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
)

Примеры

#1 Обернем ссылки в контейнер div

add_filter( 'walker_nav_menu_start_el', 'filter_walker_nav_menu_start_el', 10, 4 );

function filter_walker_nav_menu_start_el( $item_output, $item, $depth, $args ) {
	return '<div class="wrap-link">' . $item_output . '</div>';
}

Пусть меню со структурой:

  • Овощи
  • Моя статья
    • Ещё статья

И имеет html код:

<div class="menu-vtoroe-menyu-container">
	<ul id="menu-vtoroe-menyu" class="menu">
		<li id="menu-item-317" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-317">
			<a href="http://wp-test.ru/category/ovoshhi">Овощи</a>
		</li>
		<li id="menu-item-322" class="menu-item menu-item-type-post_type menu-item-object-post menu-item-has-children menu-item-322">
			<a href="http://wp-test.ru/moya-statya">Моя статья</a>
			<ul class="sub-menu">
				<li id="menu-item-321" class="menu-item menu-item-type-post_type menu-item-object-post menu-item-321">
					<a href="http://wp-test.ru/eshhyo-statya">Ещё статья</a>
				</li>
			</ul>
		</li>
	</ul>
</div>

Тогда при применении фильтра из примера html код станет:

<div class="menu-vtoroe-menyu-container">
	<ul id="menu-vtoroe-menyu" class="menu">
		<li id="menu-item-317" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-317">
			<div class="wrap-link">
				<a href="http://wp-test.ru/category/ovoshhi">Овощи</a>
			</div>
		</li>
		<li id="menu-item-322" class="menu-item menu-item-type-post_type menu-item-object-post menu-item-has-children menu-item-322">
			<div class="wrap-link">
				<a href="http://wp-test.ru/moya-statya">Моя статья</a>
			</div>
			<ul class="sub-menu">
				<li id="menu-item-321" class="menu-item menu-item-type-post_type menu-item-object-post menu-item-321">
					<div class="wrap-link">
						<a href="http://wp-test.ru/eshhyo-statya">Ещё статья</a>
					</div>
				</li>
			</ul>
		</li>
	</ul>
</div>

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

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

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

Фрагмент из: wp-includes/class-walker-nav-menu.php VER 4.9.8
...

		/**
		 * Filters a menu item's starting output.
		 *
		 * The menu item's starting output only includes `$args->before`, the opening `<a>`,
		 * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is
		 * no filter for modifying the opening and closing `<li>` for a menu item.
		 *
		 * @since 3.0.0
		 *
		 * @param string   $item_output The menu item's starting HTML output.
		 * @param WP_Post  $item        Menu item data object.
		 * @param int      $depth       Depth of menu item. Used for padding.
		 * @param stdClass $args        An object of wp_nav_menu() arguments.
		 */
		$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
	}

	/**
	 * Ends the element output, if needed.
	 *
	 * @since 3.0.0
	 *
	 * @see Walker::end_el()
	 *
	 * @param string   $output Used to append additional content (passed by reference).
	 * @param WP_Post  $item   Page data object. Not used.
	 * @param int      $depth  Depth of page. Not Used.
	 * @param stdClass $args   An object of wp_nav_menu() arguments.
	 */
	public function end_el( &$output, $item, $depth = 0, $args = array() ) {
...
campusboy 2945youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться