web-dev-qa-db-de.com

Schließen Sie leere untergeordnete Kategorien im Menü aus

Ich arbeite in WooCommerce und versuche, die leeren Unterkategorien herauszufiltern. Ich habe diesen Code gefunden, der alles "Leere" herausfiltert ... einschließlich meines Homepage-Links, Über uns-Links usw.

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 );

Und hier ist meine Speisekarte ...

<?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);
 ?>

Ich bin nicht mit der Idee verheiratet, das WordPress-Menü auf diese Weise zu verwenden. Normalerweise schreibe ich es hart ein. Kann ich auf irgendeine Weise alle übergeordneten Kategorien und Seiten anzeigen, während leere untergeordnete Kategorien herausgefiltert werden?

2
Annie

Ich würde das etwas anders angehen. Verwenden Sie weiterhin den wp_get_nav_menu_items-Filter, aber zunächst erstelle ich ein Array mit den IDs aller leeren Begriffe. Dann vergleiche ich jeden $items mit diesem, um einen möglichen Ausschluss zu erreichen:

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;
}

Sie können dies natürlich weiter einschränken, sodass nur die WooCommerce-Produktkategorien betroffen sind, wenn dies erforderlich ist.

2
karpstrucking