mirrored from git://develop.git.wordpress.org/
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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. git-svn-id: https://develop.svn.wordpress.org/trunk@55005 602fd350-edb4-49c9-b593-d223f7449a82
- Loading branch information
1 parent
7c590f2
commit e27c5a3
Showing
2 changed files
with
128 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 changes: 100 additions & 0 deletions
100
tests/phpunit/tests/menu/wpNavMenuRemoveMenuItemHasChildrenClass.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
<?php | ||
|
||
/** | ||
* @group menu | ||
*/ | ||
class Tests_Menu_WpNavMenuRemoveMenuItemHasChildrenClass extends WP_UnitTestCase { | ||
|
||
/** | ||
* Ensure calling filter in legacy ways does not throw an error. | ||
* | ||
* @ticket 56926 | ||
*/ | ||
public function test_legacy_filter_should_not_throw_an_error() { | ||
$classes = array( 'menu-item-has-children', 'menu-item', 'menu-item-123' ); | ||
|
||
$menu_item = (object) array( | ||
'classes' => $classes, | ||
); | ||
|
||
$args = (object) array( | ||
'depth' => 2, | ||
); | ||
|
||
$depth = 2; | ||
|
||
$class_names = implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $menu_item ) ); | ||
$this->assertStringContainsString( 'menu-item-has-children', $class_names, 'Class name should be retained when filter is called with two arguments.' ); | ||
$class_names = implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $menu_item, $args ) ); | ||
$this->assertStringContainsString( 'menu-item-has-children', $class_names, 'Class name should be retained when filter is called with three arguments.' ); | ||
$class_names = implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $menu_item, $args, $depth ) ); | ||
$this->assertStringNotContainsString( 'menu-item-has-children', $class_names, 'Class name should not be retained when filter is called with four arguments.' ); | ||
} | ||
|
||
/** | ||
* Ensure menu-item-has-children class is removed or retained as expected. | ||
* | ||
* @dataProvider data_menu_item_has_children_class_should_be_removed_or_retained_as_expected | ||
* @ticket 56926 | ||
*/ | ||
public function test_menu_item_has_children_class_should_be_removed_or_retained_as_expected( $args, $depth, $should_be_retained ) { | ||
$classes = array( 'menu-item-has-children', 'menu-item', 'menu-item-123' ); | ||
|
||
$menu_item = (object) array( | ||
'classes' => $classes, | ||
); | ||
|
||
$class_names = wp_nav_menu_remove_menu_item_has_children_class( $classes, $menu_item, $args, $depth ); | ||
if ( $should_be_retained ) { | ||
$this->assertContains( 'menu-item-has-children', $class_names, 'Class name should be retained.' ); | ||
return; | ||
} | ||
|
||
$this->assertNotContains( 'menu-item-has-children', $class_names, 'Class name should not be retained.' ); | ||
} | ||
|
||
/** | ||
* Data provider. | ||
* | ||
* @return array | ||
*/ | ||
public function data_menu_item_has_children_class_should_be_removed_or_retained_as_expected() { | ||
return array( | ||
'Depth not set' => array( | ||
'args' => (object) array( 'depth' => 1 ), | ||
'depth' => false, | ||
'should_be_retained' => true, | ||
), | ||
'Neither depth nor args set' => array( | ||
'args' => false, | ||
'depth' => false, | ||
'should_be_retained' => true, | ||
), | ||
'Max depth is set to minus 1' => array( | ||
'args' => (object) array( 'depth' => -1 ), | ||
'depth' => 1, | ||
'should_be_retained' => false, | ||
), | ||
'Max depth is set to zero' => array( | ||
'args' => (object) array( 'depth' => 0 ), | ||
'depth' => 1, | ||
'should_be_retained' => true, | ||
), | ||
'Item depth exceeds max depth' => array( | ||
'args' => (object) array( 'depth' => 2 ), | ||
'depth' => 3, | ||
'should_be_retained' => false, | ||
), | ||
'Item depth is lower than max depth' => array( | ||
'args' => (object) array( 'depth' => 5 ), | ||
'depth' => 3, | ||
'should_be_retained' => true, | ||
), | ||
'Item depth is one lower than max depth' => array( | ||
'args' => (object) array( 'depth' => 2 ), | ||
'depth' => 1, | ||
'should_be_retained' => false, // Depth is zero-based, max depth is not. | ||
), | ||
); | ||
} | ||
} |