Ich versuche, ein Menü zu erstellen, das maximal 5 Elemente enthält. Wenn weitere Elemente vorhanden sind, sollten diese in ein anderes <ul>
Element eingeschlossen werden, um ein Dropdown-Menü zu erstellen.
5 Artikel oder weniger:
6 Artikel oder mehr
Ich weiß, dass diese Art von Funktionalität leicht mit einem Walker erstellt werden kann, der die Menüelemente zählt und sie umschließt, wenn mehr als 5 in einem separaten Bereich verbleiben <ul>
. Aber ich weiß nicht, wie ich diesen Walker erschaffen soll.
Der Code, der mein Menü im Moment anzeigt, ist der folgende:
<?php wp_nav_menu( array( 'theme_location' => 'navigation', 'fallback_cb' => 'custom_menu', 'walker' =>new Custom_Walker_Nav_Menu ) ); ?>
Mir ist aufgefallen, dass der Benutzer keine Auswirkung hat, wenn das Menü nicht vom Benutzer definiert wurde und stattdessen die Fallback-Funktion verwendet wird. Ich brauche es in beiden Fällen zu arbeiten.
quelle
Walker_Nav_Menu
und es gibt ein Beispiel im Codex . Was meinst du mit "Ich weiß nicht, wie man den Walker erstellt"?Antworten:
Mit einem benutzerdefinierten Walker kann der
start_el()
Methode Zugriff auf$depth
param: Wenn es sich um ein0
Element handelt, das zu den Top-Werten gehört, können wir diese Informationen verwenden, um einen internen Zähler zu verwalten.Wenn der Zähler ein Limit erreicht, können wir verwenden
DOMDocument
aus der vollständigen HTML-Ausgabe nur das zuletzt hinzugefügte Element abrufen, es in ein Untermenü einschließen und es erneut zu HTML hinzufügen.Bearbeiten
Wenn die Anzahl der Elemente genau der Anzahl entspricht, die wir + 1 benötigen, z. B., dass 5 Elemente sichtbar sind und das Menü 6 enthält, ist es nicht sinnvoll, das Menü zu teilen, da die Elemente in beide Richtungen 6 sind. Der Code wurde bearbeitet, um dies zu beheben.
Hier ist der Code:
Die Verwendung ist ziemlich einfach:
quelle
$split_at = 5
aber der$count
Index beginnt bei 0.$split_at
Argument übergeben wurde (standardmäßig 5).Es gibt sogar eine Möglichkeit, dies nur mit CSS zu ermöglichen. Dies hat einige Einschränkungen, aber ich dachte immer noch, dass es ein interessanter Ansatz sein könnte:
Einschränkungen
Ansatz
Obwohl ich nicht wirklich "Mengenabfragen" verwende, ist die kreative Verwendung von
:nth-child
und~
ich habe in letzter Zeit gelesen Mengenabfragen für CSS zu dieser Lösung geführt.Der Ansatz ist im Grunde:
...
mit a Punkte hinzubefore
Pseudoelement.Hier ist der CSS-Code für ein Standard-WordPress-Menü-Markup. Ich habe inline kommentiert.
Ich habe auch eine jsfiddle erstellt, um sie in Aktion zu zeigen: http://jsfiddle.net/jg6pLfd1/
Wenn Sie weitere Fragen haben, hinterlassen Sie bitte einen Kommentar, ich würde mich freuen, den Code weiter zu klären.
quelle
Sie können
wp_nav_menu_items
Filter verwenden. Es akzeptiert Menüausgaben und Argumente, die Menüattribute enthalten, wie Menü-Slug, Container usw.quelle
DOMDocument
kann verwendet werden. In dieser Frage gibt es jedoch keine Untermenüs, daher ist die Antwort für diesen speziellen Fall richtig. DOMDocument wäre eine "universelle" Lösung, aber ich habe momentan keine Zeit. Sie können untersuchen;) die LI-Elemente durchlaufen, wenn ein UL-Kind es überspringen hat, wäre das eine Lösung, aber eine schriftliche Versionul
. WordPress schleift bereits Menüelemente in der Menüführung. Es ist bereits ein langsamer Vorgang per se , das Hinzufügen und zusätzliche Schleife denke ich , ist nicht die richtige Lösung, auf der countrary, eine benutzerdefinierte walker viel sauberer und effiziente Lösung wäre.Ich habe eine funktionierende Funktion, bin mir aber nicht sicher, ob es die beste Lösung ist.
Ich habe einen Custom Walker benutzt:
Die Funktion, die das aktuelle Menü anzeigt, ist die folgende:
Ich habe die globale Variable $ menu_items deklariert und damit das Closing
<li>
und -tags angezeigt<ul>
. Möglicherweise ist dies auch im Custom-Walker möglich, aber ich habe nicht herausgefunden, wo und wie.Zwei Probleme: 1. Wenn das Menü nur 5 Elemente enthält, wird auch das letzte Element in einen Gedanken eingeschlossen, der nicht erforderlich ist.
quelle
substr_count($output,'<li')
Wird== 4
am falschen Ort sein ...