我正在努力理解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
被遗漏,而不会导致错误?
最合适的回答,由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 );