WooCommerce - 自动隐藏导航栏中的空类别和子类别

WooCommerce - Hide empty categories and subcategories from the navbar automatically

我有以下代码块,它允许任何空类别或子类别存档页面从导航栏中隐藏,但它有两个不同的问题需要我帮助解决。

  1. 代码隐藏了前端和后端的空存档页面,这使得后端编辑菜单变得困难,因为代码需要手动删除,然后在菜单更改后重新添加。
  2. 类别和子类别不会自动添加到网站的菜单部分。我无法激活 'Automatically add new top-level pages to this menu' 部分,因为这是全局的并且不仅仅适用于产品 categories/subcategories.

我目前使用的代码如下:

/* HIDE EMPTY CATEGORIES AND SUBCATEGORIES FROM NAVBAR - TO CORRECTLY EDIT THE MENU AT THE BACK-END, MAKE SURE YOU REMOVE THIS CODE */

function hide_empty_navbar_items ( $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;
}
add_filter( 'wp_get_nav_menu_items', 'hide_empty_navbar_items', 10, 3 );

我设法找到了以下代码,它允许您从网站前端的导航栏中隐藏空类别和子类别级别,同时还允许以管理员身份登录的任何人仍然可以看到完整的菜单结构在后端。

此代码基本上解决了初始问题中遗留代码的问题,并提供了更实用的解决方案。

add_filter( 'wp_get_nav_menu_items', 'nav_remove_empty_category_menu_item',10, 3 );
  function nav_remove_empty_category_menu_item ( $items, $menu, $args ) {
    if ( ! is_admin() ) {
      global $wpdb;
      $nopost = $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, $nopost ) ) ) {
          unset( $items[$key] );
        }
      }
    }
    return $items;
  }

我做了这个,也是为了处理商品库存。如果类别仅包含缺货商品,则不会显示菜单:

/**
Hide empty categories from menu
**/
if(!is_admin()) {
    add_filter( 'wp_get_nav_menu_items', 'nav_remove_empty_category_menu_item', 10, 3 );
}
function nav_remove_empty_category_menu_item ( $items, $menu, $args ) {
    global $wpdb;
    $nopost = $wpdb->get_col( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE count = 0" );
    foreach ( $items as $key => $item ) {
        if ( ( 'taxonomy' == $item->type )   ) {
            $object = get_term($item->object_id, $item->object);
            $args = array(
                'posts_per_page' => -1,
                'product_cat' => $object->slug,
                'post_type' => 'product',
                'orderby' => 'title',
                'meta_query' => array(
                    array(
                        'key' => '_stock_status',
                        'value' => 'instock'
                    )
                )
            );
            $the_query = new WP_Query( $args );
            
            if($the_query->post_count <= 0){
                unset( $items[$key] );
            }
        }
    }
    return $items;
}