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

