walker_nav_menu_start_el
云策文档标注
概述
walker_nav_menu_start_el 是一个 WordPress 过滤器钩子,用于修改导航菜单项起始输出的 HTML。它允许开发者在菜单项输出中添加自定义内容,如额外 HTML 元素或基于条件的子菜单。
关键要点
- 过滤器钩子名称:walker_nav_menu_start_el,在 Walker_Nav_Menu::start_el() 中调用。
- 参数:$item_output(菜单项起始 HTML 输出)、$menu_item(菜单项数据对象,可能是 WP_Post 或 stdClass)、$depth(菜单项深度)、$args(wp_nav_menu() 参数对象)。
- 用途:过滤菜单项输出,仅包括 $args->before、打开 <a> 标签、标题、关闭 <a> 标签和 $args->after,无直接过滤器修改 <a> 标签的开闭。
- 注意事项:$menu_item 可能为 stdClass,避免严格类型检查;可结合 wp_nav_menu() 参数(如 menu_class、depth)进行高级定制。
代码示例
add_filter( 'walker_nav_menu_start_el', 'wpdocs_menu_item_custom_output', 10, 4 );
function wpdocs_menu_item_custom_output( $item_output, $item, $depth, $args ) {
$menu_item_classes = $item->classes;
if ( empty( $menu_item_classes ) || !in_array( 'menu-item-target', $menu_item_classes ) ) {
return $item_output;
}
ob_start();
?>
<div class="custom-sub-menu">
<ul>
<li><a href="#">Custom sub-menu item</a></li>
</ul>
</div>
<?php
$custom_sub_menu_html = ob_get_clean();
$item_output .= $custom_sub_menu_html;
return $item_output;
}
原文内容
Filters a menu item’s starting output.
Description
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.
Parameters
$item_outputstring-
The menu item’s starting HTML output.
$menu_itemWP_Post-
Menu item data object.
$depthint-
Depth of menu item. Used for padding.
$argsstdClass-
An object of wp_nav_menu() arguments.
More Arguments from wp_nav_menu( … $args )
Array of nav menu arguments.
menuint|string|WP_TermDesired menu. Accepts a menu ID, slug, name, or object.menu_classstringCSS class to use for the ul element which forms the menu.
Default'menu'.menu_idstringThe ID that is applied to the ul element which forms the menu.
Default is the menu slug, incremented.containerstringWhether to wrap the ul, and what to wrap it with.
Default'div'.container_classstringClass that is applied to the container.
Default ‘menu-{menu slug}-container’.container_idstringThe ID that is applied to the container.container_aria_labelstringThe aria-label attribute that is applied to the container when it’s a nav element.fallback_cbcallable|falseIf the menu doesn’t exist, a callback function will fire.
Default is'wp_page_menu'. Set to false for no fallback.beforestringText before the link markup.afterstringText after the link markup.link_beforestringText before the link text.link_afterstringText after the link text.echoboolWhether to echo the menu or return it. Default true.depthintHow many levels of the hierarchy are to be included.
0 means all. Default 0.
Default 0.walkerobjectInstance of a custom walker class.theme_locationstringTheme location to be used. Must be registered with register_nav_menu() in order to be selectable by the user.items_wrapstringHow the list items should be wrapped. Uses printf() format with numbered placeholders. Default is a ul with an id and class.item_spacingstringWhether to preserve whitespace within the menu’s HTML.
Accepts'preserve'or'discard'. Default'preserve'.
Source
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $menu_item, $depth, $args );
Changelog
| Version | Description |
|---|---|
| 3.0.0 | Introduced. |
Skip to note 3 content
damchtlv
This hook is useful when you want to add extra html to a menu item output.
Example: add a custom sub menu based on a menu item that has a class “menu-item-target”
/** * Menu items - Add "Custom sub-menu" in menu item render output * if menu item has class "menu-item-target" */ add_filter( 'walker_nav_menu_start_el', 'wpdocs_menu_item_custom_output', 10, 4 ); function wpdocs_menu_item_custom_output( $item_output, $item, $depth, $args ) { $menu_item_classes = $item->classes; if ( empty( $menu_item_classes ) || !in_array( 'menu-item-target', $menu_item_classes ) ) { return $item_output; } ob_start(); ?> <ul class="custom-sub-menu"> <li class="custom-menu-item"> <a href="#custom-url"> </a> </li> </ul> element of the menu item targeted $item_output .= $custom_sub_menu_html; return $item_output; }Skip to note 4 content
Jansen Tolle
Note that $menu_item is not always a WP_Post but often gets sent in as stdClass, so don’t try to use any strict typing here.