Dodawanie niestandardowych archiwów typów postów do menu WordPress
10
Czy istnieje sposób (oprócz dodania niestandardowego łącza), aby dodać niestandardowe archiwum typów postów do menu w WordPress? Jeśli zostanie dodany za pomocą niestandardowego linku (np. / Cpt-archive-slug /), WordPress nie stosuje klas takich jak current-menu-itemelement listy, co stanowi wyzwanie podczas stylizacji menu.
Jeśli niestandardowy link zawiera cały adres URL (np. Http://site.com/cpt-archive-slug/ ), klasy te zostaną dodane. Jednak prawdopodobnie nie jest to „najlepsza praktyka”.
najlepszym rozwiązaniem jest niestandardowy link z pełnym adresem URL, ponieważ archiwa niestandardowych typów postów mają różne archiwa oparte na taksonomii (kategorie, tagi, dowolna taksonomia) i archiwa oparte na dacie, które mają własne archiwum.
Mając niestandardowy element menu linku z adresem URL #post_type_album, możesz go użyć w następujący sposób:
# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types('album');# And display the menu
wp_nav_menu(array('theme_location'=>'primary-nav','walker'=>new KB_Custom_Menu_Walker(),));
Uwaga: Zakładamy, że ślimak i nazwa twojego postu są takie same.
+1 za odpowiedź o późnej jakości. To jest dobre dla społeczności!
Brian Fegter,
2
Rozszerzyłem nieco odpowiedź Tungda, aby zapewnić większą ogólność dzięki takiemu podejściu. Ta implementacja umożliwia dodawanie dowolnych mapowań między „makrami” menu a wewnętrznymi adresami URL Wordpress, o których wie tylko backend.
Zdecydowałem się również użyć !jako prefiksu dla tych makr, aby uniknąć kolizji z nazwanymi kotwicami - obejmuje to narzut, aby usunąć „http: //” z adresu URL linku (ponieważ Wordpress będzie próbował znormalizować te dziwne linki) . Jeśli ta implementacja Ci przeszkadza, zawsze możesz usunąć preg_replace()połączenie i użyć #jako prefiksu łącza, jak poprzednio.
Możesz utworzyć stronę, a następnie zastosować do niej niestandardowy szablon archiwum. Tworzę i używam archive- {post-type} .php dla nazwy szablonu, tak jak w przypadku archiwum domyślnego, po prostu ręcznie stosuję go do strony.
Jeśli to zrobisz, zaleciłbym ustawienie CPT na has_archive = 'false', aby uniknąć kolizji z linkami bezpośrednimi, niezależnie od tego, czy tylko strona ma inny link permalinkowy niż ustawiony dla archiwum CPT.
Natrafiłem na ten sam dokładny problem i znalazłem to rozwiązanie:
// $menu is the menu as a string if( check if youa re on the page you are looking for)
$menu = str_replace('<li class="menu-item"><a href="http://bla.com/bloop/">','<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">'>, $menu );
Myślę, że musiałbym utworzyć nowy „nadrzędny” typ postu, więc niestandardowy typ postu, który chcę pokazać, staje się „podrzędny”, a ten nadrzędny zostanie wyświetlony w menu.
To powinna być opcja. Utworzenie obojętnego rodzica tylko po to, by umieścić go na liście w menu, to zbyt wiele pracy.
Chciałbym zrobić to z szablonu lub funkcji, więc nie muszę tego robić w ustawieniach menu dla każdej witryny w mojej instalacji na wielu stronach.
Chodziło mi o to, że posty niestandardowego typu, które chciałem wyświetlić w menu, będą jedynym podtypem nowo utworzonego elementu nadrzędnego i mam nadzieję, że zostaną wymienione na liście nadrzędnej w ustawieniach menu.
sergio
0
Znalazłem tę odpowiedź, szukając podobnego problemu. Właśnie skopiowałem kod do mojego pliku finctions.php i zadziałał od razu po wyjęciu z pudełka :) mam nadzieję, że to pomoże!
Zamiast dodawać link, robię pustą stronę. Na tej stronie dodaję coś w stylu „Treści generowane z cpt-name” w edytorze, aby mój klient wiedział, skąd pochodzą wszystkie rzeczy.
Następnie dodaję tę stronę do menu i za pomocą następującego kodu upewniam się, że jest podświetlona, gdy działa archives-cpt lub single-cpt.
/**
* Fix to add Custom post types to nav menu
* If you custom post is called "concepts"
* create a new empty page called concepts and add this
*/function additional_active_item_classes($classes = array(), $menu_item =false){global $wp_query;if(in_array('current-menu-item', $menu_item->classes)){
$classes[]='current-menu-item';}if( $menu_item->title =='PAGE TITLE'&& is_post_type_archive('cpt-slug')){
$classes[]='current-menu-item';}if( $menu_item->title =='PAGE TITLE'&& is_singular('cpt-slug')){
$classes[]='current-menu-item';}return $classes;}
add_filter('nav_menu_css_class','additional_active_item_classes',10,2);
Spowoduje to sprawdzenie tytułu menu / strony i sprawdzenie, czy faktycznie znajduje się archiwum lub pojedyncza strona niestandardowego typu posta. Jeśli to prawda, doda klasę bieżącego menu.
Rozszerzyłem nieco odpowiedź Tungda, aby zapewnić większą ogólność dzięki takiemu podejściu. Ta implementacja umożliwia dodawanie dowolnych mapowań między „makrami” menu a wewnętrznymi adresami URL Wordpress, o których wie tylko backend.
Zdecydowałem się również użyć
!
jako prefiksu dla tych makr, aby uniknąć kolizji z nazwanymi kotwicami - obejmuje to narzut, aby usunąć „http: //” z adresu URL linku (ponieważ Wordpress będzie próbował znormalizować te dziwne linki) . Jeśli ta implementacja Ci przeszkadza, zawsze możesz usunąćpreg_replace()
połączenie i użyć#
jako prefiksu łącza, jak poprzednio.źródło
Możesz utworzyć stronę, a następnie zastosować do niej niestandardowy szablon archiwum. Tworzę i używam archive- {post-type} .php dla nazwy szablonu, tak jak w przypadku archiwum domyślnego, po prostu ręcznie stosuję go do strony.
Jeśli to zrobisz, zaleciłbym ustawienie CPT na has_archive = 'false', aby uniknąć kolizji z linkami bezpośrednimi, niezależnie od tego, czy tylko strona ma inny link permalinkowy niż ustawiony dla archiwum CPT.
źródło
Natrafiłem na ten sam dokładny problem i znalazłem to rozwiązanie:
Źródło: http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html
źródło
Myślę, że musiałbym utworzyć nowy „nadrzędny” typ postu, więc niestandardowy typ postu, który chcę pokazać, staje się „podrzędny”, a ten nadrzędny zostanie wyświetlony w menu.
To powinna być opcja. Utworzenie obojętnego rodzica tylko po to, by umieścić go na liście w menu, to zbyt wiele pracy.
Chciałbym zrobić to z szablonu lub funkcji, więc nie muszę tego robić w ustawieniach menu dla każdej witryny w mojej instalacji na wielu stronach.
źródło
Znalazłem tę odpowiedź, szukając podobnego problemu. Właśnie skopiowałem kod do mojego pliku finctions.php i zadziałał od razu po wyjęciu z pudełka :) mam nadzieję, że to pomoże!
Dynamiczna nawigacja dla niestandardowego typu postu (strony)
źródło
Zamiast dodawać link, robię pustą stronę. Na tej stronie dodaję coś w stylu „Treści generowane z cpt-name” w edytorze, aby mój klient wiedział, skąd pochodzą wszystkie rzeczy.
Następnie dodaję tę stronę do menu i za pomocą następującego kodu upewniam się, że jest podświetlona, gdy działa archives-cpt lub single-cpt.
Spowoduje to sprawdzenie tytułu menu / strony i sprawdzenie, czy faktycznie znajduje się archiwum lub pojedyncza strona niestandardowego typu posta. Jeśli to prawda, doda klasę bieżącego menu.
źródło