php - Add element after navigation element title don't works like I expect

I'm currently trying to add an empty <span> after every item title in my navigation which has childs. So only

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;
    }

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;
    }
Share Improve this question asked Mar 29, 2019 at 14:35 Johnny97Johnny97 2147 silver badges18 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 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>';

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745644936a4637912.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信