通过扩展Walker_Nav_Menu实现条分隔导航

时间:2011-08-23 作者:Scott

我的标题中有以下菜单:

<?php
$args = array(
    \'menu\'            => \'Main Menu\',
    \'container\'       => false,
    \'depth\'           => 1,
    \'items_wrap\'      => \'%3$s\',
    \'walker\'          => new Bar_List_Walker_Nav_Menu
);
wp_nav_menu($args);
?>
我想让输出像这样:

link1 | link2 | link3 | link4 | link5
所以我开始做一个walker函数,这里是我要做的:

class Bar_List_Walker_Nav_Menu extends Walker_Nav_Menu {
    public $count;
    function start_lvl(&$output, $depth) {}
    function end_lvl(&$output, $depth) {}
    function start_el(&$output, $item, $depth, $args) {
        $attributes = ! empty( $item->target )     ? \' target="\' . esc_attr( $item->target     ) .\'"\' : \'\';
        $attributes .= ! empty( $item->url )        ? \' href="\'   . esc_attr( $item->url        ) .\'"\' : \'\';

        $item_output .= \'<a\'. $attributes .\'>\';
        $item_output .= apply_filters( \'the_title\', $item->title, $item->ID );
        $item_output .= \'</a>\';

        $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
    }
    function end_el(&$output, $item, $depth) {
        static $count;
        $count++;
        if(!$this->count >= $count) {
            $output .= " | ";
        }
    }
    function walk( $elements, $max_depth ) {
        $this->count = count($elements);
        parent::walk( $elements, $max_depth );
    }
}
这将输出以下错误:

Warning: Missing argument 4 for Bar_List_Walker_Nav_Menu::start_el() in C:\\xampp\\DEV\\Stace\\trunk\\wp-content\\themes\\philosophy\\functions.php on line 100
如果我删除该功能walk() 从我的学步课上看,它工作得很好,只是计数不再被抓住,结果是一个| 导航末尾添加了太多内容。

任何人都可以使用代码来获得我想要的输出吗?

2 个回复
最合适的回答,由SO网友:Bo Carlson 整理而成

您可以使用项目内的菜单顺序来查看它是否不是第一个。如果没有,则在锚之前绘制角色。

class Bar_List_Walker_Nav_Menu extends Walker_Nav_Menu {
    private $separator = " | ";
    function start_el(&$output, $item, $depth, $args) {
        if($item->menu_order > 1){
            $output .= $this->separator;
        }
        $attributes  = ! empty( $item->target )     ? \' target="\' . esc_attr( $item->target     ) .\'"\' : \'\';
        $attributes .= ! empty( $item->url )        ? \' href="\'   . esc_attr( $item->url        ) .\'"\' : \'\';
        $output .= \'<a\'. $attributes .\'>\';
        $output .= apply_filters( \'the_title\', $item->title, $item->ID );
        $output .= \'</a>\';
    }
}

SO网友:Rarst

在聊天室中进行讨论后:

class Bar_List_Walker_Nav_Menu extends Walker_Nav_Menu {
    public $count;
    function start_el(&$output, $item, $depth, $args) {
        $attributes  = ! empty( $item->target )     ? \' target="\' . esc_attr( $item->target     ) .\'"\' : \'\';
        $attributes .= ! empty( $item->url )        ? \' href="\'   . esc_attr( $item->url        ) .\'"\' : \'\';
        $output .= \'<a\'. $attributes .\'>\';
        $output .= apply_filters( \'the_title\', $item->title, $item->ID );
        $output .= \'</a>\';
    }
    function end_el(&$output, $item, $depth) {
        static $count;
        $count++;
        if($this->count > $count)
            $output .= " | ";
    }
    function walk( $elements, $max_depth, $r ) {
        $this->count = count($elements);
        return parent::walk( $elements, $max_depth, $r );
    }
}

结束