在导航元素标题后添加元素不像我预期的那样工作

时间:2019-03-29 作者:Johnny97

我当前正在尝试添加一个空<span> 在我的导航中的每个项目标题后面都有childs。所以只有下拉元素。可悲的是,我的一些非下拉项目<span> 在标题后插入。这太奇怪了。我做错了什么?

 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 个回复
SO网友:Frank P. Walentynowicz

代码中的回调函数名称不匹配。我相信,这只是一个拼写错误。

要了解问题的本质,我们必须知道walker-nav-menu 在遍历菜单树时使用其参数。$args 适用于entire menu tree. $item 是一个单独的菜单项。

中参数的任何更改$args 通过过滤器生成的对象对于walker-nav-menu. 您的代码应为:

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 ( in_array( \'menu-item-has-children\', $item->classes, true ) )
    $args->link_after = \'<span></span>\';