nav_menu_css_class
Allows changing the set of CSS classes assigned to a menu item.
For details about how CSS classes are generated for menu items, see the wp_nav_menu() documentation.
Usage
add_filter( 'nav_menu_css_class', 'wp_kama_nav_menu_css_class_filter', 10, 4 );
/**
* Function for `nav_menu_css_class` filter-hook.
*
* @param string[] $classes Array of the CSS classes that are applied to the menu item's `<li>` element.
* @param WP_Post $menu_item The current menu item object.
* @param stdClass $args An object of wp_nav_menu() arguments.
* @param int $depth Depth of menu item. Used for padding.
*
* @return string[]
*/
function wp_kama_nav_menu_css_class_filter( $classes, $menu_item, $args, $depth ){
// filter...
return $classes;
}
- $classes(array)
CSS classes applied to the menu item's
<li>element. Example:Array( [1] => menu-item [2] => menu-item-type-post_type [3] => menu-item-object-page [4] => menu-item-265 )
- $item(WP_Post)
The current menu item object. Example:
- $args(stdClass)
An object containing the arguments from wp_nav_menu(). Example:
- $depth(int)
- The menu item depth. Added in version 4.1.0 and used for indentation. Top-level menu items have
$depth = 0, their children have$depth = 1, and so on.
Examples
#1 Remove CSS classes from all menu items
Remove all CSS classes from every menu item on the site.
add_filter( 'nav_menu_css_class', '__return_empty_array' );
The resulting markup:
<ul id="menu-my-first-menu" class="primary-menu"> <li id="menu-item-265"> <a href="http://wp-test.ru/post-99">Contact</a> </li> <li id="menu-item-266"> <a href="http://wp-test.ru/post-98">All posts</a> </li> <li id="menu-item-267"> <a href="http://wp-test.ru/post-97">Sitemap</a> </li> </ul>
To remove or change the CSS id attribute of a menu item, use the nav_menu_item_id filter.
Conditions can also be used, as in the first example. Remove CSS classes from all menu items and add a custom CSS class to items in the primary menu location:
add_filter( 'nav_menu_css_class', 'change_menu_item_css_classes', 10, 4 );
function change_menu_item_css_classes( $classes, $item, $args, $depth ) {
if ( 'primary' === $args->theme_location ) {
$classes = [ 'my-css' ];
} else {
$classes = [];
}
return $classes;
}
The resulting markup:
<ul id="menu-my-first-menu" class="primary-menu"> <li id="menu-item-265" class="my-css"> <a href="http://wp-test.ru/post-99">Contact</a> </li> <li id="menu-item-266" class="my-css"> <a href="http://wp-test.ru/post-98">All posts</a> </li> <li id="menu-item-267" class="my-css"> <a href="http://wp-test.ru/post-97">Sitemap</a> </li> </ul>
#2 Add a CSS class only to a particular menu item
Suppose the Contact menu item (ID 265) needs an additional CSS class, but only when it is displayed in a menu assigned to the primary location:
add_filter( 'nav_menu_css_class', 'change_menu_item_css_classes', 10, 4 );
function change_menu_item_css_classes( $classes, $item, $args, $depth ) {
if( 265 === $item->ID && 'primary' === $args->theme_location ){
$classes[] = 'special-css-class';
}
return $classes;
}
The resulting markup:
<ul id="menu-my-first-menu" class="primary-menu"> <li id="menu-item-265" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-265 special-css-class"> <a href="http://wp-test.ru/post-99">Contact</a> </li> <li id="menu-item-266" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-266"> <a href="http://wp-test.ru/post-98">All posts</a> </li> <li id="menu-item-267" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-267"> <a href="http://wp-test.ru/post-97">Sitemap</a> </li> </ul>
Notes
- The
$depthparameter was added in version 4.1.0.
Changelog
| Since 3.0.0 | Introduced. |
| Since 4.1.0 | The $depth parameter was added. |
Where the hook is called
$class_names = implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $menu_item, $args, $depth ) );
Where the hook is used in WordPress
add_filter( 'nav_menu_css_class', 'wp_nav_menu_remove_menu_item_has_children_class', 10, 4 );