Hinzufügen von benutzerdefinierten Post-Typ-Archiven zu einem WordPress-Menü

Gibt es eine Möglichkeit (neben dem Hinzufügen eines benutzerdefinierten Links), ein benutzerdefiniertes Post-Archiv zu einem Menü in WordPress hinzuzufügen? Wenn es mit einem benutzerdefinierten Link (zB / cpt-archive-slug /) hinzugefügt wird, wendet WordPress keine classn wie das current-menu-item auf das Listenelement an, was zu Problemen beim Formatieren des Menüs führt.

Wenn der benutzerdefinierte Link die gesamte URL enthält (z. B. http://site.com/cpt-archive-slug/ ), werden diese classn hinzugefügt. Dies ist jedoch wahrscheinlich keine “Best Practice”.

Solutions Collecting From Web of "Hinzufügen von benutzerdefinierten Post-Typ-Archiven zu einem WordPress-Menü"

Ihre beste Wahl ist ein benutzerdefinierter Link mit der vollständigen URL, da benutzerdefinierte Post-Typen-Archive verschiedene Taxonomie-basierte Archive (Kategorien, Tags, jede benutzerdefinierte Taxonomie) und datumsabhängige Archive mit eigenen Archiv-Slugs sind.

Ich weiß, dass das alt ist, aber ich habe dieses Problem auch, und ich fand einen ziemlich sauberen Weg, es zu handhaben, ist ein kundenspezifisches Menü walker zu verwenden

 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; } } 

Wenn Sie einen benutzerdefinierten Link-Menüpunkt mit der URL von #post_type_album , können Sie ihn wie #post_type_album verwenden:

 # 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(), )); 

Hinweis: Dies setzt voraus, dass der Slug und der Name des Post-Typs identisch sind.

Ich habe ein wenig auf Tungd’s Antwort ausgeweitet , um mehr Generizität für diesen Ansatz zu bieten. Diese Implementierung ermöglicht das Hinzufügen beliebiger Zuordnungen zwischen Menü-Makros und internen WordPress-URLs, von denen nur das Back-End weiß.

Ich habe mich auch entschieden zu verwenden ! als Präfix für diese Makros, um zu vermeiden, dass sie mit benannten Ankern kollidieren – dies beinhaltet einen Overhead, um das “http: //” von der Link-URL abzuziehen (da WordPress versucht, diese seltsamen Links zu normalisieren). Wenn diese Implementierung Sie stört, können Sie den Aufruf preg_replace() immer entfernen und # wie zuvor als Link-Präfix verwenden.

 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')); 

Sie können eine Seite erstellen und dann eine benutzerdefinierte Archivvorlage darauf anwenden. Ich erstelle und verwende Archiv- {post-type} .php für den Namen der Vorlage, so wie du es für das Standard-Archiv tun würdest. Ich verwende es einfach manuell auf die Seite.

Wenn Sie dies tun, würde ich empfehlen, Ihren CPT auf has_archive = ‘false’ zu setzen, um Permalink-Kollisionen zu vermeiden, unabhängig davon, ob Ihre Seite einen anderen Permalink-Slug hat als der CPT-Archiv-Slug.

Ich stieß auf genau dasselbe Problem und fand diese Lösung:

 // $menu is the menu as a string if ( check if youa re on the page you are looking for ) $menu = str_replace( ' 

Quelle: http://www.wtavern.com/forum/plugin-hacks/2169-current-page-custom-post-type-archive.html

Ich denke, ich müsste einen neuen “Eltern” -Post-Typ erstellen, so dass der Custom-Post-Typ, den ich zeigen möchte, ein “Kind” wird, und dieser Elternteil wird im Menü aufgeführt.

Dies sollte eine Option sein. Das Erstellen eines Dummy-Elternteils, nur um es im Menü aufgelistet zu bekommen, ist zu viel Arbeit.

Ich hätte gerne eine Möglichkeit, dies über die Vorlage oder functionen zu tun, also muss ich es nicht in jeder Menüeinstellung für jede Site in meiner Multisite-Installation tun.

Ich habe diese Antwort gefunden, wenn ich nach einem ähnlichen Problem suche. Ich habe den Code einfach in meine finctions.php-Datei kopiert und es funktionierte direkt aus der Box 🙂 hoffe, es hilft!

Dynamische Navigation für benutzerdefinierten Posttyp (Seiten)

Was ich mache, anstatt den Link hinzuzufügen, ist das Erstellen einer leeren Seite. Auf dieser Seite füge ich etwas wie “Inhalt erzeugt von cpt-name” in den Editor ein, damit mein Klient weiß, woher alle Sachen kommen.

Dann füge ich diese Seite zum Menü hinzu und mit dem folgenden Code stelle ich sicher, dass markiert ist, wenn archives-cpt oder single-cpt läuft.

 /** * 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 ); 

Dies wird nach Menü / Seitentitel suchen und wenn wir tatsächlich das Archiv oder die einzelne Seite eines benutzerdefinierten Post-Typs sehen. Wenn es wahr ist, wird die aktuelle Menü-Item-class hinzugefügt.