在walker参数上使用字符串而不是对象类实例化会中断wp_NAV_MENU

时间:2018-02-28 作者:Mihai

我正在尝试替换walker 参数来自new My_Walker_Nav_Menu() 到字符串\'My_Walker_Nav_Menu\' 在此wp\\U nav\\U菜单调用中(按原样工作)

wp_nav_menu(
     array(
           \'theme_location\'    => \'header_nav\',
           \'menu_class\'             => \'main-menu\',
           \'container\'         => \'\',
           \'fallback_cb\'       => false,
           \'walker\' => new My_Walker_Nav_Menu()
           )
     );
当我将其更改为字符串时,会出现以下错误Fatal error: Using $this when not in object context

课程是基本的:

class My_Walker_Nav_Menu extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = Array()) {
        $indent = str_repeat("\\t", $depth);
        if(\'header_nav\' == $args->theme_location ){
            $output .=\'<span class="toggle-submenu fa fa-angle-down"></span>\';
        }
        $output .= "\\n$indent<ul class=\\"sub-menu\\">\\n";
    }
}
我需要这样做是因为apparently 自定义程序的部分刷新不适用于自定义漫游器。

当自定义程序确定无法执行部分刷新时,它会返回到执行整页刷新。菜单更改将获得整页刷新的条件包括:

。。。

或者使用walker对象实例调用wp\\u nav\\u menu(),而不是使用类名字符串Somebody else 有这个问题(在评论中提到),但没有得到答案。我翻遍了文件,但似乎什么也没找到。

非常感谢您的帮助。

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

显然,虽然应该支持自定义导航菜单漫游器,但不支持它们。我很惊讶现在才发现这一点。然而,有一个简单的方法可以让它们工作。只需将此添加到主题中:

add_filter( \'wp_nav_menu_args\', function( $args ) {
    if ( isset( $args[\'walker\'] ) && is_string( $args[\'walker\'] ) && class_exists( $args[\'walker\'] ) ) {
        $args[\'walker\'] = new $args[\'walker\'];
    }
    return $args;
}, 1001 ); // 1001 because \\WP_Customize_Nav_Menus::filter_wp_nav_menu_args() runs at 1000.
以下core补丁将不再需要此过滤器:

--- src/wp-includes/nav-menu-template.php
+++ src/wp-includes/nav-menu-template.php
@@ -526,6 +526,9 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
  */
 function walk_nav_menu_tree( $items, $depth, $r ) {
    $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
+   if ( is_string( $walker ) && class_exists( $walker ) ) {
+       $walker = new $walker();
+   }
    $args = array( $items, $depth, $r );

    return call_user_func_array( array( $walker, \'walk\' ), $args );

结束

相关推荐

替换NavWalker下拉元素

我正在为我的学校创建一个网站Material Design for Bootstrap 以及NavWalker 给了我一些问题,我想更改下拉列表的元素,即ul 到div. 我试图编辑NavWalker.$output .= \"\\n$indent<div class=\\\" dropdown-menu dropdown-primary\\\" aria-labelledby=\\\"navbarDropdownMenuLink\\\" >\\n\"; 我编辑了代码并替换了DIV而