我正在尝试替换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 有这个问题(在评论中提到),但没有得到答案。我翻遍了文件,但似乎什么也没找到。
非常感谢您的帮助。
最合适的回答,由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 );