walk_nav_menu_tree()
云策文档标注
概述
walk_nav_menu_tree() 函数用于生成导航菜单项的 HTML 列表内容,通过调用 Walker 类(默认为 Walker_Nav_Menu)的 walk() 方法实现。它接受菜单项数组、深度和参数对象作为输入,返回格式化后的 HTML 字符串。
关键要点
- 核心功能:处理菜单项数组,生成层次化的 HTML 列表输出,常用于 wp_nav_menu() 内部。
- 参数说明:接受 $items(菜单项数组)、$depth(深度整数)和 $args(包含 wp_nav_menu() 参数的对象),其中 $args 可包含 menu_class、container、walker 等配置项。
- 返回值:返回菜单项的 HTML 列表内容字符串,可直接输出或进一步处理。
- 依赖关系:默认使用 Walker_Nav_Menu 类,但可通过 $args->walker 指定自定义 Walker 实例。
- 相关函数:与 wp_nav_menu()、Walker::walk() 等紧密关联,用于前端菜单渲染和后端管理界面。
代码示例
// 示例:自定义 metabox 添加登录/注销菜单项(来自用户贡献笔记)
add_action( 'admin_head-nav-menus.php', function() {
add_meta_box( 'plugin-slug-menu-metabox', "Wordpress Login/Logout", 'wpdocs_plugin_slug_render_menu_metabox', 'nav-menus', 'side', 'default', array( /*custom params*/ ) );
} );
function wpdocs_plugin_slug_render_menu_metabox( $object, $args ) {
global $nav_menu_selected_id;
$my_items = array(
(object) array(
'ID' => 1,
'object_id' => 1,
'type_label' => 'Login',
'title' => 'Login',
'url' => wp_login_url(),
'type' => 'custom',
'object' => 'plugin-slug-slug',
'db_id' => 0,
'menu_item_parent' => 0,
'post_parent' => 0,
'target' => '',
'attr_title' => '',
'description' => '',
'classes' => array(),
'xfn' => '',
),
// 类似结构定义 Logout 项...
);
$db_fields = false;
$walker = new Walker_Nav_Menu_Checklist( $db_fields );
// 输出 HTML 表单部分...
}注意事项
- 函数内部自动处理 Walker 实例:如果 $args->walker 为空,则默认使用 Walker_Nav_Menu。
- 参数 $args 应包含 wp_nav_menu() 支持的完整选项,如 menu_class、container 等,以确保正确渲染。
- 在自定义开发中,可通过扩展 Walker 类或修改 $args 来调整菜单输出行为,但需遵循 WordPress 核心结构。
原文内容
Retrieves the HTML list content for nav menu items.
Parameters
$itemsarrayrequired-
The menu items, sorted by each menu item’s menu order.
$depthintrequired-
Depth of the item in reference to parents.
$argsstdClassrequired-
An object containing 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
function walk_nav_menu_tree( $items, $depth, $args ) {
$walker = ( empty( $args->walker ) ) ? new Walker_Nav_Menu() : $args->walker;
return $walker->walk( $items, $depth, $args );
}
Changelog
| Version | Description |
|---|---|
| 3.0.0 | Introduced. |
Skip to note 2 content
BlackSwanDev
Add a metabox to WordPress nav-menu and add two predefined links (login, logout).
You must log in before being able to contribute a note or feedback.