WordPress - wie kann ich wissen, ob ein Menü-Element Kinder hat?
Entwickle ich ein wordpress-theme mit verschachtelten Untermenüs. Ich brauche, um die Elemente, die keine Kinder optisch unterscheiden sich von denen, die Kinder haben. Jetzt habe ich dieses Menü, aber das könnte sich ändern:
A
a1
a2
B
b1
b2
C
Wie Sie sehen können, A-und B-Kinder haben. C nicht - ich muss es anders sein in der CSS-Ebene.
Im Idealfall würde ich gerne eine has-children
Klasse in A und B, aber nicht in C.
Bisher habe ich es geschafft, erstellen Sie eine "Menü-Walker" PHP-Klasse, kann ich instanzieren und übergeben wp_nav_menu . Der Konstruktor sieht wie folgt aus:
class My_Walker_Nav_Menu extends Walker_Nav_Menu {
function start_el(&$output, $item, $depth, $args) {
...
if(??? $item has children???) {
//I know what to do here
}
}
}
So, wie erkenne ich ob $item
Kinder hat oder ein Blatt ist?
EDIT: diese Frage wurde beantwortet von jemanden namens "keesiemeijer" in den WordPress-Foren. Ich verlasse dieses Kopfgeld abgelaufen ist, nur für den Fall will er es zurückfordern. Ansonsten werde ich mir die Kennzeichnung meiner eigenen Antwort als gültig.
InformationsquelleAutor der Frage kikito | 2011-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen
functions.php
wird es fügen Sie die "dropdown" class ElternNeuen Weg beter für die Leistung
Alt: intensiv-auf die DB
InformationsquelleAutor der Antwort janw
Einfach Sie auf diesem Weg:
Erklären:
Ich erstelle Menü mit "walker":
Klasse Walker:
Wir haben das Objekt 'walker', können Sie var_dump($args) zu sehen, mehr Dinge.
Ich verwende für mein Projekt !
InformationsquelleAutor der Antwort starrynight.1406
Es scheint, dass das problem endlich angesprochen wurde. Die neueste WordPress-beta, wie der aktuelle schreiben, 4.0, aktualisiert die Walker_Nav_Menu Klasse und fügte hinzu, eine
$has_children
Eigenschaft.So, brauchen wir nicht zu hacken
function display_element(...)
mehr.InformationsquelleAutor der Antwort Jorge Bucaran
Fragte ich in die WordPress forum und keesiemeijer wies mich auf dieser andere postin der Sie Folgendes gemacht:
Statt einer änderung
start_el
veränderten Siedisplay_element
durch hinzufügen der beiden folgenden Zeilen (Zeilen 37-38 hier):Ich habe die vorherigen zwei Zeilen als räumliche Referenz und auch als Kommentar zu anderen Antworten in diesem Beitrag. Es scheint, dass wordpress "versuchen", um eine has_children Eigenschaft in
$args
aber es ist entweder etwas falsch, oder in einer Weise, die ich nicht verstehe. In jedem Fall, dasshas_children
parameter wird niemals weitergegebenstart_el
(siehe Beispiel var_dump von $args hier)Könnte dies ein Fehler in der WordPress version, die ich habe (3.2.1) und kann wurde behoben in der neuesten version.
In jedem Fall, die Antwort, die ich habe im WordPress-forum ist die eine, die hat mir geholfen, es zu beheben, so halte ich dies erledigt. Ich werde warten, für die bounty zu verfallen, nur für den Fall, keesiemeijer setzen will seine Antwort hier.
InformationsquelleAutor der Antwort kikito
InformationsquelleAutor der Antwort Eugene Manuilov
Kikito ' s Antwort oben bekommt den trick getan, aber nicht in die wiederverwendbare Art und Weise. In meiner Sicht der bessere Ansatz ist wie folgt:
Überschreiben
Walker::display_element()
ist der richtige Schritt, aber es ist besser, um tatsächlich das problem an der Wurzel des Problems, anstatt einfach den Heften eine Klasse, auf die an dieser Stelle aus zwei Gründen. Ersten, das eigentliche problem ist nicht fehlende Klasse, sondern das un-patched bug in WordPress, der Kikito angemerkt: das problem ist, dass$args[0]
ist nicht immer ein array. Das scheint die Regel zu erwarten-Typ fürWalker::display_element()
aber eigentlich sind wir es hier mitWalker_Nav_Menu::display_element()
- und in diesem Fallargs
endet weitergegeben werden, wie ein standard-Objekt-Typ statt einem array-Typ. Als solche müssen wir einfach fügen Sie diehas_children
element der Objekt-notation anstelle der array-notation. Problem gelöst![1]Hinzufügen, dass
elseif
Konten für die normale Nav-Menü Fall. Dies ist das gleiche Formular, hoffentlich machen Sie es in der core-Klasse in dieser patchan welcher Stelle Sie müssen nicht mehr zu verlängern. Sie sollte wohl patch es weiter zu berücksichtigen, für den Fall, dass$args[0]
ist weder ein array noch ein Objekt, aber ich nicht erwarten, zu sehen, dass passieren.Zweiten, um eine gute Trennung zwischen den verschiedenen Methoden, Klassen sollten wirklich Hinzugefügt werden, in der
start_el()
Methode oder anderswo, dadisplay_element()
ist nicht irgendeine der Klasse handling.Als Ergebnis können Sie anschließend überschreiben Sie
start_el()
jedoch, das Sie mögen: Sie können Ihre eigenen Klassen einfügen, oder ignorieren Sie Elemente ganz oder benutzerdefinierte text, oder wie immer Sie wollen. (In meinem Fall arbeite ich, um eine vorhandene Javascript-Menü-Umsetzung, die sehr spezifische und klassifizierte Anforderungen an Eltern und Kinder, ich kann also nicht einfach die gleichen Klassen, um alles, was ein Kind hat – das ist genau, warum diese Trennung der Stoffe betrifft.) In meinem code:[1] Das ist natürlich einer der möglichen Fallstricke von dynamisch typisierten Sprachen wie PHP... es ist kein problem, solange du vorsichtig bist. Die WordPress-Entwickler waren nicht vorsichtig hier.
InformationsquelleAutor der Antwort Chris Krycho
Wenn Sie nicht möchten, dass der Aufwand für eine harte Abfrage oder Funktion, die Sie tun können diese in jQuery:
InformationsquelleAutor der Antwort Zachary Schuessler
}
InformationsquelleAutor der Antwort liying
Fügen Sie diese zu Ihrem functions.php
Dann in Ihrem walker Ihr können überprüfen, ob $item->has_children ist true oder false
InformationsquelleAutor der Antwort Joakim Ling
Da diese Frage ist eines der ersten Ergebnisse bei der Google-Suche, wurde auf die in anderen Webseiten und die meisten der Antworten hier sind veraltet, ich dachte, ich würde post diese Antwort.
start_el() hat Klassen als Teil $item Objekt. So können Sie diese in start_el():
Beachten Sie, dass $Tiefe ist nicht erforderlich, die Bedingungen aber, wenn entfernt Ihre-code wird angewendet, um das erste Element (d.h. ein Element mit 0 Tiefe).
Da für die Kompatibilität, der Teil, der Klasse "menu-item-has-children' Hinzugefügt wurde WordPress 3.7 (Oktober 2013) und ich habe es getestet auf die neueste WordPress-4.4 (zum Zeitpunkt der Veröffentlichung dieser Antwort).
InformationsquelleAutor der Antwort Kalimah Apps
Danke für Start_el Funktion, meine Funktion zu Folgen, dass die Funktion zum ausführen der Abfrage.
Ich habe eine Funktion count sub-Menü des übergeordneten Menü-ID.
Laufen
In der foreach-wp_get_nav_menu_items-Funktion, wählen Sie ID der übergeordneten Menü $Artikel->menu_item_parent ==0.
Es ist für mich arbeiten und sehr einfach.
InformationsquelleAutor der Antwort D. Lân Nguyễn
verwenden Sie diese einfachen code, der in Sie walker-Klasse
InformationsquelleAutor der Antwort john
Gibt es eine einfache Lösung Quelle.
InformationsquelleAutor der Antwort hayatbiralem