( Uwaga moderatorów: pierwotnie zatytułowano „wp_nav_menu Klasa przodka bez dzieci w strukturze nawigacji”)
Mam wp_nav_menu
w nagłówku, który miał trzy strony. Kiedy jestem na jednej z tych stron, li
zawieranie tej strony w menu otrzymuje klasę .current_page_item
. Te trzy strony mają szablony, a szablony te zawierają niestandardowe zapytania, aby uzyskać wszystkie posty określonego typu treści. W efekcie postrzegane „dzieci” tej strony najwyższego poziomu nie są w rzeczywistości dziećmi, są tylko typem treści, który skojarzyłem z tą stroną najwyższego poziomu za pomocą szablonu.
Chciałbym, aby elementy menu najwyższego poziomu uzyskały 'current-ancestor'
klasę, gdy użytkownik przegląda pojedynczą stronę określonego typu postu, ponownie powiązaną z tą stroną tylko w niestandardowym zapytaniu w pliku szablonu.
Mam nadzieję, że to ma sens - jeśli nie, daj mi znać, gdzie cię straciłem! Bardzo doceniam każdą pomoc.
- Zredagowane dla szczegółów: Na przykład mam statyczną stronę o nazwie Warsztaty, która używa szablonu. Jego ślimakiem są warsztaty . Szablon ma niestandardową funkcję get_posts i pętlę, która ściąga i wyświetla wszystkie posty o niestandardowym typie treści zwane warsztatami . Jeśli kliknę tytuł jednego z tych warsztatów, przejdę do pełnej treści tego fragmentu. Struktura bezpośredniego linku niestandardowego typu posta jest ustawiona na workshop / postname, tak jak użytkownik to widzi, te fragmenty treści są potomkami strony Warsztatów, podczas gdy w rzeczywistości wszystkie mają jeden typ treści, ale nie są powiązane ze stroną. Jest to luka, którą muszę skutecznie zamknąć w menu, podkreślając pozycję menu „Warsztaty” podczas przeglądania treści typu „warsztat”.
Ponownie, mam nadzieję, że to ma sens, myślę, że powiedziałem „warsztat” w górę o 20 razy w jednym akapicie!
źródło
/workshops/
i kiedy użytkownik jest na stronie warsztatów (tj./workshops/example-workshop/
) Chcesz, aby element menu „Warsztaty” miałcurrent_page_item
przypisaną klasę , prawda?Odpowiedzi:
Istnieje prostsze rozwiązanie. Zapomnij o tworzeniu stron dla każdego typu posta, abyś mógł mieć elementy nawigacyjne, ponieważ, jak się dowiedziałeś, WP nie może rozpoznać, że przeglądane typy niestandardowe są powiązane z tą stroną.
Zamiast tego utwórz niestandardowy link w Wygląd-> Menu. Wystarczy wpisać adres URL, który zwróci niestandardowy typ i nadać mu etykietę, a następnie nacisnąć „Dodaj do menu”.
lub non-pretty-permalink:
samo to po prostu utworzy przycisk nawigacyjny, który wyświetla wszystkie posty z tym niestandardowym typem postu, a także doda klasę bieżącego menu po kliknięciu tego elementu nawigacyjnego - ale nie doda jeszcze klasy nawigacyjnej do żadnego URL inny niż ten
Następnie, po utworzeniu, przejdź do konfiguracji dla tego nowego elementu i wprowadź informację o typie niestandardowego postu w polu „Atrybut tytułu” (możesz również użyć pola opisu, ale ten jest ukryty w opcjach ekranu administratora domyślnie).
Teraz musisz zaczepić
nav_menu_css_class
filtr (który jest uruchamiany dla każdego elementu nawigacji) i sprawdzić, czy przeglądana zawartość jest typu posta wskazanego w niestandardowym elemencie nawigacji:W takim przypadku sprawdzimy, czy zawartość pola Tytuł atrybutu nie jest pusta i czy odpowiada bieżącemu typowi post_, którego dotyczy zapytanie. Jeśli tak, dodajemy klasę bieżącego menu do tablicy klas, a następnie zwracamy zmodyfikowaną tablicę.
Możesz to zmodyfikować tak, aby pasowało do tytułu elementu nawigacyjnego, ale jeśli z jakiegoś powodu chcesz tytułować element nawigacyjny inaczej niż zwykły ślimak typu postu, użycie pola Atrybut tytułu lub Opis daje tę elastyczność.
Teraz za każdym razem, gdy przeglądasz pojedynczy element (lub prawdopodobnie nawet zarchiwizujesz listę) typu postu pasującego do elementu menu nawigacyjnego, element ten otrzyma element bieżącej pozycji menu CSS, dzięki czemu podświetlenie będzie działać.
Żadne strony ani szablony stron nie są potrzebne ;-) Zapytanie URL zajmuje się pobieraniem właściwych postów. Szablon pętli zajmuje się wyświetlaniem wyników zapytania. Ta funkcja zajmuje się rozpoznawaniem tego, co jest wyświetlane, i dodawaniem klasy CSS.
PREMIA
Możesz nawet zautomatyzować ten proces
wp_update_nav_menu_item
, automatycznie generując pozycje menu dla wszystkich typów postów. W tym przykładzie musisz najpierw pobrać$menu_id
menu nawigacyjne, do którego chcesz dodać te elementy.źródło
current_page_parent
element nawigacyjny, który był moim blogiem - ale w przeciwnym razie działał. thx$item->attr_title
wyciągnąłem TYTUŁ, a tytuł napisałem dużymi literami. więc zmieniłem atrybut na$item->post_name
i teraz działa dla mnie dobrze.portfolio
. Użyłem powyższego kodu. Co może być problemem?zamiast używać
Możesz spróbować:
Czasami typ wpisu nie jest ustawiony w zapytaniu var. Dzieje się tak w przypadku domyślnego typu post_typ „post”, więc jeśli chcesz podświetlić post wymieniony na stronie z listą, musisz go użyć. get_very_var () zwraca tylko pusty ciąg znaków dla typów postów, które nie są niestandardowe.
źródło
@Somatic - to fantastyczne! Zmodyfikowałem nieco twój kod, aby działał również dla określonej taksonomii (której używam tylko dla pokrewnego typu post_). Chodzi o to, aby użyć atrybutu Tytuł elementu menu do przechowywania zarówno nazwy typu post_ ORAZ nazwy taksonomii, oddzielonych średnikiem, a następnie rozerwanej przez funkcję.
źródło
Oto moje rozwiązanie, jeśli chcesz pracować z wp_list_pages.
dodaj to do swojego functions.php
Teraz wystarczy dodać w wp_options tabeli nowy wiersz z OPTION_NAME z page_for_custom_post_type-xxxx i wartość_opcji z widoku-ID u chce się połączyć.
Być może wiesz, że istnieje już opcja o nazwie page_for_posts . Jeśli masz tylko 1 niestandardowy typ postu, możesz ustawić swoją stronę na /wp-admin/options-reading.php w menu rozwijanym, a nawigacja prawidłowo ustawi stronę bieżącą.
Myślę, że rdzeń wordpress powinien rozszerzyć tę sekcję o listę rozwijaną dla każdego zarejestrowanego typu posta.
źródło
Postanowiłem trzymać się stron i używać nazwy szablonu strony jako klasy w elemencie nawigacyjnym. Pozwala mi to uniknąć zaśmiecania atrybutu tytułu, co nie podobało mi się w niektórych innych rozwiązaniach.
Mam także klasy treści dodane do header.php
Wreszcie to rozwiązanie wymaga dodatkowego css, aby zastosować stan wybrany / aktywny do elementów menu nawigacyjnego. Używam go do wyświetlania archiwów taksonomii i niestandardowych typów postów związanych ze stroną jako dzieci tej strony:
źródło
Warning: join() [function.join]: Invalid arguments passed in /home/path/to/wp-includes/nav-menu-template.php on line 76
Masz pojęcie, co się tutaj stało?return $classes
zewnątrz, a potemif
wydaje się , że rozwiązuje powyższy błąd.@Somatic - Świetny kod! Sam dokonałem jednej zmiany. Chciałem zachować atrybut tytułu zgodnie z jego przeznaczeniem, dlatego zamiast tego umieściłem informację o niestandardowym typie postu we właściwościach menu zaawansowanego powiązania z linkiem (XFN), które można włączyć w opcjach ekranu. zmodyfikowałem
i zmieniłem na
źródło
Dobra robota Somatic.
Niestety nie rozumiem, w jaki sposób można wyświetlić niestandardowe typy postów na stronie w sposób wyjaśniony. Jeśli nie użyję page-portfolio.php i nie dodam go do strony, otrzymam tylko 404 strony.
Jeśli robię to, co robi Gavin, zmodyfikowałem trochę twoją funkcję, aby usunąć również „current_page_parent” ze strony bloga w ten sposób.
}
źródło