wp_nav_menu_remove_menu_item_has_children_class

The timeline below displays how wordpress function wp_nav_menu_remove_menu_item_has_children_class has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.5

/**
 * Remove the `menu-item-has-children` class from bottom level menu items.
 *
 * This runs on the {@see '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 https://core.trac.wordpress.org/ticket/56926
 *
 * @since 6.2.0
 *
 * @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|false $args      An object of wp_nav_menu() arguments. Default false ($args unspecified when filter is called).
 * @param int|false      $depth     Depth of menu item. Default false ($depth unspecified when filter is called).
 * @return string[] Modified nav menu classes.
 */
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;
}

WordPress Version: 6.2

/**
 * Remove the `menu-item-has-children` class from bottom level menu items.
 *
 * This runs on the {@see '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 https://core.trac.wordpress.org/ticket/56926.
 *
 * @since 6.2.0
 *
 * @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|false $args      An object of wp_nav_menu() arguments. Default false ($args unspecified when filter is called).
 * @param int|false      $depth     Depth of menu item. Default false ($depth unspecified when filter is called).
 * @return string[] Modified nav menu classes.
 */
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;
}