Question

Est-il possible (en plus d'ajouter un lien personnalisé) pour ajouter un type poste personnalisé archive à un menu dans WordPress? Si elle est ajouté à l'aide d'un lien personnalisé (par exemple / cpt-archives limace /), WordPress ne s'applique pas comme les classes current-menu-item à l'élément de la liste, qui présente des défis en dénommant 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, c'est probablement pas une « meilleure pratique ».

Était-ce utile?

La solution

votre meilleur collants en option est lien personnalisé avec l'URL complète sous forme d'archives types de postes sur mesure sont différentes archives sur la taxonomie de forme (catégories, tags, une taxonomie personnalisée) et archives en date qui ont leur propre limace d'archives.

Autres conseils

Je sais que c'est vieux, mais je ce problème aussi, et je l'ai trouvé un moyen de gérer plutôt propre est d'utiliser un déambulateur 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 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(),
));

Note: Cette supposons que votre limace de poste de type et le nom sont les mêmes

.

J'ai développé un peu tungd pour fournir plus généricité avec cette approche. Cette mise en œuvre permet d'ajouter les correspondances arbitraires « macros » entre le menu et les URL de Wordpress interne que seul le back-end a connaissance.

J'ai aussi décidé d'utiliser ! comme préfixe pour ces macros pour les éviter des affrontements avec des ancres nommées - ce qui inclut une surcharge pour dépouiller le « http: // » de l'URL du lien (comme Wordpress va tenter de normaliser ces liens étranges). Si la mise en œuvre qui dérange vous, vous pouvez toujours supprimer l'appel preg_replace() et l'utilisation # comme préfixe de lien comme précédemment.

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

Vous pouvez créer une page, puis appliquer un modèle d'archivage personnalisé pour elle. Créer et utiliser Archive- {post-type} .php fo le nom du modèle, tout comme vous le feriez pour l'archive par défaut, je viens appliquer manuellement à la page.

Si vous faites cela, je vous recommande de régler votre CPT « false » has_archive = pour éviter les collisions permalien, quelle que soit assurez-vous juste que votre page a un autre limace permalien que votre limace d'archive CPT est réglé sur.

J'ai couru dans le même problème, et a trouvé cette solution:

// $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-courant en page sur mesure post-type archive.html

Je pense que je dois créer un nouveau poste de type « parent », donc le type post-mesure, je veux montrer devient un « enfant », et que parent est listé dans le menu.

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

Je voudrais une façon de le faire à partir du modèle ou des fonctions, donc je ne dois pas le faire dans chaque paramètre de menu pour chaque site dans mon installation multisite.

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 cela a fonctionné dès la sortie de la boîte :) espère que cela aide!

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

Ce que je fais au lieu d'ajouter le lien crée une page vide. Dans cette page j'ajouter quelque chose comme « contenu généré par cpt-name » dans l'éditeur pour mon client sait où tous les trucs vient.

Alors j'ajouter cette page au menu et le code suivant je veille est mise en évidence lorsque les archives cpt ou simple 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 );

va vérifier le titre de menu / page, et si nous voyons en réalité l'archive ou page individuelle d'un type de poste personnalisé. S'il est vrai, il ajoutera la classe actuelle-élément de menu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top