我目前在 payment_complete 挂钩中创建优惠券时遇到一些问题。
add_action('woocommerce_payment_complete', 'when_payment_complete');
function when_payment_complete( $order_id ) {
$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();
}
在 WordPress 脚本中使用相同的代码块并且工作得非常好。
我不知道优惠券永远不会被创建
在您的代码中,未定义
$user
,并且 $user->user_email
可以替换为订单中的帐单电子邮件。所以也许可以尝试:
add_action('woocommerce_payment_complete', 'create_referral_coupon_on_payment_complete');
function create_referral_coupon_on_payment_complete( $order_id ) {
// Get an instance of the WC_Order Object
$order = wc_get_order( $order_id );
// Generate coupon code
$coupon_code = 'CHILO-REF-';
$coupon_code .= strtoupper(str_replace(['=', '+', '/'], '', base64_encode(random_bytes(8))));
$coupon_code .= strtoupper(substr(md5($order->get_billing_email()), 0, 3));
// Get a virgin instance of the WC_Coupon object
$referral_coupon = new WC_Coupon();
$referral_coupon->set_code( $coupon_code );
$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();
代码位于子主题的functions.php 文件中(或插件中)。它可以工作。
如果它不起作用,您可以做的是使用
woocommerce_payment_complete
挂钩的替代方案,将目标改为已付款订单状态,并在创建优惠券时标记订单(避免创建多个优惠券):
add_action('woocommerce_order_status_completed', 'create_referral_coupon_on_paid_order', 10, 2);
add_action('woocommerce_order_status_processing', 'create_referral_coupon_on_paid_order', 10, 2);
function create_referral_coupon_on_paid_order( $order_id, $order ) {
if( ! $order->get_meta('referral_coupon_created') ) {
// Generate coupon code
$coupon_code = 'CHILO-REF-';
$coupon_code .= strtoupper(str_replace(['=', '+', '/'], '', base64_encode(random_bytes(8))));
$coupon_code .= strtoupper(substr(md5($order->get_billing_email()), 0, 3));
// Get a virgin instance of the WC_Coupon object
$referral_coupon = new WC_Coupon();
$referral_coupon->set_code( $coupon_code );
$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();
// Flag order
$order->add_meta_data('referral_coupon_created', 'yes', true);
$order->save();
}
}
代码位于子主题的functions.php 文件中(或插件中)。应该可以。