Wp Nav Menu Li Class

🛑 👉🏻👉🏻👉🏻 INFORMATION AVAILABLE CLICK HERE👈🏻👈🏻👈🏻
Browse:
Home /
Reference /
Functions / wp_nav_menu()
function wp_nav_menu( $args = array () ) {
static $menu_id_slugs = array ();
'menu' => '' ,
'container' => 'div' ,
'container_class' => '' ,
'container_id' => '' ,
'container_aria_label' => '' ,
'menu_class' => 'menu' ,
'menu_id' => '' ,
'echo' => true,
'fallback_cb' => 'wp_page_menu' ,
'before' => '' ,
'after' => '' ,
'link_before' => '' ,
'link_after' => '' ,
'items_wrap' => '%3$s' ,
'item_spacing' => 'preserve' ,
'depth' => 0,
'walker' => '' ,
'theme_location' => '' ,
$args = wp_parse_args( $args , $defaults );
if ( ! in_array( $args [ 'item_spacing' ], array ( 'preserve' , 'discard' ), true ) ) {
// Invalid value, fall back to default.
$args [ 'item_spacing' ] = $defaults [ 'item_spacing' ];
* Filters the arguments used to display a navigation menu.
* @param array $args Array of wp_nav_menu() arguments.
$args = apply_filters( 'wp_nav_menu_args' , $args );
* Filters whether to short-circuit the wp_nav_menu() output.
* Returning a non-null value from the filter will short-circuit wp_nav_menu(),
* echoing that value if $args->echo is true, returning that value otherwise.
* @param string|null $output Nav menu output to short-circuit with. Default null.
* @param stdClass $args An object containing wp_nav_menu() arguments.
$nav_menu = apply_filters( 'pre_wp_nav_menu' , null, $args );
// Get the nav menu based on the requested menu.
$menu = wp_get_nav_menu_object( $args ->menu );
// Get the nav menu based on the theme_location.
$locations = get_nav_menu_locations();
if ( ! $menu && $args ->theme_location && $locations && isset( $locations [ $args ->theme_location ] ) ) {
$menu = wp_get_nav_menu_object( $locations [ $args ->theme_location ] );
// Get the first menu that has items if we still can't find a menu.
if ( ! $menu && ! $args ->theme_location ) {
$menus = wp_get_nav_menus();
foreach ( $menus as $menu_maybe ) {
$menu_items = wp_get_nav_menu_items( $menu_maybe ->term_id, array ( 'update_post_term_cache' => false ) );
if ( $menu_items ) {
$menu = $menu_maybe ;
if ( empty ( $args ->menu ) ) {
// If the menu exists, get its items.
if ( $menu && ! is_wp_error( $menu ) && ! isset( $menu_items ) ) {
$menu_items = wp_get_nav_menu_items( $menu ->term_id, array ( 'update_post_term_cache' => false ) );
* - Fall back (if one was specified), or bail.
* If no menu items were found:
* - Fall back, but only if no theme location was specified.
if ( ( ! $menu || is_wp_error( $menu ) || ( isset( $menu_items ) && empty ( $menu_items ) && ! $args ->theme_location ) )
&& isset( $args ->fallback_cb ) && $args ->fallback_cb && is_callable ( $args ->fallback_cb ) ) {
return call_user_func( $args ->fallback_cb, ( array ) $args );
if ( ! $menu || is_wp_error( $menu ) ) {
* Filters the list of HTML tags that are valid for use as menu containers.
* @param string[] $tags The acceptable HTML tags for use as menu containers.
* Default is array containing 'div' and 'nav'.
$allowed_tags = apply_filters( 'wp_nav_menu_container_allowedtags' , array ( 'div' , 'nav' ) );
if ( is_string ( $args ->container ) && in_array( $args ->container, $allowed_tags , true ) ) {
$show_container = true;
$class = $args ->container_class ? ' class="' . esc_attr( $args ->container_class ) . '"' : ' class="menu-' . $menu ->slug . '-container"' ;
$id = $args ->container_id ? ' id="' . esc_attr( $args ->container_id ) . '"' : '' ;
$aria_label = ( 'nav' === $args ->container && $args ->container_aria_label ) ? ' aria-label="' . esc_attr( $args ->container_aria_label ) . '"' : '' ;
$nav_menu .= '<' . $args ->container . $id . $class . $aria_label . '>' ;
// Set up the $menu_item variables.
_wp_menu_item_classes_by_context( $menu_items );
$sorted_menu_items = array ();
$menu_items_with_children = array ();
foreach ( ( array ) $menu_items as $menu_item ) {
$sorted_menu_items [ $menu_item ->menu_order ] = $menu_item ;
if ( $menu_item ->menu_item_parent ) {
$menu_items_with_children [ $menu_item ->menu_item_parent ] = true;
// Add the menu-item-has-children class where applicable.
if ( $menu_items_with_children ) {
foreach ( $sorted_menu_items as & $menu_item ) {
if ( isset( $menu_items_with_children [ $menu_item ->ID ] ) ) {
$menu_item ->classes[] = 'menu-item-has-children' ;
unset( $menu_items , $menu_item );
* Filters the sorted list of menu item objects before generating the menu's HTML.
* @param array $sorted_menu_items The menu items, sorted by each menu item's menu order.
* @param stdClass $args An object containing wp_nav_menu() arguments.
$sorted_menu_items = apply_filters( 'wp_nav_menu_objects' , $sorted_menu_items , $args );
$items .= walk_nav_menu_tree( $sorted_menu_items , $args ->depth, $args );
if ( ! empty ( $args ->menu_id ) ) {
$wrap_id = $args ->menu_id;
$wrap_id = 'menu-' . $menu ->slug;
while ( in_array( $wrap_id , $menu_id_slugs , true ) ) {
if ( preg_match( '#-(\d+)$#' , $wrap_id , $matches ) ) {
$wrap_id = preg_replace( '#-(\d+)$#' , '-' . ++ $matches [1], $wrap_id );
$wrap_id = $wrap_id . '-1' ;
$menu_id_slugs [] = $wrap_id ;
$wrap_class = $args ->menu_class ? $args ->menu_class : '' ;
* Filters the HTML list content for navigation menus.
* @param string $items The HTML list content for the menu items.
* @param stdClass $args An object containing wp_nav_menu() arguments.
$items = apply_filters( 'wp_nav_menu_items' , $items , $args );
* Filters the HTML list content for a specific navigation menu.
* @param string $items The HTML list content for the menu items.
* @param stdClass $args An object containing wp_nav_menu() arguments.
$items = apply_filters( "wp_nav_menu_{$menu->slug}_items" , $items , $args );
// Don't print any markup if there are no items at this point.
$nav_menu .= sprintf( $args ->items_wrap, esc_attr( $wrap_id ), esc_attr( $wrap_class ), $items );
$nav_menu .= 'container . '>' ;
* Filters the HTML content for navigation menus.
* @param string $nav_menu The HTML content for the navigation menu.
* @param stdClass $args An object containing wp_nav_menu() arguments.
$nav_menu = apply_filters( 'wp_nav_menu' , $nav_menu , $args );
'theme_location' => is_user_logged_in() ? 'logged-in-menu' : 'logged-out-menu'
wp_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'.
< ul id = "%1$s" class = "%2$s" >%3$s
wp_nav_menu( array ( 'items_wrap' => '%3$s' ) );
'menu' => 'Something custom walker' ,
'walker' => new WPDocs_Walker_Nav_Menu()
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
( $display_depth % 2 ? 'menu-odd' : 'menu-even' ),
( $display_depth >=2 ? 'sub-sub-menu' : '' ),
'menu-depth-' . $display_depth
$class_names = implode( ' ' , $classes );
$output .= "\n" . $indent . '' . "\n" ;
* 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 ) {
$indent = ( $depth > 0 ? str_repeat ( "\t" , $depth ) : '' ); // code indent
// Depth-dependent classes.
( $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 ) );
$classes = empty ( $item ->classes ) ? array () : ( array ) $item ->classes;
$class_names = esc_attr( implode( ' ' , apply_filters( 'nav_menu_css_class' , array_filter ( $classes ), $item ) ) );
$output .= $indent . '