WooCommerce中为特定用户角色显示促销价的实现咨询
针对特定用户组显示折扣价的最简实现方案
问题背景
运营在线商店时,已创建biblioteka用户角色及对应客户,通过以下代码实现了购物车端40%折扣:
/* discount biblioteka */ add_action( 'woocommerce_cart_calculate_fees', 'discount_based_on_user_role', 20, 1 ); function discount_based_on_user_role( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Exit // only for 'biblioteka' role if ( ! current_user_can('biblioteka') ) return; // Exit // Kortings percentage $percentage = 40; $discount = $cart->get_subtotal() * $percentage / 100; // Calculation // Applying discount $cart->add_fee( sprintf( __("biblioteka discount (%s)", "woocommerce"), $percentage . '%'), - $discount, true ); }
但尝试添加自定义价格代码时网站崩溃,需求是让biblioteka用户组同时看到商品常规价和40%折扣后的促销价。
问题原因
你之前的代码直接修改了商品的基础price值,打乱了WooCommerce的价格逻辑链,导致系统冲突。正确做法是利用WooCommerce原生的销售价机制,既保留原价,又为目标用户显示专属折扣价。
解决方案
替换出错的代码,使用以下代码即可实现需求:
/* 为biblioteka用户组显示专属折扣销售价 */ add_filter('woocommerce_product_get_sale_price', 'custom_sale_price_for_biblioteka', 10, 2); add_filter('woocommerce_product_variation_get_sale_price', 'custom_sale_price_for_biblioteka', 10, 2); add_filter('woocommerce_product_get_price', 'custom_display_price_for_biblioteka', 10, 2); add_filter('woocommerce_product_variation_get_price', 'custom_display_price_for_biblioteka', 10, 2); function custom_sale_price_for_biblioteka( $sale_price, $product ) { if ( current_user_can('biblioteka') ) { $regular_price = (float)$product->get_regular_price(); return $regular_price * 0.6; // 40%折扣后为原价的60% } return $sale_price; } function custom_display_price_for_biblioteka( $price, $product ) { if ( current_user_can('biblioteka') ) { return $product->get_sale_price(); } return $price; }
代码说明
- 销售价生成:通过
woocommerce_product_get_sale_price钩子,为biblioteka用户计算专属销售价(原价×0.6),不影响其他用户的价格设置 - 价格显示控制:通过
woocommerce_product_get_price钩子,让目标用户看到的显示价格为生成的专属销售价 - 原生样式支持:WooCommerce会自动套用「原价划掉+促销价高亮」的标准样式,无需额外修改前端代码
注意事项
- 确保使用的WordPress主题兼容WooCommerce的标准价格模板,否则可能无法正确显示原价与促销价的对比效果
- 代码同时支持简单商品和可变商品,无需额外添加钩子
内容的提问来源于stack exchange,提问作者Patryk Banach
相关产品推荐
相关产品推荐

