WooCommerce:自动完成付款订单(取决于付款方式)

Loi*_*tec 27 php wordpress payment-gateway orders woocommerce

通常,wooCommerce应该自动完成虚拟产品的订单.但它没有,这是一个真正的问题,甚至像BUG一样.

所以在这一点上你可以找到有用的东西(但不是很方便):

1)一个代码片段(你可以在wooCommerce docs中找到):

/**
 * Auto Complete all WooCommerce orders.
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );
    $order->update_status( 'completed' );
}
Run Code Online (Sandbox Code Playgroud)

但此代码段不适用于BACS*,付款时付款和支票付款方式.它适用于Paypal和信用卡网关支付方式.

*BACS 是直接银行转账付款方式

而......

2)插件: WooCommerce自动完成订单

此插件适用于所有付款方式,但不适用于其他信用卡网关付款方式.

我的问题:

在第1点中使用(作为基础)wooCommerce代码段:

如何实现基于woocommerce支付方式的条件代码?

我的意思是:如果付款方式不是"BACS","付款时付款"和"支票",则应用代码段(对于虚拟产品的付款订单,更新状态为"已完成").

我不是一个wooCommerce巨型专家编码器,所以我还没有找到如何在woocommerce订单中定位付款方式.

一些帮助将是非常好的.

谢谢.

Loi*_*tec 34

我找到了解决这个问题的方法(适用于WC 3+):

add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    return 'completed';
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或活动主题)的function.php文件中.

在这篇文章的帮助下:如何通过ID检查WooCommerce订单的付款方式?

有了这个:WC_Order来自helgatheviking

银行电汇,货到付款和支票付款方式将被忽略,并保持原始订单状态.

更新了与​​WC 3.0+兼容的代码(2017-06-10)


WooCommerce 3+的增强版(2018年)

add_action( 'woocommerce_thankyou', 'wc_auto_complete_paid_order', 20, 1 );
function wc_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id )
        return;

    // Get an instance of the WC_Product object
    $order = wc_get_order( $order_id );

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
    if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {
        return;
    } 
    // For paid Orders with all others payment methods (paid order status "processing")
    elseif( $order->has_status('processing') ) {
        $order->update_status( 'completed' );
    }
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或活动主题)的function.php文件中.

  • 您的解决方案对我的WooCommerce问题和问题非常有帮助. (3认同)

Mot*_*msi 6

对我来说,即使付款没有完成或失败,也会调用这个钩子,这会导致付款失败。经过一番研究后,我将其更改为使用“woocommerce_ payment_complete”,因为仅在付款完成时才调用它,并且它涵盖了@LoicTheAztec上面提到的问题 \xe2\x80\x93

\n
add_action( 'woocommerce_payment_complete', 'wc_auto_complete_paid_order', 20, 1 );\nfunction wc_auto_complete_paid_order( $order_id ) {\n    if ( ! $order_id )\n        return;\n\n    // Get an instance of the WC_Product object\n    $order = wc_get_order( $order_id );\n\n    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.\n    if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {\n        return;\n    // Updated status to "completed" for paid Orders with all others payment methods\n    } else {\n        $order->update_status( 'completed' );\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n