Woocommerce:如何为B2B用户隐藏无指定元值产品的分类?
高效隐藏WooCommerce B2B用户的空分类方案
核心问题分析
默认情况下,WooCommerce分类的产品计数逻辑不会考虑你通过woocommerce_product_query_meta_query添加的B2B产品过滤规则,导致分类组件仍会显示“对B2B用户无有效产品”的分类。直接循环查询每个分类的产品数会引发N+1性能问题,因此需要通过修改底层查询逻辑来解决。
解决方案:修改分类计数查询逻辑
通过WooCommerce专属过滤器woocommerce_get_term_product_count_query,直接调整分类产品数的统计规则,让它只计算带有_eda_display_in_b2b=yes元值的已发布产品,同时确保一次性完成统计,避免性能损耗。
代码实现(基础版:仅统计分类直接关联的B2B产品)
function b2b_adjust_product_category_count_query( $query, $taxonomy, $args ) { // 仅在前台、B2B用户访问产品分类时生效 if ( is_admin() || ! is_user_logged_in() || ! is_b2b_user() || $taxonomy !== 'product_cat' ) { return $query; } global $wpdb; // 关联postmeta表,筛选符合B2B条件的产品 $query = " SELECT COUNT(DISTINCT tr.object_id) AS count FROM {$wpdb->term_relationships} tr JOIN {$wpdb->posts} p ON tr.object_id = p.ID JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE tr.term_taxonomy_id = %d AND p.post_type = 'product' AND p.post_status = 'publish' AND pm.meta_key = '_eda_display_in_b2b' AND pm.meta_value = 'yes' "; return $query; } add_filter( 'woocommerce_get_term_product_count_query', 'b2b_adjust_product_category_count_query', 10, 3 );
代码实现(进阶版:包含子分类的B2B产品统计)
如果需要分类自身或子分类下有B2B产品就显示,可修改查询逻辑包含子分类:
function b2b_adjust_product_category_count_query( $query, $taxonomy, $args ) { if ( is_admin() || ! is_user_logged_in() || ! is_b2b_user() || $taxonomy !== 'product_cat' ) { return $query; } global $wpdb; // 获取当前分类及其所有子分类的ID $term_id = absint( $args['term_id'] ); $child_term_ids = get_term_children( $term_id, 'product_cat' ); $all_term_ids = array_merge( array( $term_id ), $child_term_ids ); $all_term_ids_str = implode( ',', array_map( 'absint', $all_term_ids ) ); // 统计当前分类及子分类下的B2B产品数 $query = " SELECT COUNT(DISTINCT tr.object_id) AS count FROM {$wpdb->term_relationships} tr JOIN {$wpdb->posts} p ON tr.object_id = p.ID JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE tr.term_taxonomy_id IN ($all_term_ids_str) AND p.post_type = 'product' AND p.post_status = 'publish' AND pm.meta_key = '_eda_display_in_b2b' AND pm.meta_value = 'yes' "; return $query; } add_filter( 'woocommerce_get_term_product_count_query', 'b2b_adjust_product_category_count_query', 10, 3 );
配合隐藏空分类设置
完成上述代码后,确保你的产品分类组件开启了隐藏空分类选项:
- 若使用WordPress区块编辑器:添加「产品分类」区块,在设置中勾选「隐藏空分类」
- 若使用传统小部件:在「外观→小部件」中找到「产品分类」小部件,勾选「隐藏空分类」
如果组件无此选项,可添加以下代码强制过滤计数为0的分类:
function b2b_hide_empty_product_categories( $terms, $taxonomies, $args ) { if ( is_admin() || ! is_user_logged_in() || ! is_b2b_user() || ! in_array( 'product_cat', $taxonomies ) ) { return $terms; } // 过滤掉产品计数为0的分类 $terms = array_filter( $terms, function( $term ) { return $term->count > 0; } ); return $terms; } add_filter( 'get_terms', 'b2b_hide_empty_product_categories', 10, 3 );
性能说明
该方案通过修改底层SQL查询,一次性完成所有分类的B2B产品数统计,避免了循环查询每个分类的低效操作,即使产品和分类数量较多,也能保持良好性能。
内容的提问来源于stack exchange,提问作者Eduard Bakeš
相关产品推荐
相关产品推荐

