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

Retrieves the HTML list content for nav menu items.


The menu items, sorted by each menu item’s menu order.
Depth of the item in reference to parents.
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'.


string The HTML list content for the menu items.


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

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



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', );
      <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.