进入处理状态时如何自动完成 WooCommerce 订单
已发表: 2019-04-06每个电子商务网站都需要跟踪和管理订单,这对于管理员来说可能是一项艰巨的任务,考虑到一个普通的高流量电子商务网站每天收到的订单数量。 对于 WooCommerce,一旦结帐流程完成,就会创建一个订单(查看下面的 WooCommerce 订单状态流程)。
根据订单在付款到交付链中的位置,它被分配一个状态。 这些状态由 WooCommerce、支付网关和商店所有者/管理员设置和/或更改,具体取决于订单所在的位置。
在我们看一下 WooCommerce 中的订单流程之前,让我们先定义一下 WooCommerce 中的订单状态,以便新手受益。
WooCommerce 中的订单状态是什么?
订单状态是客户下订单的当前状态的表示。 Woocommerce 中的订单状态会随着订单被处理到交付阶段而发生变化,或者在产品/服务出现问题并且店主同意向客户退款的情况下退款。 例如,当客户对某个产品下订单时,会立即设置序列中的下一个订单状态,即“待付款”。 Woocommerce 中默认设置待付款。
现在,让我们看一下流程图以便更好地理解。
Woocommerce 订单状态流程图

如图所示,在成功完成订单付款后,其状态设置为“处理中”,直到店主手动将其更改为“已完成”。 这对店主或管理员来说是一项开销任务,尤其是在销量很高的情况下。 使此过程高效的一种方法是在 WooCommerce 订单进入处理状态时自动完成订单。 让我们看看我们如何使用代码片段来做到这一点。
WooCommerce 中订单状态的完整列表
- 待付款:下订单但未付款时默认出现。
- 失败:表示支付未通过,被拒绝。
- 处理中:这表示付款已通过并由店主收到,现在可以处理以进行运输和交付。
- 已完成:这表示一切顺利,订单现已完成并完成。
- On hold : 这表示订单需要店主确认的状态。
- 已取消:订单状态“已取消”不需要任何进一步的操作。 取消可以在某个时候来自管理员或客户。
- 已退款:订单已退款,无需进一步操作
现在我们更好地了解了订单状态及其功能,让我们看看为什么更新它是个好主意。
根据付款方式自动将 WooCommerce 订单状态设置为已完成
在大多数情况下,您需要在付款成功后执行此操作,并且只有在用户未选择货到付款选项时才可能这样做。 下面的代码,当插入到您的子主题的functions.php 文件中时,将在付款成功时自动将订单状态设置为已完成。 因此,在所有情况下,除非用户选择货到付款选项,否则订单状态将自动更改为已完成。
add_action('woocommerce_order_status_changed', 'ts_auto_complete_by_payment_method'); 函数 ts_auto_complete_by_payment_method($order_id) { 如果(!$order_id){ 返回; } 全球$产品; $order = wc_get_order($order_id); if ($order->data['status'] == 'processing') { $payment_method=$order->get_payment_method(); if ($payment_method!="cod") { $order->update_status('完成'); } } }
在这里,您将使用woocommerce_order_status_changed挂钩在订单状态更改时调用函数。 确认订单是否处于 Processing 状态后,只有当支付方式不是 Cash-on-Delivery 时,订单状态才会变为Completed 。 WooCommerce 有四种默认付款方式,即。 直接银行转账 (bacs)、支票付款 (cheque)、货到付款 (cod) 和 PayPal (paypal)。 根据您指定条件的付款方式,您需要使用适当的ID ,例如“bacs”、“cheque”、“cod”、“paypal”。

自动将 WooCommerce 订单状态设置为虚拟产品的已完成
您希望订单状态自动完成的另一种情况是订单中的一个或多个产品是虚拟产品。 虚拟产品是无形或可下载的产品。 这方面的一个例子是商店会员订阅或向购买订阅的人提供折扣的优惠券。

商店会员订阅可能没有有形的形式,而是有到期日。 诸如软件甚至电子电影票之类的可下载产品也是虚拟产品,因为它们没有离线存在或形式。 对于大多数虚拟产品,从来没有“货到付款”的选项。 付款是当场付款,因此不包括检查使用的付款方式的条件是安全的,而只添加一个条件以检查订单中的所有产品是否都是虚拟产品。
add_action('woocommerce_order_status_changed', 'ts_auto_complete_virtual'); 函数 ts_auto_complete_virtual($order_id) { 如果(!$order_id){ 返回; } 全球$产品; $order = wc_get_order($order_id); if ($order->data['status'] == 'processing') { $virtual_order = null; if ( count( $order->get_items() ) > 0 ) { foreach( $order->get_items() as $item ) { if ('line_item' == $item['type'] ) { $_product = $order->get_product_from_item($item); if ( ! $_product->is_virtual() ) { // 一旦我们找到一个非虚拟产品,就跳出循环 $virtual_order = 假; 休息; } 别的 { $virtual_order = 真; } } } } // 如果都是虚拟产品,则标记为已完成 if ( $virtual_order ) { $order->update_status('完成'); } } }
在这里,我们使用相同的钩子来调用我们的函数ts_auto_complete_virtual 。 在检查订单是否处于处理状态后,您需要查看订单中的每个项目,看看它是否是虚拟产品。
结论
一个典型的 Woocommerce 订单有很多与之相关的项目,例如产品、运费、费用等。这里, line_item是指产品。 只需要一件一件的去取商品,看看是不是虚拟的。 即使有一件商品不是虚拟商品,订单的状态也不会被标记为已完成。
但是,根据您的要求,并使用本文中的第一个代码段,您可以添加更多条件以将订单状态标记为已完成。 例如,如果您希望即使对于非虚拟产品也将订单状态标记为已完成(如果这些产品的付款已完成),那么您可以通过在检查它是否是虚拟的付款方式后添加检查来实现产品。 但是,通过此代码段,仅当订单中的所有产品都是虚拟产品时,订单的状态才会设置为已完成。