WooCommerce自提模式下排除优惠券计算及提示功能实现技术咨询
解决方案:选择 Local Pickup 时禁用优惠券并显示提示
我来帮你搞定这两个需求,下面是修改后的完整代码和详细说明:
1. 实现优惠券禁用逻辑
我们需要通过两个核心钩子来完成:
- 阻止新优惠券被应用:利用
woocommerce_coupon_is_valid钩子,检测到用户选择自提时,直接让所有优惠券失效。 - 移除已应用的优惠券:在购物车计算费用的流程中,检查到自提方式时,自动清空已经添加的优惠券。
2. 添加优惠券不可用提示
使用 WooCommerce 内置的 wc_add_notice 函数,在购物车和结账页面顶部显示醒目的提示,告知用户自提场景下无法使用优惠券。
完整代码
/** * Discount for Local Pickup */ add_action( 'woocommerce_cart_calculate_fees', 'custom_discount_for_pickup_shipping_method', 10, 1 ); function custom_discount_for_pickup_shipping_method( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; $percentage = 15; // Discount percentage $chosen_shipping_method_id = WC()->session->get( 'chosen_shipping_methods' )[0]; $is_local_pickup = strpos( $chosen_shipping_method_id, 'local_pickup' ) !== false; // 选择自提时,移除所有已应用的优惠券 if ( $is_local_pickup && ! empty( $cart->get_applied_coupons() ) ) { foreach ( $cart->get_applied_coupons() as $coupon_code ) { $cart->remove_coupon( $coupon_code ); } } // 保留原有的自提折扣逻辑 if ( $is_local_pickup ) { $new_subtotal = 0; foreach ( $cart->get_cart() as $cart_item ) { $product = wc_get_product( $cart_item['product_id'] ); if ( ! $product->is_on_sale() ) { $line_subtotal = $cart_item['line_subtotal']; $new_subtotal += $line_subtotal; } } $discount = $new_subtotal * $percentage / 100; $cart->add_fee( __('Discount') . ' (' . $percentage . '%)', -$discount ); } } /** * 阻止优惠券在自提时被应用 */ add_filter( 'woocommerce_coupon_is_valid', 'disable_coupons_for_local_pickup', 10, 2 ); function disable_coupons_for_local_pickup( $is_valid, $coupon ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return $is_valid; $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' ); if ( ! empty( $chosen_shipping_methods ) ) { $chosen_shipping_method_id = $chosen_shipping_methods[0]; if ( strpos( $chosen_shipping_method_id, 'local_pickup' ) !== false ) { $is_valid = false; } } return $is_valid; } /** * 在购物车和结账页面显示优惠券不可用提示 */ add_action( 'woocommerce_before_cart', 'show_coupon_disabled_notice_for_pickup' ); add_action( 'woocommerce_before_checkout_form', 'show_coupon_disabled_notice_for_pickup' ); function show_coupon_disabled_notice_for_pickup() { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' ); if ( ! empty( $chosen_shipping_methods ) ) { $chosen_shipping_method_id = $chosen_shipping_methods[0]; if ( strpos( $chosen_shipping_method_id, 'local_pickup' ) !== false ) { wc_add_notice( __('选择自提时无法使用优惠券,请知悉。'), 'error' ); } } }
代码细节说明
- 优惠券禁用:
- 在原有折扣函数中新增了优惠券移除逻辑,确保用户切换到自提方式时,之前添加的优惠券会被自动清除。
- 新增的过滤函数直接拦截优惠券验证流程,自提场景下所有优惠券都会被判定为无效,用户无法提交优惠券代码。
- 提示通知:
- 通过两个页面钩子,在购物车和结账页面的最上方显示错误提示,用户进入页面或切换配送方式时会即时看到规则。
你可以把这段代码替换原有自提折扣代码,或者添加到主题的 functions.php 文件中,也可以使用自定义代码插件来加载。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

