You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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š

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:50:28