使用下面的代码,我在 WooCommerce 中以编程方式创建订单,添加带有价格的产品,并且我尝试为特定产品设置零价格,因为它们是礼物:
$order = wc_create_order(array('customer_id' => $currentUserId));
// Product for add with price
foreach($cartProductInfo as $productIn) {
$order->add_product( get_product($productIn['id']), $productIn['qty'] );
}
// Product for add with 0 price
foreach($data['gift'] as $productIn) {
$order_item_id = $order->add_product( get_product($productIn['productId']), 1 );
if ($order_item_id) {
// Retrieve the order item
$order_item = $order->get_item($order_item_id);
// Set price to zero
$order_item->set_props([
'subtotal' => 0,
'total' => 0,
'subtotal_tax' => 0,
'total_tax' => 0,
]);
// Optionally, add meta to indicate it's a free gift
$order_item->add_meta_data('is_free_gift', true);
$order_item->add_meta_data('offer_type', $productIn['offer_type']);
// Save the order item
$order_item->save();
}
}
// calculate total.
$order->calculate_totals(false);
$order->save();
但是产品总量没有正常更新。
对于赠品,添加到订单后,我已经将价格设置为零了。
商品小计:这显示正确的价格
订单总额:这显示了错误的计算价格
将商品添加到订单时(其中一些商品是赠品),如何获得正确的计算结果?
您已接近:在添加您想要作为赠品(免费)提供的产品之前,您需要将产品价格设置为零(不保存产品本身),然后您可以将赠品产品添加到订单中。
此外,它们是您代码中的一些错误,例如
get_product()
函数现在已经被 wc_get_product()
取代了一段时间。
所以你的代码会略有不同:
// Create an order for specific customer
$order = wc_create_order( array('customer_id' => $currentUserId) );
// Loop through products Ids to be added as order items
foreach($cartProductInfo as $productIn) {
$_product = wc_get_product( $productIn['id'] ); // Get the WC_product object
$order->add_product( $_product, $productIn['qty'] ); // Add the product to the order
}
// Loop through gifted products Ids to be added as order items
foreach($data['gift'] as $productIn ) {
$free_product = wc_get_product( $productIn['id'] ); // Get the WC_product object
$free_product->set_price(0); // Change the product price to zero
// Add the gifted product (with zero price) to the order
if ( $item_id = $order->add_product( $free_product, 1 ) ) {
$item = $order->get_item( $item_id ); // Retrieve the order item
// Add custom metadata to indicate that it's a gift (free)
$item->add_meta_data( 'is_free_gift', true, true );
$item->add_meta_data( 'offer_type', $productIn['offer_type'], true );
$item->save(); // Save order item custom metadata
}
}
// calculate total and save (The save() method is already included)
$order->calculate_totals();
您不需要在最后使用 save() 方法,因为它已经包含在 WC_Abstract_Ordercalculate_totals() 方法中。
它将显示正确的金额,而无需重新计算所有子项目的价格。