WordPressがWalkerクラスをどのように使用しているのか理解していません。特に、私はwalk()
メソッドを理解していません(私は思います)。
まず、私が理解したことを説明しましょう。
wp_nav_menu()
を呼び出すときには、depth、container、theme location、walkerなどの情報/オプションを含む配列を引数として追加することができます。
wp_nav_menu()
内では、これらの引数はデフォルト値とマージされています。結果の配列(後でオブジェクトにキャスト)は$args
と呼ばれます。
wp_nav_menu()
内で、 walk_nav_menu_tree()
が呼び出され、引数として$sorted_menu_items
、$args->depth
および$args
を受け取ります。
その時点まで私は何が起こっているのか理解することができますが、walk_nav_menu_tree()
の中では Walkerクラス がインスタンス化されています、そしてこれは私がもう追いかけられないところです。
インスタンス化後、使用されたWalkerのwalk()
メソッドが呼び出されます。
そのシグネチャによれば、walk()
は2つの引数、$elements
および$max_depth
を受け入れます。
しかしwalk_nav_menu_tree()
では、walk()
は$args
と呼ばれる1つの引数のみを渡されます。これはwalk_nav_menu_tree()
に渡される引数を含む配列で、実際は$items
(= $sorted_menu_items
)です。 、$depth
(= $args->depth
)、$r
(= $args
).
walk()
メソッドの最初に、これで十分に混乱しないように、次の行があります。
$args = array_slice(func_get_args(), 2);
ここで起こることはfunc_get_args()
を使うことです、メソッドに渡されるすべての引数は配列に集められます、そしてそれから最初の2つの部分は省略されます、それで私たちはメソッドで見えない3番目の引数の内容を含む$args
を残します署名。
さて、walk()
は1つの引数だけで呼び出されるので、エラーにならずに$elements
と$max_depth
を省略することができるのですか。
コメントごとに、 call_user_func_array
で呼び出されるため、最初の2つの要素は宣言された引数$elements
と$max_depth
に割り当てられ、3番目の要素($r
は残り)元の$args
)はarray_sliceを介して$args
に割り当てられます。例えば
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 );