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
相关产品推荐
相关产品推荐

