walk_nav_menu_tree( array $items, int $depth, stdClass $args ): string

Retrieves the HTML list content for nav menu items.


$items array Required
The menu items, sorted by each menu item's menu order.
$depth int Required
Depth of the item in reference to parents.
$args stdClass Required
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'.

Top ↑


string The HTML list content for the menu items.

Top ↑


File: wp-includes/nav-menu-template.php. View all references

function walk_nav_menu_tree( $items, $depth, $args ) {
	$walker = ( empty( $args->walker ) ) ? new Walker_Nav_Menu() : $args->walker;

	return $walker->walk( $items, $depth, $args );

Top ↑


Version Description
3.0.0 Introduced.

Top ↑

User Contributed Notes

  1. Skip to note 1 content
    Contributed by BlackSwan

    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', );
      <div id="plugin-slug-div">
        <div id="tabs-panel-plugin-slug-all" class="tabs-panel tabs-panel-active">
        <ul id="plugin-slug-checklist-pop" class="categorychecklist form-no-clear" >
          <?php echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $my_items ), 0, (object) array( 'walker' => $walker ) ); ?>
        <p class="button-controls">
          <span class="add-to-menu">
            <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-plugin-slug-menu-item" id="submit-plugin-slug-div" />
            <span class="spinner"></span>

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