WooCommerce 更改订单状态 BACS 处理
WooCommerce change order status BACS processing
在 WooCommerce 中,使用 BACS(直接银行转账)下的任何订单都设置为 "on-hold"
。
如何将其自动更改为处理?
我不希望它在 functions.php
中工作
我有以下代码,但它不起作用:
add_filter( 'woocommerce_payment_complete_order_status', 'rfvc_update_order_status', 10, 2 );
function rfvc_update_order_status( $order_status, $order_id ) {
$order = new WC_Order( $order_id );
if ( 'on-hold' == $order_status && 'on-hold' == $order->status ) {
return 'processing';
}
return $order_status;
}
任何帮助都会很棒!
尝试将代码更改为:
function rfvc_update_order_status( $order_status, $order_id ) {
$order = new WC_Order( $order_id );
if ( 'on-hold' == $order_status && 'on-hold' == $order->status ) {
$order->update_status('processing', 'order_note');
}
return $order_status;
}
这里的关键变化是:
$order->update_status('processing', 'order_note');
如果您愿意,您也可以添加订单备注。
2020 年新更新
WooCommerce 3.4 版引入了比 woocommerce_thankyou
或 woocommerce_thankyou_bacs
更好的挂钩,它允许更改 BACS 付款方式的默认订单状态。
使用这个钩子将:
- 明确轻量化必要的代码,
- 避免在下 BACS 订单时向客户发出“暂停”通知。
所以请改用以下内容:
add_filter( 'woocommerce_bacs_process_payment_order_status','filter_bacs_process_payment_order_status_callback', 10, 2 );
function filter_bacs_process_payment_order_status_callback( $status, $order ) {
return 'processing';
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
原回答:
Update (added a version for woocommerce 3+ at the end)
似乎 woocommerce_payment_complete_order_status
操作挂钩不会通过 BACS 付款方式触发。
基于 ,'woocommerce_thankyou'
动作挂钩完成工作:
add_action( 'woocommerce_thankyou', 'bacs_order_payment_processing_order_status', 10, 1 );
function bacs_order_payment_processing_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = new WC_Order( $order_id );
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status || 'pending' == $order->status) ) {
$order->update_status('processing');
} else {
return;
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。经过测试并有效。
对于 woocommerce 3+ 版本:
这里我们使用类似的复合钩子woocommerce_thankyou_{$order->get_payment_method()}
:
add_action( 'woocommerce_thankyou_bacs', 'bacs_order_payment_processing_order_status', 10, 1 );
function bacs_order_payment_processing_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
if ( in_array( $order->get_status(), array('on-hold', 'pending') ) ) {
$order->update_status('processing');
} else {
return;
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。经过测试并有效。
有一个新的过滤器,允许您在处理 BACS 'payment' 时设置状态。
/**
* Change the default status when BACS 'payment' is processed.
*
* @see WC_Gateway_BACS::process_payment()
* woocommerce/includes/gateways/bacs/class-wc-gateway-bacs.php:362
* @since Mar 8, 2018
* @link https://github.com/woocommerce/woocommerce/blob/750fda3b1b55c55645f626d3873d956282e3ac1b/includes/gateways/bacs/class-wc-gateway-bacs.php#L364
*
* @filter woocommerce_bacs_process_payment_order_status
* @priority 10
* @args 2
*
* @param string $status Status to filter. Default 'on-hold'.
* @param WC_Order $order
* @return string New status 'processing'.
*/
add_filter( 'woocommerce_bacs_process_payment_order_status', function( $status = 'on_hold', $order = null ) {
return 'processing';
}, 10, 2 );
在 WooCommerce 中,使用 BACS(直接银行转账)下的任何订单都设置为 "on-hold"
。
如何将其自动更改为处理?
我不希望它在 functions.php
我有以下代码,但它不起作用:
add_filter( 'woocommerce_payment_complete_order_status', 'rfvc_update_order_status', 10, 2 );
function rfvc_update_order_status( $order_status, $order_id ) {
$order = new WC_Order( $order_id );
if ( 'on-hold' == $order_status && 'on-hold' == $order->status ) {
return 'processing';
}
return $order_status;
}
任何帮助都会很棒!
尝试将代码更改为:
function rfvc_update_order_status( $order_status, $order_id ) {
$order = new WC_Order( $order_id );
if ( 'on-hold' == $order_status && 'on-hold' == $order->status ) {
$order->update_status('processing', 'order_note');
}
return $order_status;
}
这里的关键变化是:
$order->update_status('processing', 'order_note');
如果您愿意,您也可以添加订单备注。
2020 年新更新
WooCommerce 3.4 版引入了比 woocommerce_thankyou
或 woocommerce_thankyou_bacs
更好的挂钩,它允许更改 BACS 付款方式的默认订单状态。
使用这个钩子将:
- 明确轻量化必要的代码,
- 避免在下 BACS 订单时向客户发出“暂停”通知。
所以请改用以下内容:
add_filter( 'woocommerce_bacs_process_payment_order_status','filter_bacs_process_payment_order_status_callback', 10, 2 );
function filter_bacs_process_payment_order_status_callback( $status, $order ) {
return 'processing';
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
原回答:
Update (added a version for woocommerce 3+ at the end)
似乎 woocommerce_payment_complete_order_status
操作挂钩不会通过 BACS 付款方式触发。
基于 'woocommerce_thankyou'
动作挂钩完成工作:
add_action( 'woocommerce_thankyou', 'bacs_order_payment_processing_order_status', 10, 1 );
function bacs_order_payment_processing_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = new WC_Order( $order_id );
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status || 'pending' == $order->status) ) {
$order->update_status('processing');
} else {
return;
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。经过测试并有效。
对于 woocommerce 3+ 版本:
这里我们使用类似的复合钩子woocommerce_thankyou_{$order->get_payment_method()}
:
add_action( 'woocommerce_thankyou_bacs', 'bacs_order_payment_processing_order_status', 10, 1 );
function bacs_order_payment_processing_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
if ( in_array( $order->get_status(), array('on-hold', 'pending') ) ) {
$order->update_status('processing');
} else {
return;
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。经过测试并有效。
有一个新的过滤器,允许您在处理 BACS 'payment' 时设置状态。
/**
* Change the default status when BACS 'payment' is processed.
*
* @see WC_Gateway_BACS::process_payment()
* woocommerce/includes/gateways/bacs/class-wc-gateway-bacs.php:362
* @since Mar 8, 2018
* @link https://github.com/woocommerce/woocommerce/blob/750fda3b1b55c55645f626d3873d956282e3ac1b/includes/gateways/bacs/class-wc-gateway-bacs.php#L364
*
* @filter woocommerce_bacs_process_payment_order_status
* @priority 10
* @args 2
*
* @param string $status Status to filter. Default 'on-hold'.
* @param WC_Order $order
* @return string New status 'processing'.
*/
add_filter( 'woocommerce_bacs_process_payment_order_status', function( $status = 'on_hold', $order = null ) {
return 'processing';
}, 10, 2 );