Je travaille dans WooCommerce et j'essaie de filtrer les sous-catégories vides. J'ai trouvé ce code, qui filtre tout ce qui est "vide" ... y compris le lien de ma page d'accueil, le lien à propos de nous, etc.
function exclude_empty_cat_menu_items( $items, $menu, $args ) {
// Get a list of product categories that excludes empty categories
$non_empty_categories = get_categories(array('taxonomy' => 'product_cat'));
// Iterate over the menu items
foreach ( $items as $key => $item ) {
$is_empty = true;
// check current item is in the non-empty categories array
foreach ( $non_empty_categories as $key => $cat )
if ($item->title == $cat->name)
$is_empty = false;
// if it is empty remove it from array
if ($is_empty) unset($items[$key]);
}
return $items;
}
add_filter( 'wp_get_nav_menu_items', 'exclude_empty_cat_menu_items', null, 3 );
Et voici mon menu ...
<?php
$args = array(
'theme_location' => 'lower-bar',
'depth' => 0,
'container' => false,
'fallback_cb' => false,
'menu_class' => 'nav navbar-nav',
'walker' => new BootstrapNavMenuWalker()
);
wp_nav_menu($args);
?>
Je ne suis pas marié à l'idée d'utiliser le menu WordPress de cette façon. Je le code normalement normalement. Est-il possible de montrer toutes les catégories et pages parent tout en filtrant les catégories enfants vides?
Je voudrais aborder cela légèrement différemment. J'utilise toujours le filtre wp_get_nav_menu_items
, mais je vais d'abord construire un tableau contenant les identifiants de tous les termes vides. Ensuite, je comparerai chacun des $items
à ceci pour une exclusion potentielle:
add_filter( 'wp_get_nav_menu_items', 'wpse177082', 10, 3 );
function wpse177082 ( $items, $menu, $args ) {
global $wpdb;
$empty = $wpdb->get_col( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE count = 0" );
foreach ( $items as $key => $item ) {
if ( ( 'taxonomy' == $item->type ) && ( in_array( $item->object_id, $empty ) ) ) {
unset( $items[$key] );
}
}
return $items;
}
Vous pouvez bien entendu limiter davantage cette action à des catégories de produits WooCommerce uniquement si nécessaire.