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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:37:28