自定义菜单查看器-根据类名删除li标记

时间:2017-05-22 作者:kiarashi

我正在使用wp_nav_menu() 使用自定义walker.

<ul>
<li id="menu-item-799" class="menu-item ... custom-theme-class"><a href="#">custom content</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
...
</ul>
现在我想更改li 输出取决于类名。我用的是这样的东西:

function theme_function($item_output, $item, $depth, $args){    

    $output = \'\';       

    // Overview Menu
    if ( in_array( \'custom-theme-class\', (array) $item->classes ) ) {
        $item_output = \'<div class="navbar-item">\'. wp_kses( $item->title, wp_kses_allowed_html( \'post\' ) ) .\'</div>\';
    }   

        return $item_output;  

    }
    add_filter(\'walker_nav_menu_start_el\', \'theme_function\', 10, 4);    
这只是改变

<li ...><a href="#">custom content</a></li>

<li ..."><div class="navbar-item">custom content</div></li>
而我希望删除li 还有标签。所以它变成了

<div class="navbar-item">custom content</div> (without the li tags)
在我的自定义菜单中walker 我使用了以下方法,但不起作用。

function start_el(&$output, $item, $depth = 0, $args = array() , $id = 0) {

    ... 

    if ( in_array( \'custom-theme-class\', (array) $item->classes ) ) {
        $output .= \'\';
    } else {
        $output .= $indent . \'<li\' . $id . $value . $class_names . $data_dropdown . \'>\';
    }

}


function end_el(&$output, $item, $depth = 0, $args = array()) {

    $classes = empty($item->classes) ? array() : (array)$item->classes;

    $has_children = in_array(\'menu-item-has-children\', $classes);

    if ($has_children && $depth == 0) {            
        $output.= "</div>\\n";
    }

    if ( in_array( \'custom-theme-class\', (array) $item->classes ) ) {
        $output .= \'\';
    } else {
        $output.= "</li>\\n";
    }

}
Theli 当菜单与一起使用时,标记仍然显示custom-theme-class css类。

我错过了什么?非常感谢您的帮助。

1 个回复
最合适的回答,由SO网友:WebElaine 整理而成

登录时是否有错误?如果您运行的是最新版本的WP,这应该会引发一个错误,因为start\\u el和end\\u el是公共函数。

此外,如果您使用的是自定义walker,则应仅使用walker,而不使用附加的theme\\u函数。

class wpseWalker extends Walker_Nav_Menu {
    public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = \'menu-item-\' . $item->ID;
        if(in_array(\'custom-theme-class\', $classes) {
            $output .= \'<div class="navbar-item">\' . $value;
        } else {
            $output .= $indent . \'<li\' . $id . $value . $class_names . $data_dropdown . \'>\';
        }
    }
    public function end_el( &$output, $item, $depth = 0, $args = array() ) {
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = \'menu-item-\' . $item->ID;
        if(in_array(\'custom-theme-class\', $classes) {
            $output .= "</div>\\n";
        } else {
            $output .= "</li>\\n";
        }
    }
}

结束

相关推荐

使用自定义Walker拆分wp_NAV_MENU

我正在尝试创建一个最多显示5个项目的菜单。如果有更多项目,则应将其包装到另一个项目中<ul> 元素创建下拉列表。5项或更少:6项或更多我知道这类功能可以很容易地用一个助行器创建,该助行器可以计算菜单项的数量,如果有5个以上的菜单项,则将其包装成一个单独的<ul>. 但我不知道如何创造这个步行者。当前显示我的菜单的代码如下:<?php wp_nav_menu( array( \'theme_location\' => \'navigation\', \'fallback_