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”.

Travis Northcutt
źródło

Odpowiedzi:

5

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.

Bainternet
źródło
6

Wiem, że to jest stare, ale mam też ten problem i znalazłem dość czysty sposób, aby sobie z tym poradzić, używając niestandardowego menu

class KB_Custom_Menu_Walker extends Walker_Nav_Menu {

  protected static $custom_post_types = array();

  public function start_el(&$output, $item, $depth=0, $args=array(), $id=0) {
    if (isset( self::$custom_post_types[ $item->url ] )) {
      $item->url = get_post_type_archive_link( self::$custom_post_types[$item->url] );
    }
    parent::start_el($output, $item, $depth, $args, $id);
  }

  public static function custom_post_types($type=null) {
    if ($type) {
      self::$custom_post_types[ '#post_type_'.$type ] = $type;
    }
    return self::$custom_post_types;
  }
}

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.

wolfram
źródło
+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.

class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();

    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }

    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace('@^https?://@', '', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }

    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls['!' . $urlKey] = $realUrl;
    }

    public static function mapPostType($type)
    {
        self::createMapping('post_type_' . $type, get_post_type_archive_link($type));
    }
}

add_action('init', array('Extendable_Menu_Walker', 'setupUrls'));
pospi
źródło
1

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.

jb510
źródło
0

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.

sergio
źródło
1
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

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.

chifliiiii
źródło