wp_nav_menu_remove_menu_item_has_children_class()
云策文档标注
概述
wp_nav_menu_remove_menu_item_has_children_class() 是一个 WordPress 函数,用于从导航菜单的底层菜单项中移除 'menu-item-has-children' CSS 类。它通过 'nav_menu_css_class' 过滤器实现,并处理参数缺失的兼容性问题。
关键要点
- 函数作用:从底层菜单项移除 'menu-item-has-children' 类,以优化菜单样式。
- 过滤器:基于 'nav_menu_css_class' 过滤器,需注意 $args 和 $depth 参数可能未设置的情况。
- 参数处理:如果 $args 或 $depth 为 false,函数直接返回原 $classes,确保向后兼容。
- 深度计算:$depth 基于 0,需加 1 与 $max_depth(基于 1)比较;$max_depth 从 $args->depth 获取,默认为 0。
- 移除条件:当 $max_depth 为 -1 或 $depth >= $max_depth 时,使用 array_diff() 移除类。
- 版本:从 WordPress 6.2.0 引入。
代码示例
function wp_nav_menu_remove_menu_item_has_children_class( $classes, $menu_item, $args = false, $depth = false ) {
if ( false === $depth || false === $args ) {
return $classes;
}
$max_depth = isset( $args->depth ) ? (int) $args->depth : 0;
$depth = $depth + 1;
if ( 0 === $max_depth ) {
return $classes;
}
if ( -1 === $max_depth || $depth >= $max_depth ) {
$classes = array_diff( $classes, array( 'menu-item-has-children' ) );
}
return $classes;
}注意事项
- 兼容性:由于 $args 和 $depth 参数在 WordPress 3.0.0 后添加,函数需处理旧主题或自定义 walker 调用过滤器时参数缺失的情况。
- 深度逻辑:注意 $depth 和 $max_depth 的基准差异,正确计算以确定底层菜单项。
- 应用场景:适用于需要自定义菜单样式,特别是移除子菜单指示器的场景。
原文内容
Remove the menu-item-has-children class from bottom level menu items.
Description
This runs on the ‘nav_menu_css_class’ filter. The $args and $depth parameters were added after the filter was originally introduced in WordPress 3.0.0 so this needs to allow for cases in which the filter is called without them.
See also
Parameters
$classesstring[]required-
Array of the CSS classes that are applied to the menu item’s
<li>element. $menu_itemWP_Postrequired-
The current menu item object.
$argsstdClass|falseoptional-
An object of wp_nav_menu() arguments. Default false ($args unspecified when filter is called).
More Arguments from wp_nav_menu( … $args )
Array of nav menu arguments.
menuint|string|WP_TermDesired menu. Accepts a menu ID, slug, name, or object.menu_classstringCSS class to use for the ul element which forms the menu.
Default'menu'.menu_idstringThe ID that is applied to the ul element which forms the menu.
Default is the menu slug, incremented.containerstringWhether to wrap the ul, and what to wrap it with.
Default'div'.container_classstringClass that is applied to the container.
Default ‘menu-{menu slug}-container’.container_idstringThe ID that is applied to the container.container_aria_labelstringThe aria-label attribute that is applied to the container when it’s a nav element.fallback_cbcallable|falseIf the menu doesn’t exist, a callback function will fire.
Default is'wp_page_menu'. Set to false for no fallback.beforestringText before the link markup.afterstringText after the link markup.link_beforestringText before the link text.link_afterstringText after the link text.echoboolWhether to echo the menu or return it. Default true.depthintHow many levels of the hierarchy are to be included.
0 means all. Default 0.
Default 0.walkerobjectInstance of a custom walker class.theme_locationstringTheme location to be used. Must be registered with register_nav_menu() in order to be selectable by the user.items_wrapstringHow the list items should be wrapped. Uses printf() format with numbered placeholders. Default is a ul with an id and class.item_spacingstringWhether to preserve whitespace within the menu’s HTML.
Accepts'preserve'or'discard'. Default'preserve'.
Default:
false $depthint|falseoptional-
Depth of menu item. Default false ($depth unspecified when filter is called).
Default:
false
Source
function wp_nav_menu_remove_menu_item_has_children_class( $classes, $menu_item, $args = false, $depth = false ) {
/*
* Account for the filter being called without the $args or $depth parameters.
*
* This occurs when a theme uses a custom walker calling the `nav_menu_css_class`
* filter using the legacy formats prior to the introduction of the $args and
* $depth parameters.
*
* As both of these parameters are required for this function to determine
* both the current and maximum depth of the menu tree, the function does not
* attempt to remove the `menu-item-has-children` class if these parameters
* are not set.
*/
if ( false === $depth || false === $args ) {
return $classes;
}
// Max-depth is 1-based.
$max_depth = isset( $args->depth ) ? (int) $args->depth : 0;
// Depth is 0-based so needs to be increased by one.
$depth = $depth + 1;
// Complete menu tree is displayed.
if ( 0 === $max_depth ) {
return $classes;
}
/*
* Remove the `menu-item-has-children` class from bottom level menu items.
* -1 is used to display all menu items in one level so the class should
* be removed from all menu items.
*/
if ( -1 === $max_depth || $depth >= $max_depth ) {
$classes = array_diff( $classes, array( 'menu-item-has-children' ) );
}
return $classes;
}
Changelog
| Version | Description |
|---|---|
| 6.2.0 | Introduced. |