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

10

Gibt es eine Möglichkeit (neben dem Hinzufügen eines benutzerdefinierten Links), einem Menü in WordPress ein benutzerdefiniertes Archiv vom Typ Post hinzuzufügen? Wenn es über einen benutzerdefinierten Link hinzugefügt wird (z. B. / cpt-archive-slug /), wendet WordPress keine Klassen wie current-menu-itemdas Listenelement an, was beim Gestalten des Menüs eine Herausforderung darstellt.

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

Travis Northcutt
quelle

Antworten:

5

Ihre beste Option ist ein benutzerdefinierter Link mit vollständiger URL, da Archive für benutzerdefinierte Beitragstypen unterschiedliche Formulare für taxonomiebasierte Archive (Kategorien, Tags, benutzerdefinierte Taxonomien) und datumsbasierte Archive sind, die über einen eigenen Archivbug verfügen.

Bainternet
quelle
6

Ich weiß, dass dies alt ist, aber ich habe auch dieses Problem und ich habe einen ziemlich sauberen Weg gefunden, damit umzugehen, indem ich einen benutzerdefinierten Menü-Walker verwende

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

Mit einem benutzerdefinierten Link-Menüelement mit der URL von #post_type_albumkönnen Sie es folgendermaßen 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 Ihres Post-Typs identisch sind.

Tungd
quelle
+1 für die späte Qualitätsantwort. Das ist gut für die Community!
Brian Fegter
2

Ich habe die Antwort von Tungd ein wenig erweitert , um diesem Ansatz mehr Großzügigkeit zu verleihen . Diese Implementierung ermöglicht das Hinzufügen beliebiger Zuordnungen zwischen Menü-Makros und internen Wordpress-URLs, die nur dem Backend bekannt sind.

Ich habe auch beschlossen, !diese Makros als Präfix zu verwenden, um zu vermeiden, dass sie mit benannten Ankern in Konflikt geraten. Dies beinhaltet einen Overhead, um das 'http: //' von der Link-URL zu entfernen (da Wordpress versucht, diese seltsamen Links zu normalisieren). . Wenn Sie diese Implementierung stört, können Sie den preg_replace()Anruf jederzeit entfernen und #wie zuvor als Linkprä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'));
pospi
quelle
1

Sie können eine Seite erstellen und anschließend eine benutzerdefinierte Archivvorlage darauf anwenden. Ich erstelle und verwende archive- {post-type} .php für den Vorlagennamen, genau wie Sie es für das Standardarchiv tun würden. Ich wende es einfach manuell auf die Seite an.

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

jb510
quelle
0

Ich denke, ich müsste einen neuen "übergeordneten" Post-Typ erstellen, damit der benutzerdefinierte Post-Typ, den ich anzeigen möchte, zu einem "untergeordneten" Typ wird und dieser Elternteil im Menü aufgeführt wird.

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

Ich möchte eine Möglichkeit, dies anhand der Vorlage oder der Funktionen zu tun, damit ich dies nicht in den einzelnen Menüeinstellungen für jede Site in meiner Multisite-Installation tun muss.

Sergio
quelle
1
Ich meinte, die benutzerdefinierten Posts vom Typ "Post", die ich im Menü anzeigen wollte, sind der einzige Untertyp des neu erstellten übergeordneten Elements, und ich hoffe, dass sie in den Menüeinstellungen unter dem übergeordneten Element aufgeführt werden.
Sergio
0

Anstatt den Link hinzuzufügen, erstelle ich eine leere Seite. Auf dieser Seite füge ich im Editor so etwas wie "Aus cpt-name generierter Inhalt" hinzu, damit mein Kunde weiß, woher all das kommt.

Dann füge ich diese Seite dem Menü hinzu und stelle mit dem folgenden Code sicher, dass sie hervorgehoben wird, wenn archives-cpt oder single-cpt ausgeführt wird.

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

Dadurch wird nach dem Titel des Menüs / der Seite gesucht und ob tatsächlich das Archiv oder die einzelne Seite eines benutzerdefinierten Beitragstyps angezeigt wird. Wenn dies der Fall ist, wird die aktuelle Menüelementklasse hinzugefügt.

chifliiiii
quelle