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

Posted

技术标签:

【中文标题】支付网关的 WooCommerce 订单状态更改【英文标题】:WooCommerce order status change from payment gateway 【发布时间】:2016-12-09 01:35:18 【问题描述】:

我已经集成了一个支付网关,以便为我在 woocommerce 上运行的商店接受在线支付。一切正常,但我注意到 woocommerce 默认将所有在线支付订单的订单状态更改为wc-processing

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

有没有办法阻止 woocommerce 以编程方式将订单状态更改为 wc-processing

【问题讨论】:

【参考方案1】:

是有办法的,但是你需要修改支付插件或者添加你自己的代码,你可以read this了解支付是如何工作的。

现在,woocommerce 使用$order->payment_complete() 方法来处理已完成的订单,所以你需要挂钩自己的函数来修改状态,here is the description of that method

使用此过滤器:woocommerce_payment_complete_order_status

【讨论】:

你是对的 $order->payment_complete() 在我的支付插件中将订单状态更改为 processing。我会尝试放置我自己的函数并让你知道。 我添加了以下代码而不是$order->payment_complete(),它按预期工作。 $order->update_status('on-hold'); add_post_meta($order->id, '_paid_date', current_time('mysql'), true); update_post_meta($order->id, '_transaction_id', $txnid); $order->reduce_order_stock();【参考方案2】:

这里是基于thread 的代码sn-p。我们在这里使用 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;

此代码 sn-ps 继续在您的活动子主题或主题的 function.php 文件中。

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

参考资料:

WooCommerce Class WC_Abstract_Order WooCommerce: Auto complete paid Orders (depending on Payment methods) Renaming WooCommerce Order Status

【讨论】:

非常感谢,但在您的解决方案中,订单将变为on-hold,它已从网关标记为processing。我的问题是我有一个与订单状态相关的电子邮件警报流,其中on-hold 应该是网关处理的第一个状态。

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

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

使用自定义 Woocommerce 支付网关的“下订单按钮”的 Javascript 覆盖

WooCommerce 订单状态(自动完成订单)

WooCommerce 根据用户角色更改 BACS 订单状态

更改 Woocommerce 中默认选择的支付网关

在 WooCommerce 中更改特定的支付网关标题