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

WooCommerce基于用户角色的可变产品阶梯价格配置问题

WooCommerce自定义角色可变产品定价修复方案

一、核心问题梳理

当前存在三个明确问题:

  • 登录用户前端无法看到对应角色的可变产品阶梯价格
  • 代码未覆盖全部7个自定义角色的价格关联逻辑
  • 缺少B2B分销角色的产品可售状态判断

二、分步修复实现

1. 补全所有角色的价格关联逻辑

确保ACF字段命名与角色一一对应(如subcription_tier1_price、distributor_tier3_price),并替换原有价格过滤代码,覆盖全部角色:

// 过滤可变产品变体的销售价与常规价
add_filter('woocommerce_variation_prices_price', 'custom_role_variation_price', 10, 3);
add_filter('woocommerce_variation_prices_regular_price', 'custom_role_variation_price', 10, 3);
function custom_role_variation_price($price, $variation, $product) {
    if (!is_user_logged_in()) return $price;

    $user = wp_get_current_user();
    // 映射所有角色与对应ACF价格字段
    $role_price_map = [
        'subcription_tier1' => 'subcription_tier1_price',
        'subcription_tier2' => 'subcription_tier2_price',
        'distributor_tier1' => 'distributor_tier1_price',
        'distributor_tier2' => 'distributor_tier2_price',
        'distributor_tier3' => 'distributor_tier3_price',
        'distributor_tier4' => 'distributor_tier4_price',
        'distributor_tier5' => 'distributor_tier5_price',
    ];

    foreach ($role_price_map as $role => $field_key) {
        if (in_array($role, $user->roles)) {
            $custom_price = get_field($field_key, $variation->get_id());
            if (!empty($custom_price)) return (float)$custom_price;
        }
    }

    return $price;
}

// 清除价格缓存,确保前端实时加载对应角色价格
add_filter('woocommerce_get_variation_prices_hash', 'custom_role_variation_price_hash', 10, 3);
function custom_role_variation_price_hash($hash, $product, $for_display) {
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        $hash[] = implode(',', $user->roles);
    }
    return $hash;
}

2. 添加B2B角色的产品可售判断逻辑

针对B2B分销角色,仅当产品/变体设置了对应角色价格时,才允许购买:

// B2B角色变体可售状态判断
add_filter('woocommerce_variation_is_purchasable', 'b2b_role_variation_purchasable', 10, 2);
// B2B角色父产品可售状态判断
add_filter('woocommerce_is_purchasable', 'b2b_role_product_purchasable', 10, 2);

function b2b_role_variation_purchasable($purchasable, $variation) {
    if (!is_user_logged_in()) return $purchasable;

    $user = wp_get_current_user();
    $b2b_roles = ['distributor_tier1', 'distributor_tier2', 'distributor_tier3', 'distributor_tier4', 'distributor_tier5'];
    
    foreach ($b2b_roles as $role) {
        if (in_array($role, $user->roles)) {
            $custom_price = get_field($role . '_price', $variation->get_id());
            return !empty($custom_price) && $purchasable;
        }
    }

    return $purchasable;
}

function b2b_role_product_purchasable($purchasable, $product) {
    if (!$product->is_type('variable') || !is_user_logged_in()) return $purchasable;

    $user = wp_get_current_user();
    $b2b_roles = ['distributor_tier1', 'distributor_tier2', 'distributor_tier3', 'distributor_tier4', 'distributor_tier5'];
    
    foreach ($b2b_roles as $role) {
        if (in_array($role, $user->roles)) {
            // 检查是否有至少一个变体设置了对应B2B价格
            $has_valid_variation = false;
            foreach ($product->get_available_variations() as $variation_data) {
                $variation = wc_get_product($variation_data['variation_id']);
                if (!empty(get_field($role . '_price', $variation->get_id()))) {
                    $has_valid_variation = true;
                    break;
                }
            }
            return $has_valid_variation && $purchasable;
        }
    }

    return $purchasable;
}

三、前端验证与注意事项

  • 登录对应角色用户后,强制刷新浏览器缓存(Ctrl+F5),避免加载旧价格缓存
  • 确认ACF价格字段绑定到产品变体编辑页,而非父可变产品的编辑页
  • 检查自定义角色权限,确保拥有前端产品访问的基础权限

内容的提问来源于stack exchange,提问作者Henry Hu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:21:29