it-swarm-ja.com

メニューで空の子カテゴリを除外

私はWooCommerceで働いていて、空のサブカテゴリを除外しようとしています。私はこのコードを見つけました。それは私のホームページへのリンク、会社概要へのリンクなどを含むすべてのものを「空」にします。

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

そして、これが私のメニューです...

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

私はWordPressのメニューをこのように使うという考えと結婚していません。通常はハードコーディングします。空の子カテゴリを除外しながら、すべての親カテゴリとページを表示する方法はありますか。

2
Annie

私はこれについて少し違ったやり方をするでしょう。まだwp_get_nav_menu_itemsフィルタを使用していますが、最初にすべての空の用語のIDを含む配列を作成します。それでは、除外のために$itemsのそれぞれをこれと比較します。

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

もちろん、必要に応じてWooCommerce商品カテゴリにのみ影響を与えるようにこれをさらに制限することもできます。

2
karpstrucking