且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-11-30 13:17:04

在 WooCommerce 中,订单 ID 是帖子 ID,因此您无法像尝试那样插入外部参考 ID做.WooCommerce 订单是自定义的帖子类型,订单 ID(帖子 ID)是从 wp_posts 数据库表中使用的最后一个帖子 ID 生成的……

现在,您可以使用 过滤钩子woocommerce_order_number,设置自己的订单参考号作为订单号,不是WooCommerce订单 ID (帖子 ID).

所以你的代码将是:

$insert_marketplace_order_id = 1234567890;$order = new WC_Order();$order->set_date_created($date_here);//$order->等等等等$order->update_meta_data('_order_number', $insert_marketplace_order_id);//<== 这里$order->save();

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

add_filter( 'woocommerce_order_number', 'wc_set_order_number', 10, 2 );函数 wc_set_order_number( $order_id, $order ) {//获取订单号(自定义元数据)$order_number = $order->get_meta('_order_number');返回空($order_number)?$order_id : $order_number;}

代码位于活动子主题(或活动主题)的functions.php 文件中.

现在,当使用 WC_Order 方法 get_order_number() 时,WooCommerce 将获取/显示正确的订单号.

注意:因为您没有将任何参数用于 wc_create_order() 函数 ***使用 $order = new WC_Order(); 代替,它给出了一个空的 WC_Order 实例对象,而不使用 save() 方法 2 次 (轻得多).

相关: 基于付款方式的动态自定义订单号

I've been using some well documented code to programatically create Woocommerce orders. Working great. Reference here: https://quadlayers.com/add-products-woocommerce/

However I'd be keen to know if it's possible to define the order_id (or is that the post_id?) whilst creating my WC orders via a script. I run this code on my shop, which currently imports orders into Woocommerce from a marketplace online where orders already have an Order number and I'd be keen to cut out the cross-referencing via this hack, and pass along the existing Order number to WC.

Here's a rough idea of what I have;

$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();

I've obviously searched around, unfortunately the existence of a plugin - which seems to be all Google knows about it - doesn't help.

I would have though 'set_order_id' would do the trick, but perhaps there's an issue with where I'm placing it. Any other ideas?

In WooCommerce, the order Id is the post Id, so you can't insert an external reference Id as you are trying to do. WooCommerce orders are a custom post type and order Id (the post Id) is generated from last post Id used in wp_posts database table…

Now you can set instead an Order number using the filter hook woocommerce_order_number, to set your own order reference number as order number, which is not the WooCommerce Order Id (post Id).

So your code will be:

$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();

Then you will add the following hooked function to be able to get and display the correct order number:

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;
}

Code goes in functions.php file of the active child theme (or active theme).

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

Note: As you don't use any arguments with wc_create_order() function is better to use $order = new WC_Order(); instead, which gives an empty WC_Order instance object without using save() method 2 times (so much lighter).

Related: Dynamic custom order numbers based on payment method