web-dev-qa-db-fra.com

comment créer un menu avec toutes les sous catégories?

Est-il possible de créer un menu avec une catégorie telle que chaque fois que j'ai eu une sous-catégorie qui s'affiche automatiquement dans le menu?

Autant que je sache, si j'ai un menu avec la catégorie "fruit" et que je crée la sous-catégorie "banane", je dois l'ajouter manuellement.

6
nsn

Cela dépend de quel type de menu vous parlez:

1)

Si vous parlez de "menus personnalisés" (disponibles dans le backend sous Conception -> Menus), vous pouvez procéder comme suit:

  • Créer une nouvelle fonction avec le hook d’action add_category

  • à l'intérieur de cette fonction, vous pouvez créer un nouveau poste de type type d'élément de menu, qui est ajouté correctement à votre menu

  • chaque fois qu'une nouvelle catégorie est publiée, l'élément de menu est ajouté maintenant

  • vous devez également vous connecter à la catégorie de suppression pour garder votre menu à jour

2)

Vous pourriez faire beaucoup plus facilement sans un menu wordpress:

  • écrivez simplement une fonction pour lister vos catégories (ou utilisez la fonction prédéfinie wp_list_categories)
  • si cela ne suffit pas, écrivez un message personnalisé qui (peut-être
    recursivley) lit vos catégories dans la base de données

Pour que l’option 1 code, vous avez besoin de quelques connaissances sur WordPress.

3
Blackbam

Je préfère utiliser wp_list_categories . Voici le code que j'ai utilisé dans mon dernier projet:

<?php wp_list_categories('orderby=ID&exclude=3,10,1,16,38&title_li=<span class="sidebar_heading d_shadow">' . __('Categories') . '</span>'); ?>

Vous obtiendrez une liste de toutes vos catégories et sous-catégories.

2
Paulius Jakštas

Après de nombreuses recherches, j'ai trouvé une solution utile et confiante, ce cours fonctionne bien:

class EntexAutoSubmenu {

    /**
     * Constructor
     */
    function __construct(){
        add_action('created_category', array($this, 'on_publish_category'));
    }

    /**
     * When publishing a new child category, add it to the appropriate custom menu.
     */
    function on_publish_category($cat_id){

        // Theme supports custom menus?
        if (!current_theme_supports('menus')) return;

        // Published taxonomy has parent?
        $cat = get_category($cat_id);
        if (!$cat->category_parent) return;

        $all_menus = get_terms('nav_menu', array('hide_empty' => true));

        // Loop through the menus to find page parent
        foreach ($all_menus as $menu) {

            $menu_parent = NULL;
            $menu_items = wp_get_nav_menu_items($menu->term_id, array('post_status' => 'publish,draft'));

            if (!is_array($menu_items)) continue;

            foreach ($menu_items as $menu_item){
                // Item already in menu?
                if ($menu_item->object_id == $cat_id) continue 2;
                if ($menu_item->object_id == $cat->category_parent) $menu_parent = $menu_item;
            }

            // Add new item
            if ($menu_parent) {
                wp_update_nav_menu_item($menu->term_id, 0, array(
                    'menu-item-object-id' => $cat_id,
                    'menu-item-object' => $cat->taxonomy,
                    'menu-item-parent-id' => $menu_parent->ID,
                    'menu-item-type' => 'taxonomy',
                    'menu-item-status' => 'publish'
                ));
            }
        }
    }
}

$auto_submenu = new EntexAutoSubmenu();
1
Jonas Lundman

Une autre alternative consisterait à utiliser Lister le widget Taxonomie personnalisée , cela pourrait fonctionner dans votre cas d'utilisation (si vous n'envisagez pas d'utiliser WP nav_menu).

1
David Senkus

J'ai codé le mien pour un de mes clients

<div class="menu">
  <ul id="MenuBar1" class="MenuBarHorizontal">
    <li><a <?PHP if( count($_GET) == 0 ){ echo 'class="-current"';} ?> href="<?php echo esc_url( home_url( '/' ) ); ?>">home</a></li>
    <?php
        $category_ids = get_all_category_ids();
        sort($category_ids);
        foreach($category_ids as $cat_id) {
            $cat_name = get_cat_name($cat_id);

            echo '<li><a href="' . get_category_link( $cat_id ) . '">' . $cat_name . '</a>';            
            $args = array( 'numberposts' => -1, 'offset'=> 0, 'cat' => $cat_id, 'orderby' => 'ID', 'order' => 'ASCE' );     

            echo '<ul>';

            /* The 2nd Query (without global var) */
            $query2 = new WP_Query( $args );
            // The 2nd Loop
            while( $query2->have_posts() ):
                $query2->next_post();
                echo '<li><a href="' . get_permalink( $query2->post->ID ) . '">' . get_the_title( $query2->post->ID ) . '</a></li>';
            endwhile;

            // Restore original Query & Post Data
            wp_reset_query();
            wp_reset_postdata();
            echo '</ul>';
        echo '</li>';
        }
    ?>
  </ul>
</div>
1
0_0

Pour résoudre ce problème, j'ai essayé de créer un plugin qui crée automatiquement un élément de menu pour la catégorie de publication dans sa catégorie parente si dans le menu.

Idée de plugin:

1.en code, j'ai utilisé "created_ $ taxonomy" action crochet.

2.collecter tous les éléments de menu (en utilisant wp_get_nav_menu_item s)

3.et condition de vente si le parent de la catégorie de publication réside dans un élément de menu par rapport à un élément de menu créé en tant que sous-menu de sa catégorie parente (en utilisant wp_update_nav_menu_item )

<?php
/*
Plugin Name: Auto Category Submenu
Plugin URI: 
Description: Create menu item when category publish/create if it's parent category in menu item.
Version: 0.1
Author: Mayank Gupta/Ravinder Kumar
Author URI: 
License: GPL2
*/

class AutoSubmenu {

    /**
     * Constructor
     */
    function __construct() {
        add_action( 'created_category', array( &$this, 'on_publish_cat' ) );
    }

    /**
     * When publishing a new child page, add it to the appropriate custom menu.
     */
    function on_publish_cat( $cat_id ) {
        $cat = get_category( $cat_id );

        //menu id for you menus in which your sub-category's parent category as menu item 
        $menu_ids = array(101,100);

        //retrieve all meu items from menu
        foreach($menu_ids as $menu_id){
            $menu_items[] = wp_get_nav_menu_items( $menu_id, array('post_status' => 'publish','post_type' => 'nav_menu_item','output' => ARRAY_A, ) );
        }
        foreach($menu_items as $menu_item){
            $counter = 0 ;
            echo'<!--';
            print_r($menu_item);
            echo'-->';
            foreach($menu_item as $menu_term){
                $menu_terms_id[] = $menu_term->object_id; //all menu items id
            }
        }
        //print_r($menu_terms_id); //test for items in menu
        foreach( $menu_terms_id as $menu_term ){
            if( $cat->category_parent == $menu_term){
                wp_update_nav_menu_item( $cat_id, 0, array(
                'menu-item-object-id' => $cat_id,
                'menu-item-object' => $cat->taxonomy,
                'menu-item-parent-id' => $menu_term,
                'menu-item-type' => 'category',
                'menu-item-status' => 'publish'
            ) );
            }else{
                return;
            }
        }
    }

}
$auto_submenu = new AutoSubmenu();

Remarque: un plugin donnant une erreur (en-tête déjà envoyé) et un élément de menu non créé lors de la publication de la catégorie. Cela peut être un autre sujet de problème, mais je le mets ici car cela pourrait être une solution si certains me suggèrent de me tromper. si je fais quelque chose de mal en le mettant ici

1
Ravinder Kumar

j'utilise pour afficher toutes les catégories et sous-catégories de catégories sous forme de menu dans mon projet.

$all_categories = get_categories( $args );
echo "<div class='container'>";
 echo "<div class='productsubmenu'>";
echo "<ul>";

foreach ($all_categories as $cat)
{           

if($cat->category_parent == 0)
 {
  $category_id = $cat->term_id;
   $thumbnail_id = get_woocommerce_term_meta( $cat->term_id,    'thumbnail_id', true );
$image = wp_get_attachment_url( $thumbnail_id );

echo '<li class="parent '.$my.' "><a href="'.get_term_link( $cat ) . '">'.$cat->name.'</a>';


$args2 = array(
'taxonomy' => $taxonomy,
'child_of' => 0,
'parent' => $category_id,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty

);
   $args = array(
   'hierarchical' => 1,
   'show_option_none' => '',
   'hide_empty' => 0,
   'parent' => $parent_cat_ID,
   'taxonomy' => 'product_cat'
);
 $subcats = get_categories($args2);
 echo '<ul class="wooc_sclist">';

  foreach ($subcats as $sc) { 

        }

    $link = get_term_link( $sc->slug, $sc->taxonomy );
    echo '<li class="'.$my.'" ><a href="'. $link .'">'.$sc->name.'</a></li>';
  }
echo '</ul>';
echo "</li>";
}
else
{

 }
 }

    echo "</ul>";
   echo "</div>";
   echo "</div>";
0