Existe-t-il un moyen de saisir les éléments du menu nav en tant que tableau multidimensionnel au lieu d'un tableau plat?
Par une structure arborescente, je veux dire quelque chose qui préserverait la relation entre les éléments enfant et parent, comme ça (ce n'est qu'un exemple)…
array(
array(
'post_type' => 'page',
'post_name' => 'Home',
'children' => array()
),
array(
'post_type' => 'page',
'post_name' => 'About Us',
'children' => array(
array(
'post_type' => 'page',
'post_name' => 'Our History',
'children' => array()
)
)
)
)
Il y a une wp_get_nav_menu_items()
fonction mais elle renvoie un tableau unidimensionnel avec tous les éléments au même niveau, ce qui n'est pas ce que je veux. WordPress inclut-il une méthode intégrée pour obtenir un tableau multidimensionnel pour mes éléments de menu? Sinon, quelle est la meilleure façon d'intégrer wp_get_nav_menu_items()
une structure arborescente dans un tableau multidimensionnel en termes de performances?
Walker
classe gère automatiquement la profondeur des éléments de menu de navigation triés, même si le tableau est plat.Réponses:
Le problème de la construction d'un arbre à partir d'un tableau plat a été résolu ici avec cette solution récursive légèrement modifiée:
où nous avons ajouté l'
wpse_children
attribut préfixé pour éviter la collision de noms.Il ne nous reste plus qu'à définir une simple fonction d'aide:
Maintenant, il devient super facile de transformer un menu de navigation en sa structure arborescente avec:
Pour JSON, nous pouvons simplement utiliser:
Pour une version légèrement différente, où nous avons trié sur le volet les attributs, consultez la première révision de cette réponse ici .
Mise à jour: Walker Class
Voici une idée assez sommaire de la façon dont nous pourrions essayer de nous accrocher à la partie récursive de la
display_element()
méthode de laWalker
classe abstraite .où
WPSE_Nav_Menu_Tree
est une extension de laWalker_Nav_Menu
classe:Cela pourrait nous donner une approche alternative si cela fonctionne.
la source
wp_get_nav_menu_items
récursivement.En bref, la fonction ci-dessous crée l'arbre des objets en plaçant les enfants dans une nouvelle propriété enfants à l'intérieur de l'objet parent.
Code:
Usage:
Production:
la source
Version modifiée de la réponse acceptée où elle prend en considération la
menu_order
propriété des éléments de menu afin de conserver l'ordre correct du réseau plat d'origine.menu_order
est défini automatiquement par WordPress donc pas besoin de vérifier quoi que ce soit:Usage:
la source
Il peut y avoir un malentendu ici à propos des éléments du menu de navigation WordPress en tant que structures arborescentes.
Les structures arborescentes dans WordPress NE SONT PAS DES RÉSEAUX MULTIDIMENSIONNELS!
Notez que bien que le tableau des éléments de menu renvoyés soit plat, il s'agit toujours d'une structure arborescente car chaque élément contient des informations sur sa filiation (la valeur parent est soit 0 si l'élément n'a pas de parent - soit l'id de l'élément parent s'il Est-ce que).
Lorsque vous passez un tel tableau à la
Walker
classe, il parcourt les résultats et crée deux tableaux - un contenant des éléments de niveau supérieur et un autre contenant des éléments enfants au format$parent_id => array()
où le tableau contient des éléments de menu qui sont des enfants directs de cet élément.Le marcheur parcourt ensuite le tableau des éléments de niveau supérieur, traite cet élément, puis vérifie le tableau des enfants pour voir s'il y a des enfants pour l'élément actuel, et traite chacun d'eux de la même manière, de manière récursive.
Si vous voulez savoir comment convertir une structure arborescente WordPress en un tableau multidimensionnel, c'est une question complètement différente (et non techniquement une question WordPress). Mais les informations renvoyées par
wp_get_nav_menu_items()
sont une structure arborescente ... et vous pouvez les utiliserWalker
telles quelles pour les gérer.Si vous voulez voir le code exact que la classe Walker de WordPress exécute pour parcourir le tableau, jetez un œil à Walker-> walk () sur WordPress Trac à partir des lignes 213-258 . Vous pouvez utiliser ce code tel quel pour créer un tableau multidimensionnel, si c'est ce que vous recherchez.
Marcheurs
WordPress est conçu pour utiliser la
Walker
classe pour traiter ses structures arborescentes. Si vous effectuez simplement le rendu d'un menu, ou si vous avez vraiment besoin de la sortie ultime, vous pouvez envisager d'utiliser lawp_nav_menu()
sortie de votre menu…Exemple:
Vous étendre la classe Walker (par exemple
Your_Walker()
) pour obtenir la sortie dont vous avez besoin. Pour un exemple, voir cette entrée sur le Codex .la source
$sorted_menu_items
est toujours un tableau "plat" et la sortie de l'option B est une chaîne.wp_get_nav_menu_items()
renvoie une structure arborescente, c'est-à-dire un tableau dans lequel chaque élément contient des données de parenté. Ces structures sont destinées à être rendues avec uneWalker
classe. Si le cas d'utilisation ici implique simplement la conversion d'un tableau "plat" en un tableau multidimensionnel basé sur des données de parenté (par exemple'post_parent' => 123
), cette question ne concerne pas techniquement WordPress et doit être déplacée vers Stack Overflow.