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.
Cela dépend de quel type de menu vous parlez:
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
Vous pourriez faire beaucoup plus facilement sans un menu wordpress:
wp_list_categories
)Pour que l’option 1 code, vous avez besoin de quelques connaissances sur WordPress.
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.
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();
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).
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>
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
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>";