以编程方式创建 WooCommerce 订单时设置外部订单 ID

Set an external order ID when creating programmatically a WooCommerce order

我一直在使用一些有据可查的代码以编程方式创建 Woocommerce 订单。工作得很好。此处参考:https://quadlayers.com/add-products-woocommerce/

但是我很想知道是否可以在通过脚本创建我的 WC 订单时定义 order_id(或者是 post_id?)。我 运行 我店里的这段代码,目前从一个在线市场将订单导入 Woocommerce,那里的订单已经有一个订单号,我很想通过这个 hack 删除交叉引用,并传递WC 的现有订单号。

这是我所拥有的粗略概念;

$insert_marketplace_order_id = 1234567890;

$order = wc_create_order();
$order->set_order_id($insert_marketplace_order_id);
$order->set_date_created($date_here);
$order-> etc. etc.
$order->save();

我显然已经四处搜索,不幸的是,插件的存在 - 似乎是所有 Google 都知道的 - 没有帮助。

虽然“set_order_id”可以解决问题,但我放置它的位置可能存在问题。还有其他想法吗?

在 WooCommerce 中,订单 ID 是 post ID,因此您无法像您尝试的那样插入外部参考 ID。 WooCommerce 订单是自定义 post 类型,订单 ID(post Id)是根据 post 数据库中使用的最后一个 post Id 生成的 table…

现在您可以使用 the filter hook woocommerce_order_number 设置 订单号 ,将您自己的订单参考号 设置为订单号 ,这不是 WooCommerce 订单 ID (post Id).

因此您的代码将是:

$insert_marketplace_order_id = 1234567890;

$order = new WC_Order();
$order->set_date_created($date_here);

// $order-> etc. etc.

$order->update_meta_data('_order_number', $insert_marketplace_order_id); // <== Here
$order->save();

然后您将添加以下挂钩函数以获取并显示正确的订单号:

add_filter( 'woocommerce_order_number', 'wc_set_order_number', 10, 2 );
function wc_set_order_number( $order_id, $order ) {

    // Get the order number (custom meta data)
    $order_number = $order->get_meta('_order_number'); 

    return empty($order_number) ? $order_id : $order_number;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。

Now when using the WC_Order method get_order_number() WooCommerce will get/display the correct order number.

注意: 因为你不使用任何带有 wc_create_order() function 的参数,所以最好使用 $order = new WC_Order(); 来代替,这会给出一个空的 WC_Order 不使用 save() 方法 2 次的实例对象 (轻得多).

相关: