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

WooCommerce payment_complete钩子无法创建优惠券问题求助

问题排查与解决方案

核心问题:未定义的$user变量

你的代码中直接使用了$user->user_email,但在woocommerce_payment_complete钩子的回调函数里,并没有初始化$user变量——这会触发PHP错误,导致代码执行中断,自然无法完成优惠券创建。

修复步骤

  1. 从订单获取用户对象
    先通过传入的$order_id获取订单对象,再从订单中提取用户信息:

    add_action('woocommerce_payment_complete', 'when_payment_complete'); 
    function when_payment_complete( $order_id ) {
        // 获取订单对象,验证有效性
        $order = wc_get_order( $order_id );
        if ( !$order ) return;
    
        // 获取订单关联的用户对象
        $user_id = $order->get_user_id();
        $user = get_user_by('id', $user_id);
        if ( !$user ) return; // 访客下单无用户时终止执行
    
        $referral_coupon = new WC_Coupon();
        
        $bytes = random_bytes(8);
        $encoded = base64_encode($bytes);
        $stripped = str_replace(['=', '+', '/'], '', $encoded);
        $stripped = strtoupper($stripped);
        $prefix = strtoupper(substr(md5($user->user_email), 0, 3));
        
        $referral_coupon->set_code( 'CHILO-REF-' . $prefix . $stripped );
        $referral_coupon->set_description( 'TEST REFERRAL COUPON' );
        $referral_coupon->set_discount_type( 'fixed_cart' );
        $referral_coupon->set_amount( 50 );
        $referral_coupon->set_status( "publish" );
        $referral_coupon->set_individual_use(false);
        $referral_coupon->set_usage_limit( 0 );
        $referral_coupon->save();
    }
    
  2. 添加错误捕获(可选但推荐)
    为排查其他潜在问题,可添加异常捕获,将错误信息写入日志:

    try {
        $referral_coupon->save();
    } catch (Exception $e) {
        error_log('优惠券创建失败: ' . $e->getMessage());
    }
    
  3. 确保优惠券代码唯一
    虽然代码生成重复码的概率极低,但仍需避免冲突:

    $coupon_code = 'CHILO-REF-' . $prefix . $stripped;
    // 检查码是否已存在,存在则重新生成
    while ( wc_get_coupon_id_by_code( $coupon_code ) ) {
        $bytes = random_bytes(8);
        $encoded = base64_encode($bytes);
        $stripped = str_replace(['=', '+', '/'], '', $encoded);
        $stripped = strtoupper($stripped);
        $coupon_code = 'CHILO-REF-' . $prefix . $stripped;
    }
    $referral_coupon->set_code( $coupon_code );
    
  4. 验证钩子执行时机
    部分异步支付网关(如PayPal标准)不会触发woocommerce_payment_complete,可改用订单完成状态钩子:

    add_action('woocommerce_order_status_completed', 'when_payment_complete'); 
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:30:57