以编程方式添加普通产品和赠品产品创建 WooCommerce 订单

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

使用下面的代码,我在 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();

但是产品总量没有正常更新。

对于赠品,添加到订单后,我已经将价格设置为零了。

商品小计:这显示正确的价格
订单总额:这显示了错误的计算价格

将商品添加到订单时(其中一些商品是赠品),如何获得正确的计算结果?

php wordpress woocommerce methods orders
1个回答
1
投票

您已接近:在添加您想要作为赠品(免费)提供的产品之前,您需要将产品价格设置为零(不保存产品本身),然后您可以将赠品产品添加到订单中。

此外,它们是您代码中的一些错误,例如

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() 方法中

它将显示正确的金额,而无需重新计算所有子项目的价格。

© www.soinside.com 2019 - 2024. All rights reserved.