我正在使用下面的 PHP 克隆 WooCommerce 订单。我的订单项匹配,我在下方看到一个税收项目(作为费用添加),相同的运费,相同的项目小计。但是,该费用并未添加到订单总额中,该金额恰好太低了。之后,woocommerce_order_items 和 woocommerce_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' );