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

如何在WooCommerce中自动生成优惠券并应用到购物车,解决重复生成及URL触发问题

解决方案

你的需求完全可以实现,无需浪费额外时间走弯路。

现有代码问题梳理

你当前的代码存在3个核心问题,才会触发重复生成优惠券的情况:

  • 优惠券逻辑绑定的woocommerce_before_calculate_totals钩子会在每次购物车计算总额时触发,刷新页面、添加商品都会触发该钩子
  • 每次触发钩子都会生成全新的随机优惠券码,没有存储已生成/已应用的标识,导致每次都会生成新券
  • 没有增加URL参数判断逻辑,不符合你弃购召回场景下指定触发的需求

修改后完整代码

// 检测优惠券是否存在(使用WooCommerce原生函数,兼容性更好)
function coupon_exists($coupon_code) {
    return wc_get_coupon_id_by_code($coupon_code) ? true : false;
} 

// 生成指定编码的优惠券
function generate_coupon($coupon_code) {
    // 优惠券默认配置,可按需修改
    $date_expires     = date('Y-m-d', strtotime('+1 days')); // 有效期1天
    $discount_type    = 'fixed_cart'; // 折扣类型:fixed_cart=固定购物车金额、percent=百分比折扣、fixed_product=固定商品金额
    $coupon_amount    = '10'; // 折扣金额/比例

    $coupon = new WC_Coupon();
    $coupon->set_code($coupon_code);
    $coupon->set_discount_type($discount_type);
    $coupon->set_amount($coupon_amount );
    $coupon->set_date_expires( $date_expires );
    // 可以在这里额外添加优惠券使用限制,比如限指定邮箱、限指定商品等
    $coupon->save();
    return $coupon_code;
}

// 优惠券应用逻辑
function hwn_add_coupon_to_basket( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;

    // 检测URL参数中是否有coupon-code
    if (!isset($_GET['coupon-code'])) return;
    $coupon_code = sanitize_text_field($_GET['coupon-code']);

    // 从Session中读取已应用的优惠券,避免重复操作
    $applied_coupon = WC()->session->get('abandoned_recovery_coupon');
    if ($applied_coupon && $applied_coupon == $coupon_code) {
        // 已经应用过当前券,直接返回
        return;
    }

    // 优惠券不存在则生成
    if (!coupon_exists($coupon_code)) {
        generate_coupon($coupon_code);
    }        

    // 应用优惠券
    $applied_coupons = $cart->get_applied_coupons();
    if( ! in_array($coupon_code, $applied_coupons)){
        $cart->add_discount( $coupon_code );
        // 存入Session,标记已应用
        WC()->session->set('abandoned_recovery_coupon', $coupon_code);
        wc_print_notices();
    }
}
add_action('woocommerce_before_calculate_totals', 'hwn_add_coupon_to_basket'); 

代码修改说明

  • 仅当用户访问带?coupon-code=xxx参数的链接时才会触发优惠券逻辑,正常用户访问站点不会生成冗余优惠券
  • 新增Session存储已应用的优惠券标识,同一个用户会话内只会应用一次优惠券,刷新页面、添加商品都不会重复生成重复应用
  • 使用WooCommerce原生函数判断优惠券是否存在,比自定义SQL兼容性更好,适配不同版本的WooCommerce
  • 保留了原有的优惠券配置,你可以按需修改有效期、折扣类型、折扣金额等参数

配套使用说明

你在Klaviyo配置召回链接时,只需要给每个用户的召回链接拼接唯一的coupon-code参数即可,比如用用户ID+时间戳拼接成唯一编码,避免不同用户的优惠券冲突。如果需要限制优惠券只能对应弃购用户使用,可以在生成优惠券的逻辑里添加邮箱、用户ID的使用限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:36:06