Gibt es eine Möglichkeit, die Navigationsmenüelemente als mehrdimensionales Array anstelle eines flachen Arrays zu erfassen?
Mit einer baumartigen Struktur meine ich etwas, das die Beziehung zwischen untergeordneten und übergeordneten Elementen beibehalten würde (dies ist nur ein Beispiel)…
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()
)
)
)
)
Es gibt eine wp_get_nav_menu_items()
Funktion, die jedoch ein eindimensionales Array mit allen Elementen auf derselben Ebene zurückgibt, was ich nicht möchte. Enthält WordPress eine integrierte Methode, um ein mehrdimensionales Array für meine Menüelemente zu erhalten? Wenn nicht, was ist der beste Weg, um wp_get_nav_menu_items()
als baumartige Struktur in Bezug auf die Leistung in ein mehrdimensionales Array zu gelangen ?
Walker
Klasse verarbeitet die Tiefe der sortierten Navigationsmenüelemente automatisch, auch wenn das Array flach ist.Antworten:
Das Problem , einen Baum aus einem flachen Array zu erstellen, wurde hier mit dieser leicht modifizierten, rekursiven Lösung gelöst:
Hier haben wir das vorangestellte
wpse_children
Attribut hinzugefügt , um eine Namenskollision zu vermeiden.Jetzt müssen wir nur noch eine einfache Hilfsfunktion definieren:
Jetzt ist es ganz einfach, ein Navigationsmenü in seine Baumstruktur umzuwandeln:
Für JSON können wir einfach verwenden:
Für eine etwas andere Version, in der wir die Attribute handverlesen haben, lesen Sie die erste Überarbeitung dieser Antwort hier .
Update: Walker-Klasse
Hier ist eine ziemlich skizzenhafte Idee, wie wir versuchen könnten, uns in den rekursiven Teil der
display_element()
Methode der abstraktenWalker
Klasse einzuklinken .Wo
WPSE_Nav_Menu_Tree
ist eine Erweiterung derWalker_Nav_Menu
Klasse:Dies könnte uns einen alternativen Ansatz geben, wenn es funktioniert.
quelle
wp_get_nav_menu_items
rekursiv durchlaufen wird .Kurz gesagt, die folgende Funktion erstellt den Baum von Objekten, indem untergeordnete Elemente in eine neue untergeordnete Eigenschaft innerhalb des übergeordneten Objekts eingefügt werden.
Code:
Verwendungszweck:
Ausgabe:
quelle
Geänderte Version der akzeptierten Antwort, bei der die
menu_order
Eigenschaft der Menüelemente berücksichtigt wird , um die richtige Reihenfolge des ursprünglichen flachen Arrays beizubehalten.menu_order
wird automatisch von WordPress eingestellt, sodass Sie nicht nach etwas suchen müssen:Verwendungszweck:
quelle
Es kann hier ein Missverständnis über WordPress-Navigationsmenüelemente als baumartige Strukturen geben.
Baumartige Strukturen in WordPress SIND KEINE MULTIDIMENSIONALEN ARRAYS!
Beachten Sie, dass das zurückgegebene Menüelementarray zwar flach ist, aber dennoch eine baumartige Struktur aufweist, da jedes Element Informationen zu seiner Abstammung enthält (der übergeordnete Wert ist entweder 0, wenn das Element kein übergeordnetes Element hat - oder die ID des übergeordneten Elements, wenn dies der Fall ist tut).
Wenn Sie ein solches Array an die
Walker
Klasse übergeben, durchläuft es die Ergebnisse und erstellt zwei Arrays - eines mit Elementen der obersten Ebene und eines mit untergeordneten Elementen im Format,$parent_id => array()
in dem das Array Menüelemente enthält, die direkte untergeordnete Elemente dieses Elements sind.Der Walker durchläuft dann das Elementarray der obersten Ebene, verarbeitet dieses Element und überprüft dann das untergeordnete Array, um festzustellen, ob für das aktuelle Element untergeordnete Elemente vorhanden sind, und verarbeitet jedes Element auf dieselbe Weise rekursiv.
Wenn Sie wissen möchten, wie eine baumartige WordPress-Struktur in ein mehrdimensionales Array konvertiert wird, ist dies eine völlig andere Frage (und technisch gesehen keine WordPress-Frage). Die von zurückgegebenen Informationen
wp_get_nav_menu_items()
sind jedoch baumartig ... und Sie können sie unverändert verwendenWalker
, um damit umzugehen.Wenn Sie den genauen Code sehen möchten, den die Walker-Klasse von WordPress ausführt , um das Array zu durchlaufen , sehen Sie sich Walker-> walk () in WordPress Trac in den Zeilen 213-258 an . Sie können diesen Code unverändert verwenden, um ein mehrdimensionales Array zu erstellen, wenn Sie danach suchen.
Wanderer
WordPress wurde entwickelt, um die
Walker
Klasse zum Verarbeiten ihrer baumartigen Strukturen zu verwenden. Wenn Sie einfach ein Menü rendern oder wirklich nur die endgültige Ausgabe benötigen, sollten Sie die Verwendungwp_nav_menu()
Ihres Menüs in Betracht ziehen.Beispiel:
Sie würden die Walker-Klasse (z. B.
Your_Walker()
) erweitern, um die gewünschte Ausgabe zu erhalten. Ein Beispiel finden Sie in diesem Eintrag im Codex .quelle
$sorted_menu_items
ist es immer noch ein "flaches" Array und die Ausgabe von Option B ist eine Zeichenfolge.wp_get_nav_menu_items()
Gibt eine baumartige Struktur zurück, dh ein Array, in dem jedes Element Elterndaten enthält. Diese Strukturen sollen mit einerWalker
Klasse gerendert werden . Wenn der Anwendungsfall hier lediglich das Konvertieren eines "flachen" Arrays in ein mehrdimensionales Array basierend auf Abstammungsdaten (z. B.'post_parent' => 123
) umfasst, bezieht sich diese Frage technisch nicht auf WordPress und sollte in den Stapelüberlauf verschoben werden.