最准确、最有效、最轻量级的解决方案 (适用于 WooCommerce 3 及更高版本)-2019
该过滤器挂钩位于:
-
WC_Order
Class inside payment_complete() method https://docs.woocommerce.com/wc-apidocs/source-class-WC_Order.html#122这是所有付款方式均使用 when 需要付款在结账时。
-
WC_Order_Data_Store_CPT
Class inside update() method https://docs.woocommerce.com/wc-apidocs/source-class-WC_Order_Data_Store_CPT.html#157.
如您所见,默认情况下允许的已付款订单状态分别是“正在处理”和“已完成”。
说明:
-
轻巧有效:
因为是过滤钩,woocommerce_payment_complete_order_status
仅在需要在线支付时触发 (不适用于“支票”、“bacs”或“cod”付款方式)。这里我们只需更改允许的已付款订单状态.
因此无需为支付网关或其他任何内容添加条件。
-
Accurate (避免多次通知):
这是唯一的方法避免同时发送 2 个不同的客户通知:
• 一项用于“处理”订单状态
• 一个表示“已完成”订单状态。
因此,客户只会收到一次关于“已完成”订单状态的通知。
使用下面的代码,只会更改已付款订单状态 (由支付网关为已付款订单设置)至“完成”:
add_filter( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
return 'completed';
}
代码位于活动子主题(或活动主题)的 function.php 文件中。
Related: WooCommerce:根据运输方式自动完成付款订单 https://stackoverflow.com/questions/48303688/woocommerce-autocomplete-paid-orders-based-on-shipping-method/48306674#48306674
2018 - 改进版本 (适用于 WooCommerce 3 及更高版本)
基于Woocommerce官方hook,我找到了这个问题的解决方案*(适用于WC 3+)。
在 Woocommerce 中,除了以下所有其他支付网关bacs
(电汇), cheque
and cod
(货到付款), 已付款订单状态为“处理中”和“已完成”.
因此,我的目标是“处理”所有支付网关(如 Paypal 或信用卡支付)的订单状态,更新订单状态以完成。
代码:
add_action( 'woocommerce_thankyou', 'wc_auto_complete_paid_order', 20, 1 );
function wc_auto_complete_paid_order( $order_id ) {
if ( ! $order_id )
return;
// Get an instance of the WC_Product object
$order = wc_get_order( $order_id );
// No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {
return;
}
// Autocomplete all others payment methods
else {
$order->update_status( 'completed' );
}
}
代码位于活动子主题(或活动主题)的 function.php 文件中。
原答案 (适用于所有 woocommerce 版本):
代码:
/**
* AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
*/
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
if ( ! $order_id )
return;
$order = wc_get_order( $order_id );
// No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
if ( ( 'bacs' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cod' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cheque' == get_post_meta($order_id, '_payment_method', true) ) ) {
return;
}
// For paid Orders with all others payment methods (with paid status "processing")
elseif( $order->get_status() === 'processing' ) {
$order->update_status( 'completed' );
}
}
代码位于活动子主题(或活动主题)的 function.php 文件中。
在这篇文章的帮助下:如何通过 ID 检查 WooCommerce 订单的付款方式? https://stackoverflow.com/questions/26011837/how-to-check-payment-method-on-a-woocommerce-order-by-id
有了这个 :get_post_meta( $order_id, '_payment_method', true );
from 赫尔加特维克 https://stackoverflow.com/users/383847/helgatheviking
“银行电汇”(bacs)、“货到付款”(cod) 和“支票”(支票) 付款方式将被忽略并保持其原始订单状态。
更新了代码以兼容 WC 3.0+ (2017-06-10)