WooCommerce每第10单循环应用10%折扣代码问题求助
原代码失效原因
你的代码存在几个直接导致功能无法运行的问题:
- 函数名不匹配:钩子挂载时写的函数名带空格
discount_based_on_10 orders,和实际定义的函数名不一致,会直接触发PHP致命错误,代码完全不执行。 - 核心逻辑缺失:没有获取当前登录用户的历史已完成订单数,直接写死
$total_orders = 10,根本无法对应用户的实际订单情况。 - 语法与变量错误:存在非法变量名
$10、未定义变量$order_number、大括号不匹配、sprintf占位符和传入参数数量不匹配、调用不存在的wc_format_order()函数等多个语法问题。 - 判断逻辑错误:没有做「订单数是10的倍数」的循环判断,也没有排除当前正在结算的订单,会导致折扣触发条件完全错误。
- 兼容性问题:旧的
add_discount()方法在新版WooCommerce中兼容性不佳,建议用官方推荐的优惠券操作方法。
正确实现代码
将以下代码替换原有代码,放到主题functions.php文件或者自定义代码插件中即可。注意你提前创建的优惠券码必须和代码中$coupon_code的值完全一致(大小写、空格都要匹配,建议把优惠券名改成无空格的纯英文格式,比如every_10_discount,减少匹配出错概率),优惠券本身要设置为10%固定百分比折扣,不需要额外设置使用限制。
// 每累计10笔已完成订单,当前订单享受10%折扣,循环生效 add_action('woocommerce_before_calculate_totals', 'discount_based_on_every_10_orders'); function discount_based_on_every_10_orders( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; // 基础配置 $coupon_code = '10 Or More Discount'; // 提前创建好的优惠券码 $order_threshold = 10; // 每多少笔订单触发折扣 // 未登录用户不触发规则,需要游客支持可根据邮箱单独扩展逻辑 if ( ! is_user_logged_in() ) return; $user_id = get_current_user_id(); // 统计当前用户历史已完成订单数(排除当前正在结算的订单) $customer_orders = wc_get_orders( array( 'customer_id' => $user_id, 'status' => array( 'wc-completed' ), // 仅统计已完成订单,需要包含已付款待发货状态可加'wc-processing' 'return' => 'ids', 'limit' => -1, ) ); $completed_order_count = count( $customer_orders ); // 当前订单结算后总订单数为历史数+1,判断是否为10的倍数 $is_qualified = ( ( $completed_order_count + 1 ) % $order_threshold === 0 ); $applied_coupons = $cart->get_applied_coupons(); $coupon_code = sanitize_text_field( $coupon_code ); // 符合条件自动叠加优惠券 if ( $is_qualified && ! in_array( $coupon_code, $applied_coupons ) ) { $cart->apply_coupon( $coupon_code ); wc_clear_notices(); wc_add_notice( sprintf( __("恭喜!您已累计完成%s笔订单,本次订单自动享受10%%折扣!", "woocommerce"), '<strong>' . ( $completed_order_count + 1 ) . '</strong>' ), "success" ); } // 不符合条件自动移除误加的优惠券 elseif ( ! $is_qualified && in_array( $coupon_code, $applied_coupons ) ) { $cart->remove_coupon( $coupon_code ); } }
快速测试方法
不需要修改正式用户数据,按以下步骤验证即可:
- 新建一个测试用户账号,在后台手动给这个账号创建9笔状态为「已完成」的测试订单(订单金额填0即可,不需要真实支付)。
- 用测试用户登录前台,任意加购商品进入结算页,此时应自动触发10%折扣(加上当前订单刚好是第10笔)。
- 再给测试用户手动新增1笔已完成订单,此时累计已完成订单为10笔,再下单不应触发折扣;累计到19笔已完成订单时,再次下单就会触发第20笔的折扣,以此类推验证循环逻辑。
- 如果折扣未触发,优先检查优惠券码是否和代码中完全一致、优惠券是否设置了最低消费/指定商品等不必要的限制。
内容的提问来源于stack exchange,提问作者Web Honey Digital
相关产品推荐
相关产品推荐

