walker_nav_menu_start_el
Позволяет изменить вывод начального элемента пункта меню.
Начальный элемент пункта меню по умолчанию формируется так (код из ядра):
$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', 'wp_kama_walker_nav_menu_start_el_filter', 10, 4 ); /** * Function for `walker_nav_menu_start_el` filter-hook. * * @param string $item_output The menu item's starting HTML output. * @param WP_Post $menu_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. * * @return string */ function wp_kama_walker_nav_menu_start_el_filter( $item_output, $menu_item, $depth, $args ){ // filter... return $item_output; }
- $item_output(строка)
- HTML код начального элемента пункта меню (<a>...</a>).
- $item(WP_Post)
Объект текущего пункта меню. Пример:
- $depth(число)
- Уровень пункта меню. Используется для отступов. Верхние пункты меню имеют $depth = 0, вложенные в них $depth = 1 и так далее. Добавлен в версии 4.1.0.
- $args(stdClass)
Объект с параметрами из функции wp_nav_menu(). Пример:
Примеры
#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>
Список изменений
С версии 3.0.0 | Введена. |
Где вызывается хук
walker_nav_menu_start_el
wp-includes/class-walker-nav-menu.php 293
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $menu_item, $depth, $args );