克隆WooCommerce订单,加税,订单总额不包括费用

问题描述 投票:0回答:0

我正在使用下面的 PHP 克隆 WooCommerce 订单。我的订单项匹配,我在下方看到一个税收项目(作为费用添加),相同的运费,相同的项目小计。但是,该费用并未添加到订单总额中,该金额恰好太低了。之后,woocommerce_order_itemswoocommerce_order_itemmeta 中的条目看起来相同,请参见附件截图。

原始订单中的税额是这样添加的,使用 woocommerce_checkout_create_order 挂钩:

$order->add_fee('Tax', $tax_total);
$order->save();

下面是克隆订单的脚本。我怎样才能让订单总额更新为正确的金额,包括税(费用)?

    $user_id = $original_order->get_user_id();

    // Duplicate the previous order
    WC()->frontend_includes();
    WC()->session = new WC_Session_Handler();
    WC()->session->init();
    WC()->customer = new WC_Customer( $user_id, true );
    WC()->cart = new WC_Cart();

    $checkout = WC()->checkout();
    WC()->cart->calculate_totals();
    $order_id = $checkout->create_order( [ ] );
    $order = wc_get_order( $order_id );

    $meta = get_post_meta( $original_order_id );

    foreach ( $meta as $key => $value ) {
      switch ( $key ) {
        case '_order_key':
        case 'sap_external_id':
        case 'sap_success':
        case 'um_success':
        case 'psp_reference_number':
        case '_date_paid':
        case '_paid_date':
          // do not clone fields
          break;
        default:
          update_post_meta( $order_id, $key, get_post_meta( $original_order_id, $key, true ) );
        }
    }

    update_post_meta( $order_id, '_order_key', 'wc_' . apply_filters('woocommerce_generate_order_key', uniqid( 'order_' ) ) );

    $original_order_shipping_items = $original_order->get_items( 'shipping' );
    foreach( $original_order_shipping_items as $original_order_shipping_item ) {
      $item_id = wc_add_order_item( $order_id, array(
        'order_item_name' => $original_order_shipping_item['name'],
        'order_item_type' => 'shipping'
      ) );
      if ( $item_id ) {
        wc_add_order_item_meta( $item_id, 'method_id', $original_order_shipping_item['method_id'] );
        wc_add_order_item_meta( $item_id, 'cost', wc_format_decimal( $original_order_shipping_item['cost'] ) );
      }
    }

    $original_order_coupons = $original_order->get_items( 'coupon' );
    foreach( $original_order_coupons as $original_order_coupon ) {
      $item_id = wc_add_order_item( $order_id, array(
        'order_item_name' => $original_order_coupon['name'],
        'order_item_type' => 'coupon'
      ) );
      if ( $item_id ) {
        wc_add_order_item_meta( $item_id, 'discount_amount', $original_order_coupon['discount_amount'] );
      }
    }

    // Loop through line items in previous order
    foreach( $original_order->get_items() as $originalOrderItem ) {
      $itemName = $originalOrderItem['name'];
      //$qty = $originalOrderItem['qty']; // Use Recurly quantity instead
      $lineTotal = $originalOrderItem['line_total'];
      $lineTax = $originalOrderItem['line_tax'];
      $productID = $originalOrderItem['product_id'];
      $item_id = wc_add_order_item( $order_id, array(
          'order_item_name' => $itemName,
          'order_item_type' => 'line_item'
      ) );

      // Get the SKU of the product
      $product = wc_get_product($productID);
      $sku = $product->get_sku();

      // Set cart quantity to value coming from Recurly renewal
      $qty = $line_items[$sku];

      wc_add_order_item_meta( $item_id, '_qty', $qty );
      wc_add_order_item_meta( $item_id, '_tax_class', $originalOrderItem['tax_class'] );
      wc_add_order_item_meta( $item_id, '_product_id', $productID );
      wc_add_order_item_meta( $item_id, '_variation_id', $originalOrderItem['variation_id'] );
      wc_add_order_item_meta( $item_id, '_line_subtotal', wc_format_decimal( $lineTotal ) );
      wc_add_order_item_meta( $item_id, '_line_total', wc_format_decimal( $lineTotal ) );
      wc_add_order_item_meta( $item_id, '_line_tax', wc_format_decimal( $lineTax ) );
      wc_add_order_item_meta( $item_id, '_line_subtotal_tax', wc_format_decimal( $originalOrderItem['line_subtotal_tax'] ) );
    }

    $order->calculate_totals();

    $message = sprintf(
      'This order was duplicated from order %d.', $original_order_id
    );
    $order->add_order_note( $message );

    $order->payment_complete();

    $order->update_status( 'processing' );

php wordpress woocommerce
© www.soinside.com 2019 - 2024. All rights reserved.