首页 文章

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

提问于
浏览
22

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

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

1)一个代码片段(你可以在wooCommerce docs中找到):/ **
*自动完成所有WooCommerce订单 .

  • /
    add_action('woocommerce_thankyou','custom_woocommerce_auto_complete_order');
    function custom_woocommerce_auto_complete_order($ order_id){
    if(!$ order_id){
    返回;
    }

$ order = wc_get_order($ order_id);
$ order-> update_status('completed');
}
但此代码段不适用于BACS *,付款时付款和支票付款方式 . 它适用于Paypal和信用卡网关支付方式 .

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

而......

2)插件:WooCommerce自动完成订单此插件适用于所有付款方式,但不适用于其他信用卡网关付款方式 .

我的问题:

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

How can i implement conditional code based on woocommerce payment methods?

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

我不是一个wooCommerce mega expert coder,所以我还没有找到如何在woocommerce订单中定位付款方式 .

一些帮助将是非常好的 .

谢谢 .

1 回答

  • 27

    我找到了解决这个问题的方法(与WC 3一起使用):

    /**
     * AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
     */
    add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
    function custom_woocommerce_auto_complete_paid_order( $order_id ) {
        if ( ! $order_id )
        return;
    
        $order = wc_get_order( $order_id );
    
        // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
        if ( ( 'bacs' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cod' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cheque' == get_post_meta($order_id, '_payment_method', true) ) ) {
            return;
        } 
        // "completed" updated status for paid Orders with all others payment methods
        else {
            $order->update_status( 'completed' );
        }
    }
    

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

    在这篇文章的帮助下:How to check payment method on a WooCommerce order by id?

    对此: get_post_meta( $order_id, '_payment_method', true ); 来自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;
        // Updated status to "completed" for paid Orders with all others payment methods
        } else {
            $order->update_status( 'completed' );
        }
    }
    

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

相关问题