对于Woocommerce中的一些自定义功能,我需要通过编程将订单项目和所有元数据从一个订单复制到另一个订单。源订单的类型为WC_Order
而目标订单类型为WC_Subscription
它扩展了WC_Order
是自定义订单类型。
我尝试了以下函数,但它不起作用。虽然更新了与源订单匹配的订单总数,但未添加订单中的项目。
function wc_copy_order_items( &$from_order, &$to_order ) {
if ( ! is_a( $from_order, \'WC_Abstract_Order\' ) || ! is_a( $to_order, \'WC_Abstract_Order\' ) ) {
throw new InvalidArgumentException( _x( \'Invalid data. Orders expected aren\\\'t orders.\', \'In wc_copy_order_items error message. Refers to origin and target order objects.\', \'woocommerce-subscriptions\' ) );
}
$from_order_all_items = $from_order->get_items( array( \'line_item\', \'fee\', \'shipping\' ) );
foreach( $from_order_all_items as $item ) {
$to_order->add_item( $item );
}
$to_order->save();
}
我还尝试了woocommerce管理功能
wc_save_order_items
通过钩住
woocommerce_process_shop_order_meta
虽然从管理员处保存源订单,但这也只会更新目标订单的总数,而不会添加项目。
wc_save_order_items( $source_order_id, $_POST );
基本上,我想将所有数据(包括所有元数据和自定义字段)从源订单复制到目标订单。我设法通过某种方式复制了其他元数据,但我无法正确地使用项目元数据复制订单项目。
请帮助我找出上述功能不起作用的原因,并指导我在两个订单之间复制订单项目的解决方案。
SO网友:Scotty G
只需更改$item_id
到$to_order_item_id
你甚至不必触摸order_item_meta
因为它仍然与$item_id
. 所以你的foreach
从上面看是。。。
foreach($order->get_items() as $item_id=>$item) {
wc_update_order_item($item_id, array(\'order_id\'=>$to_order_item_id));
}
然后,您甚至可以使用。。。
$original_order = new WC_Order($original_order_id);
$original_order->calculate_totals();
$order = new WC_Order($to_order_item_id);
$order->calculate_totals();
我还发现有时候woocommerce不会让你改变
order item
所以我最后做了与上面相同的事情,但
straight to the database
改为更新。。。
global $wpdb;
$table = \'wp_woocommerce_order_items\';
$data = array(\'order_id\'=>$to_order_item_id);
foreach($order->get_items() as $item_id=>$item) {
$where = array(\'order_item_id\'=>$item_id);
$updated = $wpdb->update($table, $data, $where);
if($updated === false) {
echo \'sorry dawg, there was an error\';
}
else {
echo \'you got the soup!\';
}
}
SO网友:Bjorn
好的,你需要这个来定制WOO功能。
但是WC_Subscription
来自WOO订阅插件。
复制订单感觉不对,难道你不能将其连接到某个地方,并在需要时从原始订单收集数据吗?
我能看到你错过了什么。
当你这样做的时候$order->get_items()
, 它按该顺序收集所有产品,但不包括所有(产品)项元数据。
为此,您必须添加以下内容:
foreach ( $order->get_items() as $item_id => $item ) {
// get item_meta
$from_order_item_meta_data = wc_get_order_item_meta( $item_id, \'_set_correct_meta_key_here\', true );
// save item meta data
wc_update_order_item_meta($to_order_item_id, \'_set_correct_meta_key_here\', $from_order_item_meta_data);
}
您不能在函数中直接使用它,上面的示例只是向您展示这些方法
wc_get_order_item_meta()
&;
wc_update_order_item_meta()
;
你好,比约恩