[wp-trac] [WordPress Trac] #37344: Side effects on 'nav_menu_item_args' filter when appending to arguments
WordPress Trac
noreply at wordpress.org
Tue Jul 12 16:25:53 UTC 2016
#37344: Side effects on 'nav_menu_item_args' filter when appending to arguments
--------------------------+-----------------------------
Reporter: dgwyer | Owner:
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Menus | Version: trunk
Severity: normal | Keywords:
Focuses: |
--------------------------+-----------------------------
The 'nav_menu_item_args' filter allows you to filter the arguments for a
single nav menu item which works well when you are '''overwriting'''
arguments.
When you try to '''append''' an argument the original arguments object is
updated. This means that the next menu item passes in the updated object
to the 'nav_menu_item_args' filter which leads to unexpected side effects.
For demonstration purposes here's how to reproduce the issue.
{{{
function format_menu_item_args( $args, $item, $depth ) {
$args->before .= rand(0,9);
return $args;
}
add_filter( 'nav_menu_item_args', 'format_menu_item_args', 10, 3);
}}}
What you should see before every menu item is a random integer between
0-9. What happens instead is the integer from the previous menu item is
passed into the next. So by the time the 'nth' menu item is processed you
get 'n' integers outputted whereas only one integer per menu item should
be outputted.
I have added a patch to solve this by casting the $args object to an array
early in start_el(). If left as an array this would break code already
using the 'nav_menu_item_args' filter as an '''$args object''' is passed
into the filter. Also code further down start_el() would need updating to
use array rather than object notation. So, to get around this I've casted
$args to an object again.
This is a new object and so there won't be any issues with referencing the
original nav menu args object. Plus, existing code using the
'nav_menu_item_args' filter will still work fine.
See attached screenshots for views of a nav menus before and after the
patch is applied.
''Note: The default type for $args in start_el() is already specified as
an empty array but it's actually an object that's being passed in.''
--
Ticket URL: <https://core.trac.wordpress.org/ticket/37344>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list