函数文档

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.

  • menu int|string|WP_Term
    Desired menu. Accepts a menu ID, slug, name, or object.
  • menu_class string
    CSS class to use for the ul element which forms the menu.
    Default 'menu'.
  • menu_id string
    The ID that is applied to the ul element which forms the menu.
    Default is the menu slug, incremented.
  • container string
    Whether to wrap the ul, and what to wrap it with.
    Default 'div'.
  • container_class string
    Class that is applied to the container.
    Default ‘menu-{menu slug}-container’.
  • container_id string
    The ID that is applied to the container.
  • container_aria_label string
    The aria-label attribute that is applied to the container when it’s a nav element.
  • fallback_cb callable|false
    If the menu doesn’t exist, a callback function will fire.
    Default is 'wp_page_menu'. Set to false for no fallback.
  • before string
    Text before the link markup.
  • after string
    Text after the link markup.
  • link_before string
    Text before the link text.
  • link_after string
    Text after the link text.
  • echo bool
    Whether to echo the menu or return it. Default true.
  • depth int
    How many levels of the hierarchy are to be included.
    0 means all. Default 0.
    Default 0.
  • walker object
    Instance of a custom walker class.
  • theme_location string
    Theme location to be used. Must be registered with register_nav_menu() in order to be selectable by the user.
  • items_wrap string
    How the list items should be wrapped. Uses printf() format with numbered placeholders. Default is a ul with an id and class.
  • item_spacing string
    Whether to preserve whitespace within the menu’s HTML.
    Accepts 'preserve' or 'discard'. Default 'preserve'.

Return

string The HTML list content for the menu items.

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.

User Contributed Notes

  1. Skip to note 2 content

    Add a metabox to WordPress nav-menu and add two predefined links (login, logout).

    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;
      // Create an array of objects that imitate Post objects
      $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' => '',
        ),
        (object) array(
            'ID' => 1,
            'object_id' => 1,
            'type_label' => 'Logout',
            'title' => 'Logout',
            'url' => wp_logout_url(),
            'type' => 'custom',
            'object' => 'plugin-slug-slug',
            'db_id' => 0,
            'menu_item_parent' => 0,
            'post_parent' => 0,
            'target' => '',
            'attr_title' => '',
            'description' => '',
            'classes' => array(),
            'xfn' => '',
        ),
      );
    
      $db_fields = false;
      // If your links will be hierarchical, adjust the $db_fields array below
      if ( false ) { 
        $db_fields = array( 'parent' => 'parent', 'id' => 'post_parent' ); 
      }
    
      $walker = new Walker_Nav_Menu_Checklist( $db_fields );
      $removed_args = array( 'action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce', );
      ?>
      
      $walker ) ); ?>

    <input type="submit" class="button-secondary submit-add-to-menu right" value="" name="add-plugin-slug-menu-item" id="submit-plugin-slug-div" />

You must log in before being able to contribute a note or feedback.