Make WordPress Core


Ignore:
Timestamp:
12/18/2022 11:59:51 PM (19 months ago)
Author:
peterwilsoncc
Message:

Menus: Account for legacy calls to nav_menu_css_class filter.

Modify wp_nav_menu_remove_menu_item_has_children_class() to account for changes to the nav_menu_css_class filter since it's introduction.

The $args and $depth parameters were added after the filter's introduction so this protects against fatal errors in custom walkers applying the filter in a legacy format.

Without the $args or $depth parameters, wp_nav_menu_remove_menu_item_has_children_class() no longer attempts to remove the menu-item-has-children from the lowest level menu items as these are required to determine the current branch the walker is walking.

Follow up to [54999].

Props dd32, azaozz, peterwilsoncc.
See #56926, #28620.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/nav-menu-template.php

    r54999 r55005  
    639639 * Remove the `menu-item-has-children` class from bottom level menu items.
    640640 *
     641 * This runs on the {@see 'nav_menu_css_class'} filter. The $args and $depth
     642 * parameters were added after the filter was originally introduced in
     643 * WordPress 3.0.0 so this needs to allow for cases in which the filter is
     644 * called without them.
     645 *
     646 * @see https://core.trac.wordpress.org/ticket/56926.
     647 *
    641648 * @since 6.1.2
    642649 *
    643  * @param string[] $classes   Array of the CSS classes that are applied to the menu item's `<li>` element.
    644  * @param WP_Post  $menu_item The current menu item object.
    645  * @param stdClass $args      An object of wp_nav_menu() arguments.
    646  * @param int      $depth     Depth of menu item.
     650 * @param string[]       $classes   Array of the CSS classes that are applied to the menu item's `<li>` element.
     651 * @param WP_Post        $menu_item The current menu item object.
     652 * @param stdClass|false $args      An object of wp_nav_menu() arguments. Default false ($args unspecified when filter is called).
     653 * @param int|false      $depth     Depth of menu item. Default false ($depth unspecified when filter is called).
    647654 * @return string[] Modified nav menu classes.
    648655 */
    649 function wp_nav_menu_remove_menu_item_has_children_class( $classes, $menu_item, $args, $depth ) {
     656function wp_nav_menu_remove_menu_item_has_children_class( $classes, $menu_item, $args = false, $depth = false ) {
     657    /*
     658     * Account for the filter being called without the $args or $depth parameters.
     659     *
     660     * This occurs when a theme uses a custom walker calling the `nav_menu_css_class`
     661     * filter using the legacy formats prior to the introduction of the $args and
     662     * $depth parameters.
     663     *
     664     * As both of these parameters are required for this function to determine
     665     * both the current and maximum depth of the menu tree, the function does not
     666     * attempt to remove the `menu-item-has-children` class if these parameters
     667     * are not set.
     668     */
     669    if ( false === $depth || false === $args ) {
     670        return $classes;
     671    }
     672
    650673    // Max-depth is 1-based.
    651674    $max_depth = isset( $args->depth ) ? (int) $args->depth : 0;
Note: See TracChangeset for help on using the changeset viewer.