在wordpress自定义菜单查看器中更改安莉类名

时间:2014-05-29 作者:Steph Gill

我正在构建一个nav,该nav将一个类应用于主LI和嵌套LI。示例:

<ul>
<li class="className">Test</li>
<li class="className">Test
    <ul>
        <li class="ADifferentclassName">test</li>
        <li class="ADifferentclassName">test</li>
    </ul>
</li>
</ul>
我已经知道如何在UL和所有LI上获取类,但我可以知道如何在嵌套的LI上获取不同的类。

这是我的定制助行器:

这将更改nest UL类

 class My_Walker_Nav_Menu extends Walker_Nav_Menu {
  function start_lvl(&$output, $depth) {
    $indent = str_repeat("\\t", $depth);
    $output .= "\\n$indent<ul class=\\"nav-main-sub-list\\">\\n";
  }
这将去掉所有无关的wordpress类,并将class nav main项添加到所有li

    public function start_el( &$output, $item, $depth, $args )
    {

        $attributes  = \'\';

        ! empty ( $item->attr_title )
            // Avoid redundant titles
            and $item->attr_title !== $item->title
            and $attributes .= \' title="\' . esc_attr( $item->attr_title ) .\'"\';

        ! empty ( $item->url )
            and $attributes .= \' href="\' . esc_attr( $item->url ) .\'"\';

        $attributes  = trim( $attributes );
        $title       = apply_filters( \'the_title\', $item->title, $item->ID );
        $item_output = "$args->before<a $attributes>$args->link_before$title</a>"
                        . "$args->link_after$args->after";

        // Since $output is called by reference we don\'t need to return anything.


        $output .= $indent . \'<li class="nav-main-item">\';

        $output .= apply_filters(
            \'walker_nav_menu_start_el\'
            ,   $item_output
            ,   $item
            ,   $depth
            ,   $args
        );
    }   

}
我只是不知道如何更改嵌套LI上的类。我所做的一切都不起作用。有什么建议吗?

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

故障排除启用WP_DEBUG 常量inwp-config.php 暴露了以下错误:

-函数签名

如果启用了严格标准,您将看到一个错误,详细说明不兼容的方法签名。虽然不是绝对必要,但我喜欢尽可能多地消除错误。要更正此问题,新的Walker_Nav_Menu 类别的start_el()start_lvl() 方法的声明需要匹配those of Walker_Nav_Menu class itself 这样,新类就可以作为Walker_Nav_Menu 类,而不会引发各种与参数/参数相关的错误。

这是:

class Wpse_145991_Walker_Nav_Menu extends Walker_Nav_Menu {
    function start_lvl( &$output, $depth ) {
        //...
    }

    public function start_el( &$output, $item, $depth, $args ) {
        //...
    }
}
应该变成这样:

class Wpse_145991_Walker_Nav_Menu extends Walker_Nav_Menu {
    function start_lvl( &$output, $depth = 0, $args = array() ) {
        //...
    }

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

-Notice: Undefined variable: indent

接近新类的底部start_el() 方法您将看到该行

$output .= $indent . \'<li class="nav-main-item">\';
但是$indent 从未在方法中定义。Walker 课程倾向于设置$indent 用于将HTML空白格式化为计数的变量$depth 制表符。这与功能无关,但可以通过定义$indent 在上述行之前的某处:

$indent = str_repeat("\\t", $depth);
此时,问题中发布的实现应该生成一个菜单,而不会抛出任何错误或警告。

Walker_Nav_Menuwalk()ing,两个start_el()start_lvl() 方法传递了$depth 可被视为代表“级别”、“子菜单”或<ul> 当前项和数据根(即顶层)之间的元素<ul> 要素

Walker_Nav_Menu $depth Parameter

通过在此基础上有条件地分支来实现$depth, 您可以为不同的元素分配不同的类&;级别。例如,使用switch 允许您为每个项目和级别微调类:

class Wpse_145991_Walker_Nav_Menu extends Walker_Nav_Menu {
    function start_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat( "\\t", $depth );

        // Select a CSS class for this `<ul>` based on $depth
        switch( $depth ) {
            case 0:
                // Top-level submenus get the \'nav-main-sub-list\' class
                $class = \'nav-main-sub-list\';
                break;
            case 1:
            case 2:
            case 3:
                // Submenus nested 1-3 levels deep get the \'nav-other-sub-list\' class
                $class = \'nav-other-sub-list\';
                break;
            default:
                // All other submenu `<ul>`s receive no class
                break;
        }

        // Only print out the \'class\' attribute if a class has been assigned
        if( isset( $class ) )
            $output .= "\\n$indent<ul class=\\"$class\\">\\n";
        else
            $output .= "\\n$indent<ul>\\n";
    }

    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        $indent = str_repeat("\\t", $depth);
        $attributes  = \'\';

        ! empty ( $item->attr_title )
        // Avoid redundant titles
        and $item->attr_title !== $item->title
        and $attributes .= \' title="\' . esc_attr( $item->attr_title ) .\'"\';

        ! empty ( $item->url )
        and $attributes .= \' href="\' . esc_attr( $item->url ) .\'"\';

        $attributes  = trim( $attributes );
        $title       = apply_filters( \'the_title\', $item->title, $item->ID );
        $item_output = "$args->before<a $attributes>$args->link_before$title</a>"
                       . "$args->link_after$args->after";

        // Select a CSS class for this `<li>` based on $depth
        switch( $depth ) {
            case 0:
                // Top-level `<li>`s get the \'nav-main-item\' class
                $class = \'nav-main-item\';
                break;
            default:
                // All other `<li>`s receive no class
                break;
        }

        // Only print out the \'class\' attribute if a class has been assigned
        if( isset( $class ) )
            $output .= $indent . \'<li class="\'. $class . \'">\';
        else
            $output .= $indent \'<li>\';

        $output .= apply_filters(
                \'walker_nav_menu_start_el\',
                $item_output,
                $item,
                $depth,
                $args
            );
    }
}

结束