一个最小的菜单步行器看起来是什么样子?

时间:2013-09-01 作者:danijar

根据docs of wp_nav_menu 我们可以指定自己的walker函数。他们建议复制默认值并根据需要进行修改。但老实说,这有点太复杂了,让人难以理解。

您能提供一个定制菜单漫游器的最小示例吗?

例如,没有子菜单项,没有包装容器,没有默认walker应用的所有类。只有一个类.current-menu-item 当然,这很重要。还可以包括指定菜单项的HTML元素的方法。

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

你可以创造一个非常简单的步行者,比如this one. 要检测当前项目,请检查$item->current. 是的TRUE 仅适用于当前项目。

我不会添加一个类,但会完全停用这个无用的链接,因为它不必是可点击的。

示例:

class One_Line_Walker extends Walker
{
    public function walk( $elements, $max_depth )
    {
        $list = array ();

        foreach ( $elements as $item )
        {
            if ( $item->current )
                $list[] = "<b title=\'You are here\'>$item->title</b>";
            else
                $list[] = "<a href=\'$item->url\'>$item->title</a>";
        }

        return join( "\\n", $list );
    }
}
在你的主题中,像这样使用助行器:

wp_nav_menu(
    array (
        \'theme_location\'  => \'your_theme_location\',
        \'walker\'          => new One_Line_Walker,
        \'container\'       => \'\',
        \'items_wrap\' => \'<p>%3$s</p>\',
        \'depth\'           => 1
    )
);
请参见my post about items_wrap 有关<p>%3$s</p>.

SO网友:hakre

大多数时候,你只需要Walker::walk() 方法,对于此类情况Callback_Walker 可以这样做,允许您为其注册回调。

如果使用闭包和现代PHP版本(>=5.4),您可以获得Closure::bind():

class Callback_Walker extends Walker {
    private $callback = $callback;

    public static function create( $callback ) {
        return new self( $callback );
    }

    public function __construct( $callback, $bindClosure = TRUE ) {
        $this->callback = $callback;        
        if ( $bindClosure and $callback instanceof Closure ) {
            Closure::bind( $callback, $this, __CLASS__ )
        }
    }

    function walk( $elements, $max_depth ) {
        return $this->callback 
               ? call_user_func( $this->callback, $elements, $max_depth )
               : parent::walk( $elements, $max_depth );
    }
}
到目前为止,单凭这一点并没有任何作用,但公然复制了@toscho的例子,这就是它的使用方式:

wp_nav_menu(
    array (
        \'theme_location\' => \'your_theme_location\',
        \'walker\'         => Callback_Walker::create( function( $elements, $max_depth ) 
        {
            $list = array();

            foreach ( $elements as $item )
            {
                $list[] = $item->current
                    ? "<b title=\'You are here\'>{$item->title}</b>"
                    : "<a href=\'{$item->url}\'>{$item->title}</a>";
            }

            return join( "\\n", $list );
        } ),
        \'container\'      => \'\',
        \'items_wrap\'     => \'<p>%3$s</p>\',
        \'depth\'          => 1
    )
);
我希望他能原谅我;)

结束

相关推荐

使用unctions.php中的walker向自定义分类添加“活动”类

我试图在函数中使用以下代码。php以显示带有类别的菜单(实际上是自定义分类法)。我只是想让它在当前页面上显示活动状态。我做错了什么?我还看到$category = get_category($mycatid); 行不填充$category 变量<?php class walker_archives extends Walker_Nav_Menu { public function start_el( &$output, $item, $depth, $args