0

I'm currently trying to add an empty <span> after every item title in my navigation which has childs. So only dropdown elements. Sadly also some of my non-dropdown items getting a <span> inserted after the title. This is so strange. What I'm doing wrong?

 add_filter( 'nav_menu_item_args', 'nav_menu_modify_dropdown', 10, 3 );
    function nav_menu_add_dropdown( $args, $item, $depth ) {
        error_log( print_r( $item, true ) );
        if ( $args->theme_location === 'primary-menu' && in_array( 'menu-item-has-children', $item->classes, true ) ) {
            $args->link_after = '<span></span>';
        }

        return $args;
    }

1 Answer 1

0

There is a mismatch of callback function names in your code. I believe, it's just a typo.

To understand the nature of your problem, we have to know, how walker-nav-menu uses its parameters, while traversing a menu tree. $args apply to entire menu tree. $item is an individual menu item.

Any changes to arguments in $args object, made via filters, are persistent for every next iteration of walker-nav-menu. Your code should be:

add_filter( 'nav_menu_item_args', 'nav_menu_modify_dropdown', 10, 2 );
function nav_menu_modify_dropdown( $args, $item ) {
    unset( $args->link_after );
    if ( $args->theme_location === 'primary-menu' && in_array( 'menu-item-has-children', $item->classes, true ) )
        $args->link_after = '<span></span>';
    return $args;
}

If there is only one menu location, you can simplify your conditional statement:

if ( in_array( 'menu-item-has-children', $item->classes, true ) )
    $args->link_after = '<span></span>';

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.