web-dev-qa-db-fra.com

Comment ajouter une archive de type de publication personnalisée au menu

Je cherche depuis des semaines et je n'ai toujours pas trouvé de solution adéquate à ce problème.

J'écris un thème Wordpress. J'ai un type de message personnalisé appelé Works. J'aimerais ajouter mon archive Works à mon menu et le mettre en surbrillance, ainsi que ses publications, lorsque celles-ci sont surlignées.

Je peux accéder à mes archives et messages sur les liens suivants

Archive d'oeuvres: /works/

Fonctionne à la poste: /works/postname/

Ma solution a donc été de nommer mon fichier de modèle archive-works.php avec un nom de modèle (archive de travail). Créez ensuite une page vide en utilisant ce modèle et en ajoutant la page au menu. Cela met en évidence les archives dans le menu mais pas les publications individuelles.

Je peux facilement résoudre ce problème avec un lien personnalisé et du javascript, mais il doit y avoir un moyen plus efficace et plus propre.

21
rasmussvanejensen

Vous pouvez faire un tour simple dans votre functions.php:

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2);
function current_type_nav_class($classes, $item) {
    // Get post_type for this post
    $post_type = get_query_var('post_type');

    // Go to Menus and add a menu class named: {custom-post-type}-menu-item
    // This adds a 'current_page_parent' class to the parent menu item
    if( in_array( $post_type.'-menu-item', $classes ) )
        array_Push($classes, 'current_page_parent');

    return $classes;
}

Dans votre cas, vous devez simplement ajouter un élément de classe 'works-menu-item' avec cet élément de menu d'archive par le panneau d'administration;

15
Reza Mamun

Pour ajouter "lien d'archive de type de publication personnalisé" au menu, veuillez consulter le guide suivant.

  • Open file functions.php , and enter code below

    add_action('admin_head-nav-menus.php', 'wpclean_add_metabox_menu_posttype_archive');
    
    function wpclean_add_metabox_menu_posttype_archive() {
    add_meta_box('wpclean-metabox-nav-menu-posttype', __('Custom Post Type Archives'), 'wpclean_metabox_menu_posttype_archive', 'nav-menus', 'side', 'default');
    }
    
    function wpclean_metabox_menu_posttype_archive() {
    $post_types = get_post_types(array('show_in_nav_menus' => true, 'has_archive' => true), 'object');
    
    if ($post_types) :
        $items = array();
        $loop_index = 999999;
    
        foreach ($post_types as $post_type) {
            $item = new stdClass();
            $loop_index++;
    
            $item->object_id = $loop_index;
            $item->db_id = 0;
            $item->object = 'post_type_' . $post_type->query_var;
            $item->menu_item_parent = 0;
            $item->type = 'custom';
            $item->title = $post_type->labels->name;
            $item->url = get_post_type_archive_link($post_type->query_var);
            $item->target = '';
            $item->attr_title = '';
            $item->classes = array();
            $item->xfn = '';
    
            $items[] = $item;
        }
    
        $walker = new Walker_Nav_Menu_Checklist(array());
    
        echo '<div id="posttype-archive" class="posttypediv">';
        echo '<div id="tabs-panel-posttype-archive" class="tabs-panel tabs-panel-active">';
        echo '<ul id="posttype-archive-checklist" class="categorychecklist form-no-clear">';
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $items), 0, (object) array('walker' => $walker));
        echo '</ul>';
        echo '</div>';
        echo '</div>';
    
        echo '<p class="button-controls">';
        echo '<span class="add-to-menu">';
        echo '<input type="submit"' . disabled(1, 0) . ' class="button-secondary submit-add-to-menu right" value="' . __('Add to Menu') . '" name="add-posttype-archive-menu-item" id="submit-posttype-archive" />';
        echo '<span class="spinner"></span>';
        echo '</span>';
        echo '</p>';
    
    endif;
    }
    
14
tranthethang

Merci

Merci à rasmussvanejensen pour sa question Nice et à thethangtran pour la réponse, je ne comprends toujours pas pourquoi Wordpress n'a pas encore ajouté une telle fonctionnalité à sa base de code par défaut.

À propos, j’estime qu’il existe même une meilleure solution que celle proposée par thethangtran, car elle peut casser dans certaines situations.

Note 1

Selon le Codex, en utilisant register_post_type, il est possible d’ajouter un post_type supplémentaire à l’installation. Il y a une chance, il faut changer le 'query_var' et donc le code fourni sera cassé.

Note 2

En outre, il peut ne pas gérer la classe current-menu-item, qui sera utilisée pour la personnalisation css afin d'afficher l'élément de menu comme actif.

Note 3

Autre remarque sur le code, il n'est pas nécessaire de définir les variables loop_index, item et items. ils sont absolument inutiles.

Une meilleure solution

Donc, je suggère d'utiliser cette alternative, pour ceux qui veulent une solution plus robuste à ce sujet:

function prefix_add_metabox_menu_posttype_archive(){
  add_meta_box( 'prefix_metabox_menu_posttype_archive', __( 'Archives' ), 'prefix_metabox_menu_posttype_archive', 'nav-menus', 'side', 'default' );
}
add_action( 'admin_head-nav-menus.php', 'prefix_add_metabox_menu_posttype_archive' );

function prefix_metabox_menu_posttype_archive(){
  $post_types = get_post_types( array( 'show_in_nav_menus' => true, 'has_archive' => true ), 'object' );

  if( $post_types ){

    foreach( $post_types as $post_type ){

      $post_type->classes = array( $post_type->name );
      $post_type->type = $post_type->name;
      $post_type->object_id = $post_type->name;
      $post_type->title = $post_type->labels->name;
      $post_type->object = 'cpt_archive';

    }

    $walker = new Walker_Nav_Menu_Checklist( array() );?>
    <div id="cpt-archive" class="posttypediv">
      <div id="tabs-panel-cpt-archive" class="tabs-panel tabs-panel-active">
        <ul id="ctp-archive-checklist" class="categorychecklist form-no-clear"><?php
        echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $post_types ), 0, (object) array( 'walker' => $walker ) );?>
        </ul>
      </div>
    </div>
    <p class="button-controls">
      <span class="add-to-menu">
        <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-ctp-archive-menu-item" id="submit-cpt-archive" />
      </span>
    </p><?php

  }

}

function prefix_cpt_archive_menu_filter( $items, $menu, $args ){

  foreach( $items as &$item ){
    if( $item->object != 'cpt_archive' ) continue;
    $item->url = get_post_type_archive_link( $item->type );
    if( get_query_var( 'post_type' ) == $item->type ){
      $item->classes []= 'current-menu-item';
      $item->current = true;
    }
  }
  return $items;

}
add_filter( 'wp_get_nav_menu_items', 'prefix_cpt_archive_menu_filter', 10, 3 );
8
Trix

Naviguez jusqu'à Apparence> Menus;

Assurez-vous que le type de publication personnalisé de Works est sélectionné dans Options d'écran.

Cliquez sur le nom de votre type de message personnalisé pour le développer, puis cliquez sur l'onglet "Afficher tout";

Vous verrez une option pour tous les travaux. Cochez la case à côté, puis cliquez sur le bouton Ajouter au menu;

Votre archive de type de publication personnalisée apparaîtra maintenant comme un élément de menu dans la colonne de droite.

Par défaut, le libellé sera "All Works". Vous pouvez changer cela en écrivant quelque chose de différent sur l’étiquette de navigation;

Cliquez sur le bouton Enregistrer le menu pour enregistrer vos modifications.

0
Diogo Bento