( Hinweis für Moderatoren: Wurde ursprünglich mit "wp_nav_menu Vorfahrklasse ohne untergeordnete Elemente in der Navigationsstruktur" betitelt.)
Ich habe einen wp_nav_menu
in meinem Header, der drei Seiten enthielt. Wenn ich mich auf einer dieser Seiten li
befinde, erhält die Seite, die diese Seite im Menü enthält, die Klasse .current_page_item
. Diese drei Seiten haben Vorlagen, und diese Vorlagen enthalten benutzerdefinierte Abfragen, um alle Beiträge eines bestimmten Inhaltstyps abzurufen. Tatsächlich sind die wahrgenommenen "Kinder" dieser Top-Level-Seite keine Kinder, sondern nur ein Inhaltstyp, den ich mithilfe einer Vorlage mit dieser Top-Level-Seite verknüpft habe.
Ich möchte, dass die Menüelemente der obersten Ebene eine 'current-ancestor'
Klasse erhalten, wenn der Benutzer eine einzelne Seite eines bestimmten Beitragstyps durchsucht, der wiederum dieser Seite nur in einer benutzerdefinierten Abfrage in der Vorlagendatei zugeordnet ist.
Hoffe das macht Sinn - wenn nicht, lass es mich wissen, wo ich dich verloren habe! Sehr dankbar für jede Hilfe.
- Auf Besonderheiten hin bearbeitet: Ich habe zum Beispiel eine statische Seite namens Workshops , die eine Vorlage verwendet. Seine Schnecke sind Werkstätten . Die Vorlage enthält eine benutzerdefinierte Funktion get_posts und eine Schleife, in der alle Posts eines benutzerdefinierten Inhaltstyps namens workshops abgerufen und angezeigt werden . Wenn ich auf einen der Titel dieser Workshops klicke, werde ich zum vollständigen Inhalt dieses Inhaltsstücks weitergeleitet. Die Permalink-Struktur des benutzerdefinierten Beitragstyps ist auf workshops / postname festgelegtWie der Benutzer sieht, sind diese Inhalte untergeordnete Elemente der Seite "Workshops". In Wirklichkeit handelt es sich jedoch nur um einen Inhaltstyp, der nichts mit der Seite zu tun hat. Es ist diese Lücke, die ich effektiv im Menü schließen muss, um den Menüpunkt "Workshops" hervorzuheben, wenn ich Inhalte vom Typ "Workshop" durchsuche.
Ich hoffe wieder, das macht Sinn, ich glaube, ich habe in einem Absatz über 20 Mal 'Workshop' gesagt!
quelle
/workshops/
und wenn sich ein Benutzer auf einer Workshop-Seite befindet (dh/workshops/example-workshop/
) möchten Sie, dass dem Menüpunkt "Workshops" die Klassecurrent_page_item
zugewiesen wird, richtig?Antworten:
Es gibt eine einfachere Lösung. Vergessen Sie, Seiten für jeden Beitragstyp zu erstellen, damit Sie über Navigationselemente verfügen können, da WP, wie Sie gelernt haben, nicht erkennen kann, dass die benutzerdefinierten Typen, die Sie durchsuchen, mit dieser Seite zusammenhängen.
Erstellen Sie stattdessen einen benutzerdefinierten Link unter Darstellung-> Menüs. Geben Sie einfach die URL ein, die Ihren benutzerdefinierten Typ zurückgibt, und geben Sie ihr eine Bezeichnung. Drücken Sie dann auf "Zum Menü hinzufügen".
oder non-pretty-permalinks:
Dies allein erstellt einfach eine Navigationsschaltfläche, die alle Beiträge mit diesem benutzerdefinierten Beitragstyp anzeigt und die aktuelle Menüelementklasse hinzufügt, wenn Sie auf dieses Navigationselement geklickt haben. Die Navigationsklasse wird jedoch noch nicht hinzugefügt Andere URL als diese
Sobald es erstellt ist, gehen Sie in die Konfiguration für dieses neue Element und geben Sie den Slug des benutzerdefinierten Beitragstyps in das Feld "Titelattribut" ein (Sie können auch das Beschreibungsfeld verwenden, das jedoch in den Optionen des Administratorbildschirms ausgeblendet ist standardmäßig).
Jetzt müssen Sie den
nav_menu_css_class
Filter einbinden (der für jedes Navigationselement ausgelöst wird) und prüfen, ob der angezeigte Inhalt dem in Ihrem benutzerdefinierten Navigationselement angegebenen Beitragstyp entspricht:In diesem Fall überprüfen wir, ob der Inhalt des Felds Titelattribut nicht leer ist und mit dem aktuell abgefragten post_type übereinstimmt. In diesem Fall fügen wir die aktuelle Menüelementklasse zu ihrem Klassenarray hinzu und geben das geänderte Array zurück.
Sie können dies so ändern, dass es einfach mit dem Titel des Navigationselements übereinstimmt. Wenn Sie das Navigationselement jedoch aus irgendeinem Grund anders als die einfache Überschrift des Beitragstyps benennen möchten, erhalten Sie diese Flexibilität, wenn Sie das Feld Titelattribut oder Beschreibung verwenden.
Jedes Mal, wenn Sie ein einzelnes Element (oder möglicherweise sogar Archivlisten) eines Beitragstyps anzeigen, der mit einem Navigationsmenüelement übereinstimmt, wird diesem Element die CSS-Klasse current-menu-item zugewiesen, damit Ihre Hervorhebung funktioniert.
Keine Seiten oder Seitenvorlagen erforderlich ;-) Die URL-Abfrage sorgt dafür, dass die richtigen Beiträge abgerufen werden. Ihre Schleifenvorlage kümmert sich um die Anzeige der Abfrageausgabe. Diese Funktion erkennt, was angezeigt wird, und fügt die CSS-Klasse hinzu.
BONUS
Sie können den Prozess mithilfe
wp_update_nav_menu_item
von sogar automatisieren , indem Sie Menüelemente für alle Ihre Beitragstypen automatisch generieren lassen. In diesem Beispiel müssen Sie zuerst$menu_id
das Navigationsmenü abrufen, zu dem diese Elemente hinzugefügt werden sollen.quelle
current_page_parent
aus dem Navigationselement entfernen, das mein Blog war - aber ansonsten funktionierte es. thx$item->attr_title
der titel rausgezogen wurde und ich den titel in großbuchstaben geschrieben habe. Also habe ich das Attribut auf geändert$item->post_name
und jetzt funktioniert es gut für mich.portfolio
. Ich habe den obigen Code verwendet. Woran kann das liegen?anstatt zu verwenden
Vielleicht möchten Sie versuchen:
Da manchmal der Beitragstyp nicht in der Abfragevariable festgelegt ist. Dies ist der Fall für den Standard-Beitragstyp "Beitrag". Wenn Sie also einen Beitrag markieren möchten, der auf einer Auflistungsseite aufgelistet wurde, müssen Sie diesen verwenden. get_very_var () gibt nur eine leere Zeichenfolge für nicht benutzerdefinierte Beitragstypen zurück.
quelle
@Somatic - das ist fantastisch! Ich habe Ihren Code ein wenig geändert, damit er auch für eine bestimmte Taxonomie funktioniert (die ich nur für den zugehörigen post_type verwende). Die Idee ist, das Title-Attribut des Menüelements zu verwenden, um sowohl den Namen des post_type als auch den Namen der Taxonomie zu speichern, die durch ein Semikolon getrennt und dann von der Funktion aufgelöst werden.
quelle
Hier meine Lösung, wenn Sie mit wp_list_pages arbeiten möchten.
füge dies in deine functions.php ein
Nun fügen Sie einfach in wp_options Tabelle eine neue Zeile mit einem option_name von page_for_custom_post_type-xxxx und einem option_value mit der Seite-ID u verbinden möchten.
Vielleicht haben Sie erkannt, dass es bereits eine Option namens page_for_posts gibt . Wenn Sie nur einen benutzerdefinierten Beitragstyp haben, können Sie Ihre Seite in der Dropdown-Liste auf /wp-admin/options-reading.php einstellen, und die Navigation stellt die aktuelle Seite korrekt ein.
Ich denke, WordPress Core sollte diesen Abschnitt mit einem Dropdown für jeden registrierten Beitragstyp erweitern.
quelle
Ich beschloss, bei den Seiten zu bleiben und den Namen der Seitenvorlage als Klasse für das Navigationselement zu verwenden. Auf diese Weise kann ich vermeiden, dass das title-Attribut unübersichtlich wird, was mir bei einigen anderen Lösungen nicht gefallen hat.
Ich habe auch Body-Klassen zu header.php hinzugefügt
Schließlich erfordert diese Lösung einige zusätzliche CSS, um den ausgewählten / aktiven Status auf Ihre Navigationsmenüelemente anzuwenden. Ich verwende es, um Taxonomiearchive und benutzerdefinierte Beitragstypen, die mit der Seite zusammenhängen, als untergeordnete Elemente dieser Seite anzuzeigen:
quelle
Warning: join() [function.join]: Invalid arguments passed in /home/path/to/wp-includes/nav-menu-template.php on line 76
Irgendeine Idee, was hier passiert ist?return $classes
draußen gehen und danachif
scheint der obige Fehler behoben zu sein.@Somatic - Großartiger Code! Ich habe selbst eine Änderung vorgenommen. Ich wollte das Title-Attribut für den beabsichtigten Zweck beibehalten, also platzierte ich stattdessen den Slug "Benutzerdefinierter Beitragstyp" in den erweiterten Menüeigenschaften "Link Relationship" (XFN), die Sie in den Bildschirmoptionen aktivieren können. ich veränderte
und änderte es zu
quelle
Gute Arbeit, Somatic.
Leider verstehe ich nicht, wie Sie Ihre benutzerdefinierten Beitragstypen auf einer Seite so auflisten können, wie Sie es erklären. Wenn ich eine page-portfolio.php nicht verwende und sie einer Seite hinzufüge, erhalte ich nur eine 404-Seite.
Wenn ich es wie Gavin tue, habe ich deine Funktion ein wenig verändert, um auch "current_page_parent" von der Blog-Seite wie dieser zu entfernen.
}
quelle