WooCommerce payment_complete钩子无法创建优惠券问题求助
问题排查与解决方案
核心问题:未定义的$user变量
你的代码中直接使用了$user->user_email,但在woocommerce_payment_complete钩子的回调函数里,并没有初始化$user变量——这会触发PHP错误,导致代码执行中断,自然无法完成优惠券创建。
修复步骤
从订单获取用户对象
先通过传入的$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(); }添加错误捕获(可选但推荐)
为排查其他潜在问题,可添加异常捕获,将错误信息写入日志:try { $referral_coupon->save(); } catch (Exception $e) { error_log('优惠券创建失败: ' . $e->getMessage()); }确保优惠券代码唯一
虽然代码生成重复码的概率极低,但仍需避免冲突:$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 );验证钩子执行时机
部分异步支付网关(如PayPal标准)不会触发woocommerce_payment_complete,可改用订单完成状态钩子:add_action('woocommerce_order_status_completed', 'when_payment_complete');
内容的提问来源于stack exchange,提问作者AlainF
相关产品推荐
相关产品推荐

