From 0f323130f715f72795dddc396e737f4695912daf Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Mon, 19 Dec 2022 00:01:14 +0000 Subject: [PATCH] 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. Built from https://develop.svn.wordpress.org/trunk@55005 git-svn-id: http://core.svn.wordpress.org/trunk@54538 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/nav-menu-template.php | 33 ++++++++++++++++++++++++++----- wp-includes/version.php | 2 +- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/wp-includes/nav-menu-template.php b/wp-includes/nav-menu-template.php index e1a58b0668..135d35e130 100644 --- a/wp-includes/nav-menu-template.php +++ b/wp-includes/nav-menu-template.php @@ -638,15 +638,38 @@ function _nav_menu_item_id_use_once( $id, $item ) { /** * 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.1.2 * - * @param string[] $classes Array of the CSS classes that are applied to the menu item's `
  • ` 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. + * @param string[] $classes Array of the CSS classes that are applied to the menu item's `
  • ` 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, $depth ) { +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. diff --git a/wp-includes/version.php b/wp-includes/version.php index 52e314b188..d6e9b35a9c 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.2-alpha-55004'; +$wp_version = '6.2-alpha-55005'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.