web-dev-qa-db-fra.com

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

Existe-t-il un moyen (en plus d'ajouter un lien personnalisé) d'ajouter une archive de type 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 telles que current-menu-item à l'élément de liste, ce qui présente des difficultés pour styliser le 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".

10
Travis Northcutt

votre meilleure option est un lien personnalisé avec une URL complète, car les archives de types de publications personnalisées sont différentes: archives basées sur la taxonomie (catégories, balises, taxonomie personnalisée) et les archives basées sur la date ayant leur propre archive.

5
Bainternet

Je sais que c’est vieux, mais j’ai aussi ce problème et j’ai trouvé une façon assez simple de le gérer: 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;
  }
}

Avoir un élément de menu de lien personnalisé avec l'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: Ceci suppose que le slug et le nom de votre type de message sont les mêmes.

6
tungd

J'ai développé un peu sur la réponse de tungd pour fournir plus de généricité avec cette approche. Cette implémentation permet d’ajouter des correspondances arbitraires entre les "macros" de menu et les URL internes Wordpress, que seul le back-end connaît.

J'ai également décidé d'utiliser ! comme préfixe pour ces macros afin d'éviter qu'elles ne se heurtent aux ancres nommées. Cela inclut un temps système pour supprimer le 'http: //' de l'URL du lien (Wordpress essayant de normaliser ces liens étranges). ). Si cette mise en œuvre vous dérange, vous pouvez toujours supprimer l'appel preg_replace() et 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'));
2
pospi

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 recommanderais de définir votre CPT sur has_archive = 'false' pour éviter les collisions de lien permanent, peu importe que votre page ait un slug de permalien différent de celui défini pour votre archive d'archive CPT.

1
jb510

J'ai rencontré le même problème et trouvé la solution suivante:

// $menu is the menu as a string 
if ( check if youa re on the page you are looking for )
    $menu = str_replace( '<li class="menu-item"><a href="http://bla.com/bloop/">', '<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">'>, $menu );  

Source: http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html

1
TJK

J'ai trouvé cette réponse lors de la recherche d'un problème similaire. Je viens de copier le code dans mon fichier finctions.php et tout a fonctionné: j'espère que ça aide!

Navigation dynamique pour le type d'article personnalisé (pages)

0

Je pense que je devrais créer un nouveau type de poste "parent", de sorte que le type de post personnalisé que je souhaite afficher devienne un "enfant", et ce parent SERA listé dans le menu.

Cela devrait être une option. Créer un parent factice juste pour le faire figurer dans le menu demande trop de travail.

Je voudrais un moyen de le faire à partir du modèle, ou des fonctions, afin de ne pas avoir à le faire dans les paramètres de menu pour chaque site de mon installation multisite.

0
sergio

Au lieu d’ajouter le lien, je crée une page vide. Dans cette page, j'ajoute quelque chose comme "Contenu généré à partir de cpt-name" dans l'éditeur pour que mon client sache d'où vient tout ce qui se passe.

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

Ceci vérifiera le titre du menu/page et si nous voyons réellement l'archive ou la page individuelle d'un type d'article personnalisé. Si c'est vrai, cela ajoutera la classe current-menu-item.

0
chifliiiii