WooCommerce 更改订单状态 BACS 处理

Posted

技术标签:

【中文标题】WooCommerce 更改订单状态 BACS 处理【英文标题】:WooCommerce change order status BACS processing 【发布时间】:2016-08-04 12:08:09 【问题描述】:

在 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;

任何帮助都会很棒!

【问题讨论】:

我决定采用第二种方法,因为 BACS 付款似乎不会触发第一个过滤器。 【参考方案1】:

2020 年新更新

WooCommerce 3.4 版引入了比woocommerce_thankyouwoocommerce_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 文件中。经过测试并且可以工作。


原答案:

更新 (最后添加了 woocommerce 3+ 的版本)

似乎woocommerce_payment_complete_order_status 操作钩子不会通过 BACS 付款方式触发。

基于this thread,'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 文件中。经过测试并且有效。

【讨论】:

这太完美了! :) 谢谢! @LoicTheAztec:你确定后面的代码有效吗?我的functions.php中出现语法错误 @MaditavonBirkenlund 抱歉,WC 3+ 更新代码中缺少括号 @LoicTheAztec 好的,但现在两封电子邮件 - 暂停和处理同时发送,并且仅在暂停电子邮件中显示付款说明。但是,应该只发送处理电子邮件,不是吗? @MaditavonBirkenlund 无论如何自动“处理”BACS 或检查订单不是一个好主意,因为店主需要等待他的银行确认,然后才能将订单传递给“处理”或“完成”订单状态。因此,如果您愿意,您可以使用以下方式在 BACS 中进行一些更改:remicorson.com/… ... 或者您也可以使用 BACS 网关的克隆,用于在process_payment() own function具有“处理”状态的特定“受信任客户”【参考方案2】:

有一个新过滤器可让您设置处理 BACS“付款”时的状态。

/**
 * 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 );

【讨论】:

这是最好的解决方案,它会改变默认行为并且不会触发多个订单状态操作。 有人问我库存水平没有减少的情况。我仔细检查了代码,从 3.0.0 开始,WooCommerce 将在触发支付完成操作以及订单状态变为暂停、处理或完成时尝试自动减少库存。【参考方案3】:

尝试将代码更改为:

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');

如果您愿意,也可以添加订单备注。

【讨论】:

啊,好东西,应该可以完成这项工作,但是我正在连接woocommerce_payment_complete_order_status,这在使用 BACS 时是否会触发?由于该付款方式只是向人们发送发票.. 你可以试试吗?通常应该。 原来woocommerce_payment_complete_order_status确实是在收到付款后触发的。所以在点单的时候不会触发。 在这种情况下,您应该使用另一个触发器,但这里的关键是您可以使用 $order->update_status('processing', 'order_note');更改订单状态。 我试过了,但直到我有 15 个代表,这不会有任何效果。如果你给我一票,我可以给你一票,因为我是代表 14。

以上是关于WooCommerce 更改订单状态 BACS 处理的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 中,将 BACS“暂停”订单限制为客户的一个

将默认 WooCommerce 订单状态更改为处理支票和银行付款

如何通过 WooCommerce 中管理员端的更改订单设置支付网关

WooCommerce Google Analytics:发送有关非标准成功页面的订单信息

在后端删除付款详细信息 Woocommerce 订单页面

woocommerce 预订状态更改 woocommerce 订单状态