在订单之间复制包含元数据的订单项目-WooCommerce

时间:2018-06-08 作者:rmalviya

对于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 );
基本上,我想将所有数据(包括所有元数据和自定义字段)从源订单复制到目标订单。我设法通过某种方式复制了其他元数据,但我无法正确地使用项目元数据复制订单项目。

请帮助我找出上述功能不起作用的原因,并指导我在两个订单之间复制订单项目的解决方案。

2 个回复
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();

你好,比约恩

结束

相关推荐

前端AJAX的问题,在访问wp-admin/admin-ajax.php时获得302重定向

我想对前端登录用户使用wp-ajax,但显示发现的302错误并调用主页。它对于管理员用户和未登录用户都可以正常工作。以下是网络日志截图:我使用了以下两种ajax功能:add_action(\'wp_ajax_add_sale\', \'add_sale\'); add_action(\'wp_ajax_nopriv_add_sale\', \'add_sale\'); add_sale() 以下内容:<?php function add_sale() { di