在Woocommerce中创建订单时从动态创建的购物车中保存自定义购物车项目数据

时间:2018-12-19 14:21:57

标签: php wordpress woocommerce cart orders

  

重要说明::我没有将functions.php用于购物车的任何功能。我正在使用独立的php文件,它必须保持这种方式。

在Woocommerce中,我创建的购物车使用以下方法动态添加产品:

global $woocommerce;
$cart = $woocommerce->cart;

//set the custom item data
$item_data = array();

 $product_id = '121';

 $item_data = array(
 'plain_data' => 'test data',
 'array_data' => array('URL' => 'URL',  'Signals' => 'SIGNALS')
  );

//Add it to the cart
$cart->add_to_cart($product_id, 1, null, null, $item_data);

然后我使用以下命令从购物车中创建订单:

global $woocommerce;
$cart = $woocommerce->cart;

$order_data = array('payment_method' => 'PayPal');

$checkout = $woocommerce->checkout();
$order_id = $checkout->create_order($order_data);

但是我添加的自定义商品数据未按顺序保存。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

由于您不想使用任何钩子,因此必须在创建订单后设置自定义购物车项目数据。因此,请尝试以下操作:

尝试以下操作:

$product_id = '121';

$item_data = array(
    'plain_data' => 'test data',
    'array_data' => array('URL' => 'URL',  'Signals' => 'SIGNALS')
);

$item_data_keys = array_keys($item_data); // Get array keys


//Add it to the cart
WC()->cart->add_to_cart($product_id, 1, 0, array(), $item_data);

// Create order
$order_id = WC()->checkout->create_order( array('payment_method' => 'PayPal') );

// Get an instance of the WC_Order Object
$order = wc_get_order($order_id);

// Loop through order items
foreach( $order->get_items() as $item ){
    // Loop though custom item data
    foreach( $item_data_keys as $item_data_key ){
        // set custom item data
        $item->update_meta_data( $item_data_key, $item_data[$item_data_key] );
    }
    // Save item data
    $item->save();
}
// Save order
$order->save();

经过测试可以正常工作。

  

注意::一段时间以来,global woocommerceWC()取代了。