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

10

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 list, ce qui pose des problèmes lors de la mise en forme du menu.

Si le lien personnalisé contient l'URL complète (par exemple, enlace ), ces classes sont ajoutées. Cependant, ce n'est probablement pas une "meilleure pratique".

    
posée Travis Northcutt 25.02.2011 - 21:44

8 réponses

5

votre meilleur choix 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 archives basées sur la date qui ont leur propre archive.

    
réponse donnée Bainternet 25.02.2011 - 23:35
6

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. L’utilisation d’un menu personnalisé est

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

Avec 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: cela suppose que le slug et le nom de votre type de message sont identiques.

    
réponse donnée tungd 08.09.2012 - 05:15
2

J'ai un peu développé la réponse de tungd pour offrir davantage 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 de Wordpress, dont seul le serveur a connaissance.

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 (comme le tentera Wordpress 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'));
    
réponse donnée pospi 22.02.2013 - 05:13
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 conseillerais de définir votre CPT sur has_archive = 'false' pour éviter les collisions de lien permanent, peu importe de vous assurer que votre page contient un slug de permalien différent de celui défini pour votre archive CPT.

    
réponse donnée jb510 25.04.2011 - 01:16
1

J'ai rencontré exactement 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: enlace

    
réponse donnée TJK 14.07.2011 - 20:52
0

Je pense que je devrais créer un nouveau post-type "parent", de sorte que le post-type que je souhaite afficher devienne un "enfant", et ce parent SERA répertorié 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 de fonctions, afin de ne pas avoir à le faire dans les paramètres de menu de chaque site de mon installation multisite.

    
réponse donnée sergio 27.09.2011 - 17:03
0

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 cela vous aidera!

navigation dynamique pour le type de publication personnalisé (pages)

    
réponse donnée Ole Henrik Skogstrøm 03.01.2012 - 14:38
0

Au lieu d’ajouter le lien, je crée une page vide. Dans cette page, j'ajoute quelque chose du type "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 que celle-ci 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 d’éléments de menu en cours.

    
réponse donnée chifliiiii 27.11.2013 - 12:21

Lire d'autres questions sur les étiquettes