在Walker函数中使用Menu类

时间:2014-01-11 作者:Doidgey

是否使用选项中打开的自定义菜单css类,通过walker函数将这些类应用于span 而不是li\'s?

我的定制助行器:

class ik_walker extends Walker_Nav_Menu {

    function start_lvl(&$output, $depth) {
        $GLOBALS[\'ik_walker_counter\'] = 0;
        $output .= \'<nav class="site-navigation" role="navigation">\'.
            \'<ul>\';
    }

    function end_lvl(&$output, $depth) {
        $output .= \'</ul>\'.
            \'<button id="menu" class="menu-button" type="button" role="button" aria-label="Menu Toggle">\'.
            \'<span class="icon-menu"></span>\'.
            \'</button>\'.
            \'</div>\';
    }

    function start_el(&$output, $item, $depth, $args) {
        global $wp_query;
        $GLOBALS[\'ik_walker_counter\']++;
        $indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';
        $class_names = $value = \'\';
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) );
        $class_names = \' class="\' . esc_attr( $class_names ) . \'"\';
        $output .= $indent . \'<li id="menu-item-\'. $item->ID . \'"\' . $value . $class_names .\'>\';
        $attributes  = ! empty( $item->attr_title ) ? \' title="\'  . esc_attr( $item->attr_title ) .\'"\' : \'\';
        $attributes .= ! empty( $item->target )  ? \' target="\' . esc_attr( $item->target     ) .\'"\' : \'\';
        $attributes .= ! empty( $item->xfn )        ? \' rel="\'  . esc_attr( $item->xfn      ) .\'"\' : \'\';
        $attributes .= ! empty( $item->url )        ? \' href="\'   . esc_attr( $item->url        ) .\'"\' : \'\';
        $attributes .= \' class="c\'.$GLOBALS[\'ik_walker_counter\'].\'"\';
        $item_output = $args->before;
        $item_output .= \'<a\'. $attributes .\'>\';
        $item_output .= $args->link_before . apply_filters( \'the_title\', $item->title, $item->ID ) . $args->link_after;
        if(strlen($item->description)>2){ $item_output .= \'<br /><span class="sub">\' . $item->description . \'</span>\'; }
        $item_output .= \'<span class="\'. $item->classes .\'"></span>\';
        $item_output .= \'</a>\';
        $item_output .= $args->after;
        $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
    }
}
我试着这样做:

$item_output .= \'<span class="\'. $item->classes .\'"></span>\';
但我只是得到:

<span class="Array"></span>
这将使我能够通过菜单css选项控制该类,以便每个类都可以有一个唯一的类。

任何帮助都将不胜感激。

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

加入所有类名:

请尝试:

$item_output .= sprintf( \'<span class="%s"></span>\', join( \' \', $item->classes ) );
而不是

$item_output .= \'<span class="\'. $item->classes .\'"></span>\';
连接的数组元素$item->classes 变成一个字符串。

例如,如果添加aaa bbb ccc 对于项目的类文本字段,它将显示如下:

 Array
                (
                    [0] => aaa
                    [1] => bbb
                    [2] => ccc
                    [3] => menu-item
                    [4] => menu-item-type-post_type
                    [5] => menu-item-object-post
                )
过滤掉类名:如果要删除所有包含item 您可以使用:

$item_output .= sprintf( \'<span class="%s"></span>\', 
                          join( \' \', array_filter( $item->classes, \'custom_filter\' ) ) 
                );
其中,数组筛选器回调为

/**
 * Only keep items not containing the string \'item\'
 *
 * @param string $var
 * @return string $var | \'\' Empty if contains \'item\'
 */

function custom_filter( $var )
{
    return ( FALSE === strpos( $var, \'item\' ) ) ? $var : \'\'; 
}
我想我们可以省去包含item, 否则,您可以根据需要进行修改

结束

相关推荐

如果子对象处于活动状态,则在CustomWalker中将类添加到父对象

我正在为wordpress主导航区编写customWalker。但是我有点被困在如何找到一个类并将其添加到孩子的家长的活动中。比如说我让整个customwalker工作得很好,所有家长在活动时都分配了一个活动类,但是当子类活动时,我如何将活动类分配给家长?当当前的\\u page\\u项目如下所示时,我成功地将一个活动类分配到了最顶层:if($depth === 0){ $class_names = str_replace(\'current_page_item\', \'