导航漫游器,引导:显示2级以下的3级项目

时间:2016-09-22 作者:Koessien

我正在使用WP\\U bootstrap\\U navwalker作为下拉菜单。这很好,但它只显示了第一级和第二级项目。因此,当下拉列表打开时,在第一级取消下拉列表,并在第二级常规取消下拉列表。第三层不可见。

我想在我的第二级项目下显示它。walker现在正在将其作为另一个下拉列表(不起作用)。

我没有足够的技能来正确编辑助行器,使其适合我的需要。有人能帮我吗?

沃克密码:

class wp_bootstrap_navwalker extends Walker_Nav_Menu {
/**
 * @see Walker::start_lvl()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param int $depth Depth of page. Used for padding.
 */
public function start_lvl( &$output, $depth = 0, $args = array() ) {
    $indent = str_repeat( "\\t", $depth );
    $output .= "\\n$indent<ul role=\\"menu\\" class=\\" dropdown-menu\\">\\n";
}
/**
 * @see Walker::start_el()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param object $item Menu item data object.
 * @param int $depth Depth of menu item. Used for padding.
 * @param int $current_page Menu item ID.
 * @param object $args
 */
public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
    $indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';
    /**
     * Dividers, Headers or Disabled
     * =============================
     * Determine whether the item is a Divider, Header, Disabled or regular
     * menu item. To prevent errors we use the strcasecmp() function to so a
     * comparison that is not case sensitive. The strcasecmp() function returns
     * a 0 if the strings are equal.
     */
    if ( strcasecmp( $item->attr_title, \'divider\' ) == 0 && $depth === 1 ) {
        $output .= $indent . \'<li role="presentation" class="divider">\';
    } else if ( strcasecmp( $item->title, \'divider\') == 0 && $depth === 1 ) {
        $output .= $indent . \'<li role="presentation" class="divider">\';
    } else if ( strcasecmp( $item->attr_title, \'dropdown-header\') == 0 && $depth === 1 ) {
        $output .= $indent . \'<li role="presentation" class="dropdown-header">\' . esc_attr( $item->title );
    } else if ( strcasecmp($item->attr_title, \'disabled\' ) == 0 ) {
        $output .= $indent . \'<li role="presentation" class="disabled"><a href="#">\' . esc_attr( $item->title ) . \'</a>\';
    } else {
        $class_names = $value = \'\';
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = \'menu-item-\' . $item->ID;
        $class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item, $args ) );
        if ( $args->has_children )
            $class_names .= \' dropdown\';
        if ( in_array( \'current-menu-item\', $classes ) )
            $class_names .= \' active\';
        $class_names = $class_names ? \' class="\' . esc_attr( $class_names ) . \'"\' : \'\';
        $id = apply_filters( \'nav_menu_item_id\', \'menu-item-\'. $item->ID, $item, $args );
        $id = $id ? \' id="\' . esc_attr( $id ) . \'"\' : \'\';
        $output .= $indent . \'<li\' . $id . $value . $class_names .\'>\';
        $atts = array();
        $atts[\'title\']  = ! empty( $item->title )   ? $item->title  : \'\';
        $atts[\'target\'] = ! empty( $item->target )  ? $item->target : \'\';
        $atts[\'rel\']    = ! empty( $item->xfn )     ? $item->xfn    : \'\';
        // If item has_children add atts to a.
        if ( $args->has_children && $depth === 0 ) {
            $atts[\'href\']           = \'#\';
            $atts[\'data-toggle\']    = \'dropdown\';
            $atts[\'class\']          = \'dropdown-toggle\';
            $atts[\'aria-haspopup\']  = \'true\';
        } else {
            $atts[\'href\'] = ! empty( $item->url ) ? $item->url : \'\';
        }
        $atts = apply_filters( \'nav_menu_link_attributes\', $atts, $item, $args );
        $attributes = \'\';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                $value = ( \'href\' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= \' \' . $attr . \'="\' . $value . \'"\';
            }
        }
        $item_output = $args->before;
        /*
         * Glyphicons
         * ===========
         * Since the the menu item is NOT a Divider or Header we check the see
         * if there is a value in the attr_title property. If the attr_title
         * property is NOT null we apply it as the class name for the glyphicon.
         */
        if ( ! empty( $item->attr_title ) )
            $item_output .= \'<a\'. $attributes .\'><span class="glyphicon \' . esc_attr( $item->attr_title ) . \'"></span>&nbsp;\';
        else
            $item_output .= \'<a\'. $attributes .\'>\';
        $item_output .= $args->link_before . apply_filters( \'the_title\', $item->title, $item->ID ) . $args->link_after;
        $item_output .= ( $args->has_children && 0 === $depth ) ? \' <span class="caret"></span></a>\' : \'</a>\' ;
        $item_output .= $args->after;
        $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
    }
}
/**
 * Traverse elements to create list from elements.
 *
 * Display one element if the element doesn\'t have any children otherwise,
 * display the element and its children. Will only traverse up to the max
 * depth and no ignore elements under that depth.
 *
 * This method shouldn\'t be called directly, use the walk() method instead.
 *
 * @see Walker::start_el()
 * @since 2.5.0
 *
 * @param object $element Data object
 * @param array $children_elements List of elements to continue traversing.
 * @param int $max_depth Max depth to traverse.
 * @param int $depth Depth of current element.
 * @param array $args
 * @param string $output Passed by reference. Used to append additional content.
 * @return null Null on failure with no changes to parameters.
 */
public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
    if ( ! $element )
        return;
    $id_field = $this->db_fields[\'id\'];
    // Display this element.
    if ( is_object( $args[0] ) )
       $args[0]->has_children = ! empty( $children_elements[ $element->$id_field ] );
    parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
/**
 * Menu Fallback
 * =============
 * If this function is assigned to the wp_nav_menu\'s fallback_cb variable
 * and a manu has not been assigned to the theme location in the WordPress
 * menu manager the function with display nothing to a non-logged in user,
 * and will add a link to the WordPress menu manager if logged in as an admin.
 *
 * @param array $args passed from the wp_nav_menu function.
 *
 */
public static function fallback( $args ) {
    if ( current_user_can( \'manage_options\' ) ) {
        extract( $args );
        $fb_output = null;
        if ( $container ) {
            $fb_output = \'<\' . $container;
            if ( $container_id )
                $fb_output .= \' id="\' . $container_id . \'"\';
            if ( $container_class )
                $fb_output .= \' class="\' . $container_class . \'"\';
            $fb_output .= \'>\';
        }
        $fb_output .= \'<ul\';
        if ( $menu_id )
            $fb_output .= \' id="\' . $menu_id . \'"\';
        if ( $menu_class )
            $fb_output .= \' class="\' . $menu_class . \'"\';
        $fb_output .= \'>\';
        $fb_output .= \'<li><a href="\' . admin_url( \'nav-menus.php\' ) . \'">Add a menu</a></li>\';
        $fb_output .= \'</ul>\';
        if ( $container )
            $fb_output .= \'</\' . $container . \'>\';
        echo $fb_output;
    }
}
}

对不起我的英语,提前谢谢!

3 个回复
SO网友:Md.Tauhidul Islam

我解决了这个问题。按照以下说明操作。。。。。

添加脚本

(function($){
$(document).ready(function(){
    $(\'ul.dropdown-menu [data-toggle=dropdown]\').on(\'click\', function(event) {
        event.preventDefault(); 
        event.stopPropagation(); 
        $(this).parent().siblings().removeClass(\'open\');
        $(this).parent().toggleClass(\'open\');
    });
}); 
})(jQuery);
2。去除&& $depth === 0从此行开始:if ( $args->has_children && $depth === 0 ) 在里面wp_bootstrap_navwalker.php 文件

查看屏幕截图here.

SO网友:Leonardo Palomino

您必须删除

&& 0 === $depth
在线上

$item_output .= ( $args->has_children && 0 === $depth ) ? \' <span class="caret"></span></a>\' : \'</a>\';
因此,carret将显示在菜单上的文本旁边。

SO网友:Nick Taylor

对于那些仍在寻找答案的人,我找到了一个解决方案。

此方法仅使用自定义类来针对第二级下拉列表并切换Boostrap.show 第二级下拉列表中的类。

1) 在WP Dashboard Menus部分中,将第二级下拉链接设置为href="#".

2) 将自定义类设置为dropdown-sub.

3) 将此添加到js:

$(\'.dropdown-sub\', this).click(function(e){
    $(\'.dropdown-menu\', this).toggleClass(\'show\');
})

//This is to stop the Bootstrap menu from closing when a link is clicked.
$(document).on(\'click\', \'.dropdown\', function (e) {
    e.stopPropagation();
});
4)将此添加到css中:

.dropdown-sub a[href$=\'#\']:after {
    display: inline-block;
    width: 0;
    height: 0;
    margin-left: .255em;
    vertical-align: .255em;
    content: "";
    border-top: .3em solid;
    border-right: .3em solid transparent;
    border-bottom: 0;
    border-left: .3em solid transparent;
}
}
第4步只是将克拉添加到第二级下拉列表的末尾。

您不需要使用此方法修改navwalker。

相关推荐

WordPress中声明SplitMenuWalker::Walk($Elements,$max_Depth)时出现警告

我开始在WordPress网站上收到以下错误:警告:SplitMenuWalker::walk($elements,$max\\u depth)的声明应与/home/relati67/public\\u html/wp content/themes/mentis/inc/mega menu/split menu中的walk::walk($elements,$max\\u depth,$args)兼容。php第0行我不知道在这里该怎么办。我发现了一个具有类似内容的线程,但错误指向特定行(不是第0行),并且不