WooCommerce订单状态从支付网关更改


WooCommerce order status change from payment gateway

我集成了一个支付网关,为我在wooccommerce上运行的商店接受在线支付。一切都很好,但我注意到,默认情况下,wooccommerce将所有在线付费订单的订单状态更改为wc-processing

根据我商店的功能,我希望所有在线支付订单最初都处于wc-on-hold状态。

有什么方法可以阻止wooccommerce通过程序将订单状态更改为wc-processing

这里是一个基于线程的代码片段。我们在这里使用woocommerce_thankyou(在付款后立即触发)来挂接我们的功能,将'processing'订单状态转换为'on-hold'

add_action( 'woocommerce_thankyou', 'custom_woocommerce_paid_order_status', 10, 1 );
function custom_woocommerce_paid_order_status( $order_id ) {
    if ( ! $order_id ) {
        return;
    }
    global $woocommerce;
    $order = new WC_Order( $order_id );
    // 'processing' orders status are converted to 'on-hold'.
    if ( is_object($order) && $order->has_status( 'processing' ) {
        $order->update_status( 'on-hold' ); 
    }
    return;
}

您也可以根据自己的情况瞄准支付网关,例如,在这里,我们绕过3个支付网关,使用"your_payment_gateway" slug瞄准特定的支付网关:

add_action( 'woocommerce_thankyou', 'custom_woocommerce_paid_order_status', 10, 1 );
function custom_woocommerce_paid_order_status( $order_id ) {
    if ( ! $order_id ) {
        return;
    }
    global $woocommerce;
    $order = new WC_Order( $order_id );
    // Bypass orders with Bank wire, Cash on delivery and Cheque payment methods.
    if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) {
        return;
    }
    // Target your "your_payment_gateway_slug" with this conditional
    if ( is_object($order) && get_post_meta($order->id, '_payment_method', true) == 'your_payment_gateway_slug'  && $order->has_status( 'processing' ) ) {
        $order->update_status( 'on-hold' ); 
    }
    return;
}

此代码片段位于活动子主题或主题的function.php文件中

您可以轻松地做任何您想做的事情,支付订单的正确挂钩是woocommerce_thankyou

参考文献:

  • WooCommerce类WC_Abstract_Order
  • WooCommerce:自动完成已付款订单(取决于付款方式)
  • 重命名WooCommerce订单状态

是的,有一种方法,但你需要修改支付插件或添加自己的代码,你可以阅读它来了解支付是如何工作的。

现在,wooccommerce使用$order->payment_complete()方法来处理已完成的订单,因此您需要挂接自己的函数来修改状态,

以下是该方法的描述

使用此筛选器:woocommerce_payment_complete_order_status