wordpress函数wp_nav_menu


Updated on: September 14, 2020 in wpfunctions by

wp_nav_menu( array $args = array() )

Displays a navigation menu.


Parameters #Parameters

$args

(array) (Optional) 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|bool) 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’.

Default value: array()


Top ↑

Return #Return

(void|string|false) Void if ‘echo’ argument is true, menu output if ‘echo’ is false. False if there are no items or no menu was found.


Top ↑

More Information #More Information

Usage #Usage

1wp_nav_menu( $args );

Given a theme_location parameter, the function displays the menu assigned to that location. If no such location exists or no menu is assigned to it, the parameter fallback_cb will determine what is displayed.

If not given a theme_location parameter, the function displays

  • the menu matching the ID, slug, or name given by the menu parameter;
  • otherwise, the first non-empty menu;
  • otherwise (or if the menu given by menu is empty), output of the function given by the fallback_cb parameter (wp_page_menu(), by default);
  • otherwise nothing.

Top ↑

The following classes are applied to menu items, i.e. to the HTML <li> tags, generated by wp_nav_menu():

All Menu Items #All Menu Items

  • .menu-item
    This class is added to every menu item.
  • .menu-item-has-children
    This class is added to menu item which has sub-items .
  • .menu-item-object-{object}
    This class is added to every menu item, where {object} is either a post type or a taxonomy.
  • .menu-item-object-category
    This class is added to menu items that correspond to a category.
  • .menu-item-object-tag
    This class is added to menu items that correspond to a tag.
  • .menu-item-object-page
    This class is added to menu items that correspond to static pages.
  • .menu-item-object-{custom}
    This class is added to menu items that correspond to a custom post type or a custom taxonomy.
  • .menu-item-type-{type}
    This class is added to every menu item, where {type} is either “post_type” or “taxonomy”.
  • .menu-item-type-post_type
    This class is added to menu items that correspond to post types: i.e. static pages or custom post types.
  • .menu-item-type-taxonomy
    This class is added to menu items that correspond to taxonomies: i.e. categories, tags, or custom taxonomies.

Top ↑

Current-Page Menu Items #Current-Page Menu Items

  • .current-menu-item
    This class is added to menu items that correspond to the currently rendered page.

Top ↑

Current-Page Parent Menu Items #Current-Page Parent Menu Items

  • .current-menu-parent
    This class is added to menu items that correspond to the hierarchical parent of the currently rendered page.
  • .current-{object}-parent
    This class is added to menu items that correspond to the hierachical parent of the currently rendered object, where {object} corresponds to the the value used for .menu-item-object-{object}.
  • .current-{type}-parent
    This class is added to menu items that correspond to the hierachical parent of the currently rendered type, where {type} corresponds to the the value used for .menu-item-type-{type}.

Top ↑

Current-Page Ancestor Menu Items #Current-Page Ancestor Menu Items

  • .current-menu-ancestor
    This class is added to menu items that correspond to a hierarchical ancestor of the currently rendered page.
  • .current-{object}-ancestor
    This class is added to menu items that correspond to a hierachical ancestor of the currently rendered object, where {object} corresponds to the the value used for .menu-item-object-{object}.
  • .current-{type}-ancestor
    This class is added to menu items that correspond to a hierachical ancestor of the currently rendered type, where {type} corresponds to the the value used for .menu-item-type-{type}.

Top ↑

Site Front Page Menu Items #Site Front Page Menu Items

  • .menu-item-home
    This class is added to menu items that correspond to the site front page.

Top ↑

Backward Compatibility with wp_page_menu() #Backward Compatibility withwp_page_menu()

The following classes are added to maintain backward compatibility with the [[Function Reference/wp_page_menu|wp_page_menu()]] function output:

  • .page_item
    This class is added to menu items that correspond to a static page.
  • .page_item_has_children
    This class is added to menu items that have sub pages to it.
  • .page-item-$ID
    This class is added to menu items that correspond to a static page, where $ID is the static page ID.
  • .current_page_item
    This class is added to menu items that correspond to the currently rendered static page.
  • .current_page_parent
    This class is added to menu items that correspond to the hierarchical parent of the currently rendered static page.
  • .current_page_ancestor
    This class is added to menu items that correspond to a hierarchical ancestor of the currently rendered static page.

Top ↑

File: wp-includes/nav-menu-template.php

Collapse full source code View on Trac


Top ↑

Top ↑

Uses #Uses

UsesDescription
wp-includes/formatting.php: esc_attr()Escaping for HTML attributes.
wp-includes/functions.php: wp_parse_args()Merge user defined arguments into defaults array.
wp-includes/plugin.php: apply_filters()Calls the callback functions that have been added to a filter hook.
wp-includes/nav-menu-template.php: _wp_menu_item_classes_by_context()Adds the class property classes for the current context, if applicable.
wp-includes/nav-menu-template.php: walk_nav_menu_tree()Retrieves the HTML list content for nav menu items.

Show 12 more uses


Top ↑

Used By #Used By

Used ByDescription
wp-includes/class-wp-customize-nav-menus.php: WP_Customize_Nav_Menus::render_nav_menu_partial()Render a specific menu via wp_nav_menu() using the supplied arguments.
wp-includes/widgets/class-wp-nav-menu-widget.php: WP_Nav_Menu_Widget::widget()Outputs the content for the current Navigation Menu widget instance.

Top ↑

Changelog #Changelog

VersionDescription
5.5.0Added the container_aria_label argument.
4.7.0Added the item_spacing argument.
3.0.0Introduced.

Top ↑

User Contributed Notes #User Contributed Notes

  1. Skip to note 1 contentYou must log in to vote on the helpfulness of this noteVote results for this note:31You must log in to vote on the helpfulness of this noteContributed by Drew Jaynes — Different menus for logged-in usersThis example would cause a menu to show for logged-in users and a different menu for users not logged-in.123wp_nav_menu( array('theme_location' => is_user_logged_in() ? 'logged-in-menu' : 'logged-out-menu') );Log in to add feedback
  2. Skip to note 2 contentYou must log in to vote on the helpfulness of this noteVote results for this note:22You must log in to vote on the helpfulness of this noteContributed by Marco Panichi — Here is the ready to use snippet (not a real contribution, more than anything else a shortcut):12345678910111213141516171819wp_nav_menu( array $args = array('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.'fallback_cb'       => "", // (callable|bool) If the menu doesn't exists, 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.'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. Default is a ul with an id and class. Uses printf() format with numbered placeholders.'item_spacing'      => "", // (string) Whether to preserve whitespace within the menu's HTML. Accepts 'preserve' or 'discard'. Default 'preserve'.) );Expand full source codeLog in to add feedback
  3. Skip to note 3 contentYou must log in to vote on the helpfulness of this noteVote results for this note:20You must log in to vote on the helpfulness of this note
  4. Contributed by Drew Jaynes — Removing the ul wrapThis example will remove the unordered list wrap around the list items. Replacing the wrap HTML with the %3$s specifier results in only outputting the HTML list content for the menu items, because items_wrap is built using sprintf()items_wrap default before:1<ul id="%1$s" class="%2$s">%3$s</ul>items_wrap after:1%3$sExample:1wp_nav_menu( array( 'items_wrap' => '%3$s' ) );Log in to add feedback
  5. Skip to note 4 contentYou must log in to vote on the helpfulness of this noteVote results for this note:16You must log in to vote on the helpfulness of this note
  6. Contributed by Drew Jaynes — Using a Custom Walker FunctionFor deeper conditional classes, you’ll need to use a custom walker function (created in the 'walker' => new Your_Walker_Function argument).The simplest way to build a new walker function is to copy and extend the default class (Walker_Nav_Menu) from /wp-includes/nav-menu-template.php and simply customize what you need.Example:This custom walker function will add several conditional classes to your nav menu (i.e. sub-menu, even/odd, etc)
  7. wp_nav_menu( array('menu'   => 'Something custom walker','walker' => new WPDocs_Walker_Nav_Menu()) ); /*** Custom walker class.*/class WPDocs_Walker_Nav_Menu extends Walker_Nav_Menu { /*** Starts the list before the elements are added.** Adds classes to the unordered list sub-menus.** @param string $output Passed by reference. Used to append additional content.* @param int    $depth  Depth of menu item. Used for padding.* @param array  $args   An array of arguments. @see wp_nav_menu()*/function start_lvl( &$output, $depth = 0, $args = array() ) {// Depth-dependent classes.$indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent$display_depth = ( $depth + 1); // because it counts the first submenu as 0$classes = array('sub-menu',( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),( $display_depth >=2 ? 'sub-sub-menu' : '' ),'menu-depth-' . $display_depth);$class_names = implode( ' ', $classes ); // Build HTML for output.$output .= "\n" . $indent . '<ul class="' . $class_names . '">' . "\n";} /*** Start the element output.** Adds main/sub-classes to the list items and links.** @param string $output Passed by reference. Used to append additional content.* @param object $item   Menu item data object.* @param int    $depth  Depth of menu item. Used for padding.* @param array  $args   An array of arguments. @see wp_nav_menu()* @param int    $id     Current item ID.*/function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {global $wp_query;$indent = ( $depth > 0 ? str_repeat( "\t", $depth ) : '' ); // code indent // Depth-dependent classes.$depth_classes = array(( $depth == 0 ? 'main-menu-item' : 'sub-menu-item' ),( $depth >=2 ? 'sub-sub-menu-item' : '' ),( $depth % 2 ? 'menu-item-odd' : 'menu-item-even' ),'menu-item-depth-' . $depth);$depth_class_names = esc_attr( implode( ' ', $depth_classes ) ); // Passed classes.$classes = empty( $item->classes ) ? array() : (array) $item->classes;$class_names = esc_attr( implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ) ); // Build HTML.$output .= $indent . '<li id="nav-menu-item-'. $item->ID . '" class="' . $depth_class_names . ' ' . $class_names . '">'; // Link attributes.$attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';$attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';$attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';$attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';$attributes .= ' class="menu-link ' . ( $depth > 0 ? 'sub-menu-link' : 'main-menu-link' ) . '"'; // Build HTML output and pass through the proper filter.$item_output = sprintf( '%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s',$args->before,$attributes,$args->link_before,apply_filters( 'the_title', $item->title, $item->ID ),$args->link_after,$args->after);$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );}}Expand full source codeLog in to add feedback
  8. Skip to note 5 contentYou must log in to vote on the helpfulness of this noteVote results for this note:8You must log in to vote on the helpfulness of this note
  9. Contributed by willgorham — To clarify link_before vs before, and link_after vs afterThe link_before / link_after values are output WITHIN the link.
    Whereas, before / after values are output OUTSIDE of the link, but within the list item.For example:
    {before}{link_before}Link Text{link_after}{after}Log in to add feedback
  10. Skip to note 6 contentYou must log in to vote on the helpfulness of this noteVote results for this note:7You must log in to vote on the helpfulness of this noteContributed by Codex — Default exampleShows the first non-empty menu or wp_page_menu().1<?php wp_nav_menu(); ?>Log in to add feedback
  11. Skip to note 7 contentYou must log in to vote on the helpfulness of this noteVote results for this note:5You must log in to vote on the helpfulness of this note
  12. Contributed by Drew Jaynes — Targeting a specific menu with no fallback to wp_page_menu()In the case that no menu matching menu is found, it seems that passing a bogus theme_location is the only way to prevent falling back to the first non-empty menu:12345wp_nav_menu( array('menu'           => 'Project Nav', // Do not fall back to first non-empty menu.'theme_location' => '__no_such_location','fallback_cb'    => false // Do not fall back to wp_page_menu()) );Log in to add feedback
  13. Skip to note 8 contentYou must log in to vote on the helpfulness of this noteVote results for this note:3You must log in to vote on the helpfulness of this note
  14. Contributed by Colin Devroe — How to show a placeholder menu if no menu is set upCredit: Salcode.If you’ve just installed WordPress and activated a theme, there may not be a primary menu yet set up in Appearance > Menus. For these times you may want to show your own, placeholder, menu until that menu is set up.To do this, use the fallback callback function. Like so:1234567wp_nav_menu( array( 'fallback_cb' => 'custom_primary_menu_fallback', 'menu' => 'menu', 'container' => false, 'menu_id' => 'menu', 'menu_class'=>'', 'theme_location'=>'primary-menu' ) ); function custom_primary_menu_fallback() {?><ul id="menu"><li><a href="/">Home</a></li><li><a href="/wp-admin/nav-menus.php">Set primary menu</a></li></ul><?php}Log in to add feedback
  15. Skip to note 9 contentYou must log in to vote on the helpfulness of this noteVote results for this note:2You must log in to vote on the helpfulness of this note
  16. Contributed by Drew Jaynes — Targeting a specific menu123wp_nav_menu( array('menu' => 'Project Nav') );Log in to add feedback
  17. Skip to note 10 contentYou must log in to vote on the helpfulness of this noteVote results for this note:2You must log in to vote on the helpfulness of this note
  18. Contributed by Drew Jaynes — Adding Conditional Classes to Menu ItemsThis example would let you add a custom class to a menu item based on the condition you specify. Don’t forget to change the condition.123456789101112131415/*** Filter the CSS class for a nav menu based on a condition.** @param array  $classes The CSS classes that are applied to the menu item's <li> element.* @param object $item    The current menu item.* @return array (maybe) modified nav menu class.*/function wpdocs_special_nav_class( $classes, $item ) {if ( is_single() && 'Blog' == $item->title ) {// Notice you can change the conditional from is_single() and $item->title$classes[] = "special-class";}return $classes;}add_filter( 'nav_menu_css_class' , 'wpdocs_special_nav_class' , 10, 2 );Expand full source codeLog in to add feedback
  19. Skip to note 11 contentYou must log in to vote on the helpfulness of this noteVote results for this note:2You must log in to vote on the helpfulness of this noteContributed by Codex — How to add a parent class for menu itemSometimes you may need to add a class to a menu item if it has sub-menus.12345678910111213141516171819202122232425/*** Add a parent CSS class for nav menu items.** @param array  $items The menu items, sorted by each menu item's menu order.* @return array (maybe) modified parent CSS class.*/function wpdocs_add_menu_parent_class( $items ) {$parents = array(); // Collect menu items with parents.foreach ( $items as $item ) {if ( $item->menu_item_parent && $item->menu_item_parent > 0 ) {$parents[] = $item->menu_item_parent;}} // Add class.foreach ( $items as $item ) {if ( in_array( $item->ID, $parents ) ) {$item->classes[] = 'menu-parent-item';}}return $items;}add_filter( 'wp_nav_menu_objects', 'wpdocs_add_menu_parent_class' );Expand full source codeLog in to add feedback
  20. Skip to note 12 contentYou must log in to vote on the helpfulness of this noteVote results for this note:2You must log in to vote on the helpfulness of this noteContributed by Ruturaaj Patki — How to add .active class to active menu itemHere is the code:1234567add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);function special_nav_class($classes, $item){if( in_array('current-menu-item', $classes) ){$classes[] = 'active ';}return $classes;}Log in to add feedback
  21. Skip to note 13 contentYou must log in to vote on the helpfulness of this noteVote results for this note:1You must log in to vote on the helpfulness of this note
  22. Contributed by kdevanti — Simple shortcode for displaying a menu
    this will allow you to display a menu in where ever you add the shortcode, lots of room to expand the $args but left it simple.123456789function get_menu($args){$menu = isset($atts['menu']) ? $atts['menu'] : '';ob_start();wp_nav_menu(array('menu' => $menu) );return ob_get_clean();}add_shortcode('get_menu', 'get_menu');Usage Example:[get_menu menu="Main Menu"]Log in to add feedback
  23. Skip to note 14 contentYou must log in to vote on the helpfulness of this noteVote results for this note:1You must log in to vote on the helpfulness of this note
  24. Contributed by netzgestaltung — instead of large walkers you can simply filter menu item class names123456789101112131415// adds useful menu-item class namesfunction your_theme_menu_item_class( $classes, $item ) { // Add slugs to menu-itemsif ( 'category' == $item->object ) {$category = get_category( $item->object_id );$classes[] = 'category-' . $category->slug;} elseif ( 'format' == $item->object ){$format = get_term($item->object_id);$classes[] = 'format-' . $format->slug;}return $classes;  } add_filter( 'nav_menu_css_class', 'your_theme_menu_item_class', 10, 2);Expand full source codeLog in to add feedback
  25. Skip to note 15 contentYou must log in to vote on the helpfulness of this noteVote results for this note:0You must log in to vote on the helpfulness of this note
  26. Contributed by Lee — By default, menus are encased with a div container. The options on this page show this parameter as a string to change the element used to contain the menu.However, it is not noted here that if you pass false as a value, the container is completely removed leaving just the ul menu element.123wp_nav_menu(array('container' => false // Removes the container, leaving just the ul element));Log in to add feedback
  27. Skip to note 16 contentYou must log in to vote on the helpfulness of this noteVote results for this note:0You must log in to vote on the helpfulness of this note
  28. Contributed by teucrium — Removing the default div containerIn order to remove the default div container in which the menu is encased, just :
    1. Use the parameter ‘container’ in the array
    2. And leave it empty.Like in the following example :123wp_nav_menu(array('container' => '', // Leaving it empty removes the <div> container.));Log in to add feedback
  29. Skip to note 17 contentYou must log in to vote on the helpfulness of this noteVote results for this note:0You must log in to vote on the helpfulness of this note
  30. Contributed by lovor — It is not mentioned that container parameter by default accepts only ‘div’, ‘nav’ and falsy value (”, false, null). If you want to extend accepted tag arguments and wrap menu parent ul tag in something else, you have to use wp_nav_menu_container_allowedtags filter and add desired tag to the array. However, for the most uses, default two tags are most logical.Log in to add feedback
  31. Skip to note 18 contentYou must log in to vote on the helpfulness of this noteVote results for this note:-1You must log in to vote on the helpfulness of this note
  32. Contributed by Drew Jaynes — Adding a Word at the Beginning of the MenuThis example will allows you to add the word of your choice to the beginning of your menu as a list item. In this example, the word “Menu:” is added at the beginning. You may want to set an id on the list item (“item-id” in this example) so that you can use CSS to style it.1234wp_nav_menu( array('theme_location' => 'primary','items_wrap'     => '<ul><li id="item-id"><?php __( 'Menu:', 'textdomain' ); ?></li>%3$s</ul>') );