Ajout d'archives de type de publication personnalisées à un menu WordPress

10

Existe-t-il un moyen (en plus d'ajouter un lien personnalisé) pour ajouter une archive de type de publication personnalisée à un menu dans WordPress? S'il est ajouté à l'aide d'un lien personnalisé (par exemple / cpt-archive-slug /), WordPress n'applique pas de classes comme current-menu-itemà l'élément list, ce qui présente des défis lors de la stylisation du menu.

Si le lien personnalisé contient l'URL complète (par exemple http://site.com/cpt-archive-slug/ ), ces classes sont ajoutées. Cependant, ce n'est probablement pas une «meilleure pratique».

Travis Northcutt
la source

Réponses:

5

votre meilleure option est un lien personnalisé avec une URL complète, car les archives de types de publication personnalisés sont des archives basées sur la taxonomie sous différentes formes (catégories, balises, toute taxonomie personnalisée) et des archives basées sur la date qui ont leur propre fichier d'archive.

Bainternet
la source
6

Je sais que c'est vieux, mais j'ai aussi ce problème et j'ai trouvé une façon plutôt propre de le gérer, c'est d'utiliser un menu personnalisé

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

Ayant un élément de menu de lien personnalisé avec URL de #post_type_album, vous pouvez l'utiliser comme ceci:

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

Remarque: Cela suppose que le slug et le nom de votre type de publication sont les mêmes.

tungd
la source
+1 pour la réponse de qualité tardive. C'est bon pour la communauté!
Brian Fegter
2

J'ai développé un peu la réponse de tungd pour donner plus de générosité à cette approche. Cette implémentation permet d'ajouter des mappages arbitraires entre les «macros» de menu et les URL Wordpress internes que seul le backend connaît.

J'ai également décidé d'utiliser !le préfixe de ces macros pour éviter qu'elles ne se heurtent aux ancres nommées - cela inclut une surcharge pour supprimer le 'http: //' de l'URL du lien (car Wordpress tentera de normaliser ces liens étranges) . Si cette implémentation vous dérange, vous pouvez toujours supprimer l' preg_replace()appel et l'utiliser #comme préfixe de lien comme auparavant.

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
la source
1

Vous pouvez créer une page, puis lui appliquer un modèle d'archive personnalisé. Je crée et utilise archive- {post-type} .php pour le nom du modèle comme vous le feriez pour l'archive par défaut, je l'applique manuellement à la page.

Si vous faites cela, je vous recommande de définir votre CPT sur has_archive = 'false' pour éviter les collisions de permaliens, tout en vous assurant simplement que votre page a un slug de permalien différent de celui de votre slug d'archive CPT.

jb510
la source
0

Je pense que je devrais créer un nouveau type de post "parent", donc le type de post personnalisé que je veux montrer devient un "enfant", et ce parent sera répertorié dans le menu.

Cela devrait être une option. Créer un parent factice juste pour l'avoir répertorié dans le menu est trop de travail.

Je voudrais un moyen de le faire à partir du modèle ou des fonctions, donc je n'ai pas à le faire dans les paramètres de chaque menu pour chaque site dans mon installation multisite.

sergio
la source
1
Je voulais dire, les messages de type de publication personnalisée que je voulais afficher dans le menu seront le seul sous-type du parent nouvellement créé, et j'espère qu'il sera répertorié sous le parent dans les paramètres du menu.
sergio
0

Ce que je fais au lieu d'ajouter le lien, c'est de créer une page vide. Dans cette page, j'ajoute quelque chose comme "Contenu généré à partir de nom-cpt" dans l'éditeur afin que mon client sache d'où viennent toutes les choses.

Ensuite, j'ajoute cette page au menu et avec le code suivant, je m'assure qu'elle est mise en surbrillance lorsque archives-cpt ou single-cpt est en cours d'exécution.

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

Cela vérifiera le titre du menu / page et si nous voyons réellement l'archive ou la page individuelle d'un type de publication personnalisé. Si c'est vrai, il ajoutera la classe d'élément de menu en cours.

chifliiiii
la source