php 优惠券是永远不会创建WooCommerce支付_完成挂钩

vaqhlq81  于 2023-11-16  发布在  PHP
关注(0)|答案(1)|浏览(104)

我目前在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脚本中,并且工作得很好。
我不知道为什么优惠券从来没有被创造出来

nr9pn0ug

nr9pn0ug1#

在你的代码中,$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文件中(或者插件中)。它应该可以工作。

相关问题