Ich habe ein Menü in WP Admin definiert, das so aussieht:
Ich möchte alle untergeordneten Links in der Seitenleiste anzeigen können, wenn ich mich auf einer übergeordneten Seite befinde. Wenn sich der Benutzer beispielsweise auf meiner Seite "Über uns" befindet, soll eine Liste der 4 grün hervorgehobenen Links in der Seitenleiste angezeigt werden.
Ich habe mir die Dokumentation zu wp_nav_menu () angesehen und es scheint keine eingebaute Möglichkeit zu geben, einen bestimmten Knoten eines bestimmten Menüs anzugeben, der als Ausgangspunkt beim Generieren der Links verwendet werden soll.
Ich habe eine Lösung für eine ähnliche Situation erstellt, die sich auf die Beziehungen stützte, die von den übergeordneten Seiten erstellt wurden, aber ich suche eine, die das Menüsystem speziell verwendet. Jede Hilfe wäre dankbar.
Antworten:
Das war noch in meinen Gedanken, also habe ich es noch einmal überarbeitet und diese Lösung zusammengestellt, die nicht so sehr vom Kontext abhängt:
Verwendungszweck
quelle
Walker_Nav_Menu
Klasse Unterklassen oder Filter verwenden . Wie alle Menü-Sachen zu viel für einen Kommentar - neue Frage dazu stellen?wp_filter_object_list
Zeile zuwp_filter_object_list( $items, array( 'object_id' => $args->submenu ), 'and', 'ID' );
@goldenapples: Deine Walker-Klasse funktioniert nicht. Aber die Idee ist wirklich gut. Ich habe einen Walker basierend auf Ihrer Idee erstellt:
Jetzt können Sie verwenden:
Die Ausgabe ist eine Liste mit dem aktuellen Stammelement und seinen untergeordneten Elementen (nicht ihren untergeordneten Elementen). Def: Root element: = Das oberste Menüelement, das der aktuellen Seite entspricht oder übergeordnet zu einer aktuellen Seite oder übergeordnet zu einer übergeordneten Seite ist ...
Dies beantwortet die ursprüngliche Frage aber fast nicht genau, da es sich immer noch um das Element der obersten Ebene handelt. Dies ist in Ordnung für mich, da ich das Element der obersten Ebene als Überschrift der Seitenleiste verwenden möchte. Wenn Sie dies beseitigen möchten, müssen Sie möglicherweise display_element überschreiben oder einen HTML-Parser verwenden.
quelle
Hi @jessegavin :
Navigationsmenüs werden in einer Kombination aus benutzerdefinierten Beitragstypen und benutzerdefinierten Taxonomien gespeichert. Jedes Menü wird als ein Begriff (dh "About Menu" , gefunden in
wp_terms
) einer benutzerdefinierten Taxonomie (dhnav_menu
gefunden inwp_term_taxonomy
.) Gespeichert .Jeder Nav-Menüpunkt wird als Beitrag von
post_type=='nav_menu_item'
(dh "Über die Firma" , gefunden inwp_posts
) mit seinen Attributen als Beitrags-Meta (inwp_postmeta
) gespeichert, wobei dasmeta_key
Präfix verwendet wird,_menu_item_*
wo_menu_item_menu_item_parent
die ID des übergeordneten Nav-Menüpunkt-Beitrags Ihres Menüpunkts ist.Die Beziehung zwischen Menüs und Menüelementen ist in gespeichert,
wp_term_relationships
wobei sieobject_id
sich auf das$post->ID
für das Navigationsmenüelement und$term_relationships->term_taxonomy_id
auf das inwp_term_taxonomy
und gemeinsam definierte Menü beziehtwp_terms
.Ich bin mir ziemlich sicher , dass es möglich wäre , haken beide
'wp_update_nav_menu'
und'wp_update_nav_menu_item'
aktuelle Menüs in erstellenwp_terms
und einen parallelen Satz von Beziehungen inwp_term_taxonomy
undwp_term_relationships
wo jeden Nav Menüpunkt, der auch Unter Nav Menüpunkte hat wird es eigenes Nav - Menü.Sie sollten auch einen Hook
'wp_get_nav_menus'
(den ich aufgrund einer ähnlichen Arbeit, die ich vor einigen Monaten durchgeführt habe, zu WP 3.0 hinzugefügt habe) verwenden, um sicherzustellen, dass Ihre generierten Navigationsmenüs nicht für den Benutzer im Administrator zur Manipulation angezeigt werden, andernfalls würde sehr schnell aus der Synchronisation geraten und du hättest einen Daten-Albtraum auf der Hand.Klingt nach einem unterhaltsamen und nützlichen Projekt, aber es ist ein bisschen mehr Code und Testen, als ich es mir leisten kann, zum gegenwärtigen Zeitpunkt in Angriff zu nehmen, da alles, was Daten synchronisiert, zum PITA wird, wenn es darum geht, alle Fehler auszubügeln (und weil Zahlende Kunden fordern mich auf, die Dinge zu erledigen. :) Aber mit den obigen Informationen bewaffnet, bin ich ein ziemlich motivierter WordPress-Plug-in-Entwickler, der sie codieren könnte, wenn er wollte.
Natürlich stellen Sie jetzt fest, dass Sie, wenn Sie es codieren, verpflichtet sind, es hierher zurückzusenden, damit wir alle von Ihrer Größe profitieren können! :-)
quelle
wp_nav_menu()
Sie die Menüs klonen, da siewp_nav_menu()
eng mit der Menüstruktur verbunden sind . Die andere Möglichkeit besteht darin, denwp_nav_menu()
Code zu kopieren und die Änderungen vorzunehmen, die für die Anzeige als Untermenü erforderlich sind.Dies ist eine Walker-Erweiterung, die das tun sollte, wonach Sie suchen:
Basierend auf dem Code von mfields, auf den ich bereits in meinem Kommentar verwiesen habe. Es wird lediglich beim Durchlaufen des Menüs überprüft, ob das aktuelle Element (1) das aktuelle Menüelement oder (2) ein Vorgänger des aktuellen Menüelements ist, und der untergeordnete Baum wird nur dann erweitert, wenn eine dieser Bedingungen erfüllt ist . Ich hoffe, das funktioniert für Sie.
Um es zu benutzen, fügen Sie einfach ein "walker" Argument hinzu, wenn Sie das Menü aufrufen, dh:
quelle
$top_level_elements
und fügen Sie Ihren eigenen Test hinzu, bevor Sie anrufen$this->display_element
.depth
Parameter an den Aufruf übergebenwp_nav_menu
, falls Ihr Thema die Standardeinstellung 0 überschreitet (alle Ebenen anzeigen)?Update: Ich habe daraus ein Plugin gemacht. Hier herunterladen .
Ich musste das selbst lösen und schließlich einen Filter für die Ergebnisse der Menüsuche schreiben. Sie können es
wp_nav_menu
wie gewohnt verwenden, aber basierend auf dem Titel des übergeordneten Elements einen Unterabschnitt des Menüs auswählen. Fügen Siesubmenu
dem Menü einen Parameter wie folgt hinzu:Sie können sogar mehrere Ebenen tief gehen, indem Sie Schrägstriche einfügen:
Oder wenn Sie mit einem Array bevorzugen:
Es wird eine Slug-Version des Titels verwendet, mit der Groß- und Kleinschreibung und Zeichensetzung vermieden werden können.
quelle
$loc = split( "/", $loc );
im Plugin ersetzen durch$loc = preg_split( "~/~", $loc );
Ich habe die folgende Klasse für mich zusammengestellt. Es wird das übergeordnete Navigationselement der aktuellen Seite gefunden, oder Sie können ihm eine Ziel-ID für das oberste Navigationselement im Walker-Konstruktor zuweisen.
Navigationsanruf:
quelle
@davidn @hakre Hi, ich habe eine hässliche Lösung ohne HTML-Parser oder übergeordnetes display_element.
quelle
Die Ausgabe des Navigationsmenüs enthält viele Klassen für das aktuelle Element, den aktuellen Element-Vorfahren usw. In einigen Situationen konnte ich das tun, was Sie wollen, indem ich die gesamte Ausgabe des Navigationsbaums zuließ und sie dann mit CSS reduzierte nur untergeordnete Elemente der aktuellen Seite usw.
quelle
Ich habe einen modifizierten Walker gemacht, der helfen soll! Nicht perfekt - es bleiben ein paar leere Elemente übrig, aber es macht den Trick. Die Modifikation sind im Grunde diese $ current_branch Bits. Hoffe es hilft jemandem!
}
quelle
Schau dir den Code in meinem Plugin an oder benutze ihn für deinen Zweck;)
Dieses Plugin fügt ein erweitertes Widget "Navigationsmenü" hinzu. Es bietet viele Optionen, mit denen die Ausgabe des benutzerdefinierten Menüs über das Widget angepasst werden kann.
Features sind:
ausgewählten Elements anzeigen (Option zum Einbeziehen des übergeordneten Elements).
http://wordpress.org/extend/plugins/advanced-menu-widget/
quelle