Walker类:在理解如何正确调用walk()方法方面存在问题

时间:2014-12-20 作者:Sven

我正在努力理解WordPress如何使用Walker类。特别是,我不明白walk() 方法(我认为)。

首先,让我解释一下我的理解:

呼叫时wp_nav_menu(), 可以添加一个数组作为参数,其中包含信息/选项,如深度、容器、主题位置、要使用的walker等。

在…内wp_nav_menu(), 这些参数与默认值合并。生成的数组(稍后转换为对象)调用$args.

在…内wp_nav_menu(), walk_nav_menu_tree() 正在调用,正在接收$sorted_menu_items, $args->depth$args 作为参数。

在那之前,我能够理解正在发生的事情,但内心walk_nav_menu_tree(), 这个Walker class 是实例化的,这是我无法继续的地方。

实例化后walk() 调用所使用的Walker方法。

根据其签名,walk() 接受两个参数:$elements$max_depth.

但在walk_nav_menu_tree(), walk() 只传递一个调用的参数$args,它是一个数组,包含传递给的参数walk_nav_menu_tree(), 实际上是$items(=$sorted_menu_items), $depth (=$args->depth), $r (=$args).

似乎这还不够混乱walk() 方法,有一行:

$args = array_slice(func_get_args(), 2);
这里发生的是使用func_get_args(), 传递给该方法的所有参数都被收集到一个数组中,从中省略前两部分,这就给我们留下了$args 仅包含在方法签名中不可见的第三个参数的内容。

现在,正如我指出的那样,这到底是怎么回事walk() 仅使用一个参数调用,因此$elements$max_depth 被遗漏,而不会导致错误?

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

根据评论,调用时使用call_user_func_array, 因此,前2个元素被分配给声明的参数$elements$max_depth, 离开第三个元素($r 哪个是原件$args) 通过array\\u slice分配给$args. Eg公司

function wpse172812( $elements, $max_depth ) {
    $args = array_slice(func_get_args(), 2);
    error_log("elements=$elements, max_depth=$max_depth, args=" . print_r( $args, true ));
    // elements=arg1, max_depth=arg2,
    // args=Array ( [0] => Array ( [menu] => my_id [menu_class] => my_class ) )
}
$args = array( \'arg1\', \'arg2\', array( \'menu\' => \'my_id\', \'menu_class\' => \'my_class\' ) );
call_user_func_array( \'wpse172812\', $args );

结束

相关推荐

为什么is_page(Id)不能在unctions.php中工作?

何时是函数中的代码。是否执行php?是在循环中吗?当置于函数中时,以下各项不起作用。php(不在函数内):if (is_page( 27 )) { echo \'this is the apply page\'; } 法典规定is_page() 无法在循环内运行。