如何将参数传递给我的自定义Walker?

时间:2011-10-16 作者:josh

我已经设置了一个自定义walker,当我硬编码我的变量时,它可以根据需要工作。

我想要的是能够调用我的walker,并将walker中使用的变量传递给它。

例如:

 \'walker\'          => new Plus_walker($refine => \'review\'), 
我调整输出的步行器http://URL/review 以便在此菜单项的“审阅”类别中查找帖子。但我希望能够使用同一个助行器进行“预览”、“采访”等。到目前为止,我输入变量的尝试打破了“解析错误:语法错误,意外的T\\u双箭头”这一整件事。

我知道我可以重写代码并制作一些不同的walker(Review\\u walker、Preview\\u walker等),但这似乎是错误的(我认为这可能是一件重要的事情……)

我的沃克密码在这里:

class plus_walker extends Walker_Nav_Menu {

    var $refine;

        function __construct($refine) {

            $this->refine = $refine;
        }


      function start_el(&$output, $item, $depth, $args)
      {
           global $wp_query;
           $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     )  . \'\' : \'\'; //This is where I want the argument to live.

    $modded_url = substr($attributes,0,-1) . \'+\' . $refine . \'"\';

            $item_output = $args->before;
            $item_output .= \'<a\'. $modded_url .\'>\';
            $item_output .= $args->link_before .$prepend.apply_filters( \'the_title\', $item->title, $item->ID ).$append;
            $item_output .= $description.$args->link_after;
            $item_output .= \'</a>\';
            $item_output .= $args->after;

            $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
            }
}
以及我的模板中的php调用:

<?php wp_nav_menu( array(
                            \'menu\' => \'Handheld\', 
                                \'container\'       => \'div\', 
                                \'container_class\' => \'col_1\', 
                                //\'container_id\'    => ,
                                \'menu_class\'      => \'menu\', 
                                //  \'menu_id\'         => ,
                                \'echo\'            => true,
                                \'fallback_cb\'     => \'wp_page_menu\',

                                \'items_wrap\'      => \'<ul id="%1$s" class="%2$s">%3$s</ul>\',
                                \'depth\'           => 0,
                                \'walker\'          => new Plus_walker(array($refine => \'review\')), 


        )

        ); ?>
我尝试了一系列不同的配置:“refine”=>“review,有无数组,但仍然没有乐趣,只有错误(大部分是意外的“=>”)。

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

本机助行器由触发walk() 方法和未设置为在创建时接收数据。您可以为此定义自定义属性和构造函数方法:

class plus_walker extends Walker_Nav_Menu {

    var $refine;

    function __construct($refine) {

        $this->refine = $refine;
    }

}

//stuff

\'walker\' => new plus_walker(\'review\');
之后,您可以通过以下方式访问自定义数据:$this->refine 用沃克的方法。

SO网友:Kevin Leary

另一种方法是向wp_nav_menu() 作用如果您需要从walker类之外传递一个值,这很方便:

wp_nav_menu( array( 
    \'theme_location\' => \'secondary\',
    \'depth\' => 1,
    \'walker\' => new Custom_Walker(),
    \'walker_arg\' => \'Custom argument value here\'
) );
然后,可以从walker类中访问此自定义参数start_el() walker类内部的函数(Walker_Nav_Menu::start_el()) 像这样:

$custom_arg = esc_attr( $args->walker_arg );
希望这能有所帮助,它能帮助解决一些模糊的情况,我遇到了上面Rarst的建议可能无法很好地处理。

SO网友:Jannis

只需稍微修改一下start_el() 作用

首先,调用元素wp_nav_menu (或使用函数的任何其他walker)的参数。

start_el 功能,您可以通过$args[\'walker_arg\']; 请注意walker_arg 可以根据您的需要进行更改。

此外,通过这一点以及部分Kevin Leary的解决方案,您可以将多个自定义参数传递给walker!

结束

相关推荐

Custom Post Type Menus

我正在写一个插件,因为我们的主要网站最终将被移植到WordPress。我已经为这个插件计划了多个自定义帖子类型,并希望将它们全部组合到一个主菜单中。大体上I want the \"Visitors\" link to be placed under \"Argus Admin\". 没有必要添加其他链接,因为我可以在任何地方“黑客”这些链接。 $v_args = array( \'labels\' => array ( \'nam