函数文档

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.

  • 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'.

Default:false

$depthint|falseoptional
Depth of menu item. Default false ($depth unspecified when filter is called).

Default:false

Return

string[] Modified nav menu classes.

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.