以编程方式创建的WooCommerce订单不对新用户征税

问题描述

我使用Gravity表单以编程方式创建WooCommerce订单。

如果已经存在添加到表单的电子邮件,它将从用户帐户中收取运费和帐单。这可以正常工作,并且可以正确添加增值税。

对于未登录的用户,他们将姓名,电子邮件,电话和国家/地区添加到表单中,并自动创建该用户。创建订单,并添加用户。但是在这种情况下,不会添加AT,我必须手动重新计算添加VAT的顺序。

当以编程方式创建用户时,如何确保添加了增值税?

代码:

add_action( 'gform_after_submission_16','post_to_third_party',10,2 );
function post_to_third_party( $entry,$form ) {
    global $woocommerce;
    var_dump($entry);

   
    $product_id = rgar( $entry,'21' );
 

    $address = array(
      'first_name' => rgar( $entry,'20.3' ),'last_name'  => rgar( $entry,'20.6' ),'email'      => rgar( $entry,'10' ),'phone'      => rgar( $entry,'16' ),'address_1'  => rgar( $entry,'24.1' ),'address_2'  => rgar( $entry,'24.2' ),'city'       => rgar( $entry,'24.3' ),'state'      => rgar( $entry,'24.4' ),'postcode'   => rgar( $entry,'24.5' ),'country'    => rgar( $entry,'24.6' ),);

    
    $order = wc_create_order();
    $order->add_product( wc_get_product($product_id),1); 
    $order->set_address( $address,'billing' );  
    $country  = rgar( $entry,'24.6' );
    $username = rgar( $entry,'20.3' ); 
    $user_email = rgar( $entry,'10' );   
    
    $user_id = username_exists( $username );
    if ( !$user_id and email_exists($user_email) == false ) {
    $random_password = wp_generate_password( $length=12,$include_standard_special_chars=false );
    $user_id = wp_create_user( $username,$random_password,$user_email );    
    } else {
    $random_password = __('User already exists.  Password inherited.'); 
    $user = get_user_by( 'ID',$user_id );
    $firstname = get_user_meta( $user_id,'billing_first_name',true );
    $lastname = get_user_meta( $user_id,'billing_last_name',true );
    $address_1 = get_user_meta( $user_id,'billing_address_1',true );
    $address_2 = get_user_meta( $user_id,'billing_address_2',true );
    $city      = get_user_meta( $user_id,'billing_city',true );
    $postcode  = get_user_meta( $user_id,'billing_postcode',true );
    $country   = get_user_meta( $user_id,'billing_country',true );
    $state     = get_user_meta( $user_id,'billing_state',true );
    
    $firstname_ship = get_user_meta( $user_id,'shipping_first_name',true );
    $lastname_ship = get_user_meta( $user_id,'shipping_last_name',true );
    $address_1_ship = get_user_meta( $user_id,'shipping_address_1',true );
    $address_2_ship = get_user_meta( $user_id,'shipping_address_2',true );
    $city__ship  = get_user_meta( $user_id,'shipping_city',true );
    $postcode_ship  = get_user_meta( $user_id,'shipping_postcode',true );
    $country_ship   = get_user_meta( $user_id,'shipping_country',true );
    $state_ship     = get_user_meta( $user_id,'shipping_state',true );

    $address2         = array(
        'first_name' => $firstname,'last_name'  => $lastname,'address_1'  => $address_1,'address_2'  => $address_2,'city'       => $city,'state'      => $state,'postcode'   => $postcode,'country'    => $country,);
        $address3         = array(
        'first_name' => $firstname_ship,'last_name'  => $lastname_ship,'address_1'  => $address_1_ship,'address_2'  => $address_2_ship,'city'       => $city_ship,'state'      => $state_ship,'postcode'   => $postcode_ship,'country'    => $country_ship,);
    
    $order->set_address( $address2,'billing' );
    $order->set_address( $address3,'shipping' );
       
    }
    $order->set_customer_id( $user_id );
    $note = rgar( $entry,'5' ); ;
    $order->add_order_note( $note );
    $order->set_customer_note( $note );
    $emails = WC()->mailer()->get_emails();
    $emails['WC_Email_Customer_New_Account']->trigger( $user_id,true );
    $order->calculate_totals();   
    $order->update_status('autoquote',TRUE);  
    $order->save();

}

编辑:

似乎新用户创建不正确,他们缺少姓名,电话和国家/地区。我加了

wp_update_user([
    'ID' => $user_id,'first_name' => rgar( $entry,'country'  => rgar( $entry,'24.6' )
    ]); 

$user_id = wp_create_user( $username,$user_email ); 之后的

这会为用户设置正确的名称,但仍然缺少电话和国家/地区。

解决方法

已更新

由于遗漏了不同的东西和出现了一些错误,我已经完全重新审视了您的代码。但是我无法真正测试代码,因为这与Gform插件和自定义表单(使用提供的代码和信息无法复制)

相关:
add_action( 'gform_after_submission_16','post_to_third_party',10,2 );
function post_to_third_party( $entry,$form ) {
    // var_dump($entry);

    $order      = wc_create_order();
    $username   = rgar( $entry,'20.3' );
    $user_id    = username_exists( $username );

    // 1. User doesn't exist - Create it - send email - set address and define
    if ( ! $user_id && $user_id == false ) {
        $email      = rgar( $entry,'10' );
        $password   = wp_generate_password( 12,false );
        $first_name = rgar( $entry,'20.3' )
        $last_name  = rgar( $entry,'20.6' )
        
        $user_data = array(
            'user_login' => $username,'user_pass'  => $password,'user_email' => $email,'first_name' => $first_name,'last_name'  => $last_name,'role'       => 'customer',);

        $user_id  = wp_insert_user( $user_data );

        $address  = array(
          'first_name' => $first_name,'email'      => $email,'phone'      => rgar( $entry,'16' ),'address_1'  => rgar( $entry,'24.1' ),'address_2'  => rgar( $entry,'24.2' ),'city'       => rgar( $entry,'24.3' ),'state'      => rgar( $entry,'24.4' ),'postcode'   => rgar( $entry,'24.5' ),'country'    => rgar( $entry,'24.6' ),);

         
        // Update Billing and shipping user data
        foreach( $address as $key => $value ) {
            update_user_meta( $user_id,'billing_' . $key,$value ); // Billing user data

            if( ! in array( $key,array('phone','email') ) ) {
               update_user_meta( $user_id,'shipping_' . $key,$value ); // Shipping user data
            }
        }

        // Send Customer new account notification
        WC()->mailer()->get_emails()['WC_Email_Customer_New_Account']->trigger( $user_id,$password,true );

        $order->set_address( $address,'billing' ); // set billing addresses fields

        unset( $address['phone'],$address['email'] ); // removing email and phone from array (for shipping)

        $order->set_address( $address,'shipping' ); // set shipping addresses fields

        // For calculating taxes on items
        $calculate_taxes_for = array(
            'country'  => $address['country'],'state'    => $address['state'],'postcode' => $address['postcode'],'city'     => $address['city'],);

    }
    // 2. User exist
    else {
        $user = get_user_by( 'ID',$user_id ); // Get the WP_User Object

        $billing_address = array(
            'first_name' => $user->billing_first_name,'last_name'  => $user->billing_last_name,'email'      => $user->billing_email,'phone'      => $user->billing_phone,'address_1'  => $user->billing_address_1,'address_2'  => $user->billing_address_2,'city'       => $user->billing_city,'state'      => $user->billing_postcode,'postcode'   => $user->billing_country,'country'    => $user->billing_state,);

        $shipping_address = array(
            'first_name' => $user->shipping_first_name,'last_name'  => $user->shipping_last_name,'address_1'  => $user->shipping_address_1,'address_2'  => $user->shipping_address_2,'city'       => $user->shipping_city,'state'      => $user->shipping_postcode,'postcode'   => $user->shipping_country,'country'    => $user->shipping_state,);

        $order->set_address( $billing_address,'billing' );
        $order->set_address( $shipping_address,'shipping' );

        // For calculating taxes on items
        $calculate_taxes_for = array(
            'country'  => ! empty($shipping_address['country']) ? $shipping_address['country'] : $billing_address['country'],'state'    => ! empty($shipping_address['state']) ? $shipping_address['state'] : $billing_address['state'],'postcode' => ! empty($shipping_address['postcode']) ? $shipping_address['postcode'] : $billing_address['postcode'],'city'     => ! empty($shipping_address['city']) ? $shipping_address['city'] : $billing_address['city'],);

    }
    $order->set_customer_id( $user_id );

    $order->set_currency( get_woocommerce_currency() );
    $order->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) );

    $product    = wc_get_product( rgar( $entry,'21' ) );
    
    $item_id    = $order->add_product( $product,1 );
    $line_item  = $order->get_item( $item_id,false ); // Get the WC_Order_Item_Product Object instance from the Item Id
    $line_item->calculate_taxes($calculate_taxes_for); // <== Calculating taxes
    $line_item->save(); // Save data to WC_Order_Item_Product Object

    $note = rgar( $entry,'5' );
    $order->add_order_note( $note );
    $order->set_customer_note( $note );

    $order->calculate_totals();
    $order->update_status('autoquote',true); // $order->save() is already included with update_status() method
}

代码进入活动子主题(或活动主题)的functions.php文件中。应该可以。

基于:Create an order programmatically with line items in Woocommerce

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...