Aggiunta di archivi di tipi di post personalizzati a un menu WordPress


10

Esiste un modo (oltre all'aggiunta di un collegamento personalizzato) per aggiungere un archivio di tipo post personalizzato a un menu in WordPress? Se viene aggiunto usando un collegamento personalizzato (ad es. / Cpt-archive-slug /), WordPress non applica classi come current-menu-itemall'elemento elenco, che presenta delle difficoltà nello stile del menu.

Se il collegamento personalizzato contiene l'intero URL (ad es. Http://site.com/cpt-archive-slug/ ), tali classi vengono aggiunte. Tuttavia, questa probabilmente non è una "buona pratica".

Risposte:


5

la tua migliore opposizione è il link personalizzato con l'URL completo poiché gli archivi di tipi di post personalizzati sono archivi basati su tassonomia di forma diversa (categorie, tag, qualsiasi tassonomia personalizzata) e archivi basati su data che hanno il proprio slug di archivio.


6

So che questo è vecchio ma ho anche questo problema e ho trovato un modo piuttosto pulito per gestirlo è usare un walker di menu personalizzato

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

Avendo una voce di menu di collegamento personalizzata con URL di #post_type_album, puoi usarla in questo modo:

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

Nota: questo presuppone che la lumaca e il nome del tuo post siano gli stessi.


+1 per la risposta di qualità tardiva. Questo fa bene alla comunità!
Brian Fegter,

2

Ho ampliato un po ' la risposta di Tungd per fornire più genericità con questo approccio. Questa implementazione consente di aggiungere mappature arbitrarie tra le "macro" dei menu e gli URL Wordpress interni di cui solo il backend è a conoscenza.

Ho anche deciso di utilizzare !come prefisso per queste macro per evitare che si scontrino con ancore denominate - questo include un sovraccarico per rimuovere "http: //" dall'URL del collegamento (poiché Wordpress tenterà di normalizzare questi strani collegamenti) . Se tale implementazione ti dà fastidio, puoi sempre rimuovere la preg_replace()chiamata e utilizzare #come prefisso del link come prima.

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

1

È possibile creare una Pagina e quindi applicare un modello di archivio personalizzato. Creo e utilizzo archive- {post-type} .php per il nome del modello proprio come faresti per l'archivio predefinito, lo applico manualmente alla Pagina.

Se lo fai, ti consiglio di impostare il tuo CPT su has_archive = 'false' per evitare le collisioni di permalink, indipendentemente dal fatto che la tua Pagina abbia una lumaca Permalink diversa da quella impostata sulla lumaca dell'archivio CPT.



0

Penso che dovrei creare un nuovo tipo di post "genitore", quindi il tipo di post personalizzato che voglio mostrare diventa un "figlio" e quel genitore sarà elencato nel menu.

Questa dovrebbe essere un'opzione. Creare un genitore fittizio solo per averlo elencato nel menu è troppo lavoro.

Vorrei un modo per farlo dal modello o dalle funzioni, quindi non devo farlo nelle impostazioni di ciascun menu per ciascun sito nella mia installazione su più siti.


1
Volevo dire, i post di tipo post personalizzato che volevo mostrare nel menu saranno l'unico sottotipo del genitore appena creato e spero che sia elencato sotto il genitore nelle impostazioni del menu.
sergio,


0

Quello che faccio invece di aggiungere il link è creare una pagina vuota. In quella pagina aggiungo qualcosa come "Contenuti generati da cpt-name" nell'editor in modo che il mio client sappia da dove provengono tutte le cose.

Quindi aggiungo quella pagina al menu e con il seguente codice mi assicuro che sia evidenziato quando è in esecuzione archives-cpt o 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 );

Questo verificherà il titolo del menu / della pagina e se stiamo effettivamente visualizzando l'archivio o la singola pagina di un tipo di post personalizzato. Se è vero, aggiungerà la classe della voce di menu corrente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.