最准确、有效和轻量级的解决方案 (适用于WooCommerce 3及以上版本) - 2019年
此过滤器挂钩位于:
如您所见,默认情况下允许的已付款订单状态为"processing"和"completed"。
解释:
1. 轻巧而有效:
由于它是一个过滤器钩子,当需要在线支付时,woocommerce_payment_complete_order_status 只会被触发(不适用于"cheque"、"bacs"或"cod"支付方式)。在这里,我们只是改变了允许的已支付订单状态。
因此,不需要为支付网关或其他任何内容添加条件。
2. 准确(避免多次通知):
这是唯一的方法,可以避免同时发送2个不同的客户通知:
- 一个是"processing"订单状态的通知
- 另一个是"completed"订单状态的通知。
因此,客户只会在"completed"订单状态下收到一次通知。
使用下面的代码,只会将已支付订单的状态(由支付网关设置的)更改为"completed":
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文件中。
相关:{{link1:WooCommerce:根据运输方式自动完成付费订单}}。
2018 - 改进版本 (适用于WooCommerce 3及以上版本)
基于WooCommerce官方钩子,我找到了一个解决这个问题的方法*(适用于WC 3+版本)。
在WooCommerce中,除了bacs
(银行转账)、cheque
和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;
$order = wc_get_order( $order_id );
if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {
return;
}
else {
$order->update_status( 'completed' );
}
}
代码放在活动子主题(或活动主题)的function.php文件中。
原始答案 (适用于所有 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 );
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;
}
elseif( $order->get_status() === 'processing' ) {
$order->update_status( 'completed' );
}
}
代码放在活动子主题(或活动主题)的function.php文件中。
借助这篇文章的帮助:如何通过订单ID检查WooCommerce订单的付款方式?
使用这个代码:get_post_meta( $order_id, '_payment_method', true );
来自helgatheviking
“银行电汇”(bacs),“货到付款”(cod)和“支票”(cheque)付款方式将被忽略,并保持其原始订单状态。
更新了与WC 3.0+(2017-06-10)兼容的代码