web-dev-qa-db-fra.com

Exclure les catégories d'enfants vides dans le menu

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?

2
Annie

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.

2
karpstrucking