为带有子菜单的菜单项添加“下拉箭头”

时间:2013-06-26 作者:Paul

WordPress不添加parent 类到具有子菜单的菜单项。因此,需要进行扩展:

function add_parent_css( $classes, $item ) {
    global $have_children;
    if( $have_children ) {
        $classes[] = \'parent\';
    }
    return $classes;
}
add_filter( \'nav_menu_css_class\', \'add_parent_css\', 10, 2 );

class custom_walker extends Walker_Nav_Menu {
  function display_element($element, &$children_elements, $max_depth, $depth=0, $args, &$output){
    $GLOBALS[\'have_children\'] = (isset($children_elements[$element->ID]))? 1:0;
    parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
  }
  [...]
}
代码将插入parent 类设置为具有子菜单的所有菜单项,然后可以在CSS中使用,如:

.parent:after { content: ">"; }
我想知道,如果没有自定义菜单漫游器,是否有办法做到这一点?只使用过滤器?我之所以问这个问题,是因为像WPML这样的一些插件忽略了菜单项的自定义菜单漫游器,而它们在菜单中的“语言切换器”无法parent 类,即使有子项。与其等待WPML来解决这个问题,我更愿意只更新主题中的菜单,以更简单的方式来完成。

2 个回复
SO网友:jzatt

我使用以下代码来实现这一点。不需要任何Walker或其他任何东西,只需将其插入到函数中即可。php和带有子菜单的项将得到“菜单父项”作为类添加。

add_filter( \'wp_nav_menu_objects\', \'add_menu_parent_class\' );
function add_menu_parent_class( $items ) {
    $parents = array();
    foreach ( $items as $item ) {
        //Check if the item is a parent item
        if ( $item->menu_item_parent && $item->menu_item_parent > 0 ) {
            $parents[] = $item->menu_item_parent;
        }
    }

    foreach ( $items as $item ) {
        if ( in_array( $item->ID, $parents ) ) {
            //Add "menu-parent-item" class to parents
            $item->classes[] = \'menu-parent-item\'; 
        }
    }

    return $items;    
}
我已经用这个很久了。不幸的是,我不记得我在哪里找到它,所以我不能给提出它的人评分。

SO网友:TheDeadMedic

function wpse_104316_nav_menu_css_class( $classes, $item ) {
    if ( ! empty( $item->current_item_parent ) || ! empty( $item->current_item_ancestor ) ) 
        $classes[] = \'parent\';
    return $classes;
}

add_filter( \'nav_menu_css_class\', \'wpse_104316_nav_menu_css_class\', 10, 2 );
Update: 似乎用上述方法无法实现。但是你可以通过勾住wp_nav_menu_args:

function wpse_104316_wp_nav_menu_args( $args ) {
    $args[\'walker\'] = new custom_walker;
    return $args;
}

add_filter( \'wp_nav_menu_args\', \'wpse_104316_wp_nav_menu_args\', 100 );
除当前代码外,还可以使用此代码。

结束

相关推荐

Custom menus not showing

作为我上一次关于菜单的未解决查询的后续,这个问题已经进一步扩展。我的菜单没有打印代码中的任何地方。我正在注册菜单功能。php:add_action( \'after_setup_theme\', \'your_newtheme_setup\' ); if ( ! function_exists( \'your_newtheme_setup\' ) ) : function your_newtheme_setup() { if (