J'ai du mal à comprendre comment WordPress utilise la classe Walker. En particulier, je ne comprends pas la méthode walk()
(je pense).
Tout d'abord, laissez-moi vous expliquer ce que j'ai compris:
Lors de l'appel wp_nav_menu()
, il est possible d'ajouter un tableau en tant qu'argument, contenant des informations/options telles que la profondeur, le conteneur, l'emplacement du thème, le marcheur à utiliser, etc. .
Dans wp_nav_menu()
, ces arguments sont fusionnés avec les valeurs par défaut. Le tableau résultant (ultérieurement converti en objet) appelé $args
.
Dans wp_nav_menu()
, walk_nav_menu_tree()
est appelé, recevant $sorted_menu_items
, $args->depth
et $args
comme arguments.
Jusque-là, je suis capable de comprendre ce qui se passe, mais à l'intérieur de walk_nav_menu_tree()
, la classe Walker est instanciée et c'est là que je ne peux pas suivre. plus.
Après instanciation, la méthode walk()
du Walker utilisé est appelée.
Selon sa signature, walk()
accepte deux arguments: $elements
et $max_depth
.
Mais dans walk_nav_menu_tree()
, walk()
ne reçoit qu'un seul argument appelé $args
, qui est un tableau contenant les arguments transmis à walk_nav_menu_tree()
, qui sont en réalité des $items
(= $sorted_menu_items
), $depth
(= $args->depth
). , $r
(= $args
).
Comme si cela ne causait pas déjà suffisamment de confusion, au début de la méthode walk()
, il y a cette ligne:
$args = array_slice(func_get_args(), 2);
Ce qui se passe ici utilise func_get_args()
, tous les arguments passés à la méthode sont rassemblés dans un tableau, à partir duquel les deux premières parties sont omises, ce qui nous laisse avec $args
contenant uniquement le contenu d'un troisième argument non visible dans la méthode. Signature.
Maintenant, comment cela fonctionne-t-il? Comme je l'ai déjà signalé, walk()
n'est appelé qu'avec un seul argument. Comment peut-on donc laisser $elements
et $max_depth
sans générer d'erreur?
Par commentaires, il est appelé avec call_user_func_array
, de sorte que les 2 premiers éléments sont affectés aux arguments déclarés $elements
et $max_depth
, en laissant le troisième élément ($r
qui est le $args
original) à affecter par array_slice à $args
. Par exemple
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 );