以编程方式创建 WooCommerce 订单时设置外部订单 ID [英] Set an external order ID when creating programmatically a WooCommerce order

查看:64
本文介绍了以编程方式创建 WooCommerce 订单时设置外部订单 ID的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

但是,我很想知道在通过脚本创建我的 WC 订单时是否可以定义 order_id(或者是 post_id?).我在我的商店上运行此代码,该代码目前从在线市场将订单导入 Woocommerce,其中订单已经有订单号,我很想通过此 hack 删除交叉引用,并将现有订单号传递给厕所.

这是我所拥有的一个粗略的想法;

$insert_marketplace_order_id = 1234567890;$order = wc_create_order();$order->set_order_id($insert_marketplace_order_id);$order->set_date_created($date_here);$订单->等等等等$order->save();

我显然已经四处搜索,不幸的是,一个插件的存在 - Google 似乎只知道它 - 没有帮助.

虽然我希望 'set_order_id' 可以解决问题,但也许我放置它的位置有问题.还有其他想法吗?

解决方案

在 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

这篇关于以编程方式创建 WooCommerce 订单时设置外部订单 ID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆