WooCommerce:自动完成付费订单

问题描述 投票:26回答:2

通常,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' );
}

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

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

而......

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

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

我的问题:

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

如何基于woocommerce付款方式实施条件代码?

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

一些帮助将是非常好的。

php wordpress woocommerce payment-gateway orders
2个回答
32
投票

最准确,最有效和最轻量级的解决方案(适用于WooCommerce 3及以上版本) - 2019年

此过滤器挂钩位于:

如您所见,默认情况下,允许的付款订单状态为“正在处理”和“已完成”。

Explanations:

  1. 轻巧有效: 由于它是一个过滤器钩子,woocommerce_payment_complete_order_status仅在需要在线支付时触发(不是“支票”,“bacs”或“cod”支付方式)。这里我们只更改允许的付费订单状态。 因此,无需为支付网关或其他任何内容添加条件。
  2. 准确(避免多次通知): 这是避免同时发送2个不同客户通知的唯一方法: •一个用于“处理”订单状态 •一个用于“已完成”订单状态。 因此,客户仅在“已完成”订单状态时通知一次。

使用下面的代码,只需将付款订单状态(由支付订单的支付网关设置)更改为“已完成”:

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

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

相关:WooCommerce: autocomplete paid orders based on shipping method


2018年 - 改进版(适用于WooCommerce 3及以上版本)

基于Woocommerce官方钩子,我找到了解决这个问题的方法*(适用于WC 3+)。

在Woocommerce中,除了bacs(银行电汇),chequecod(货到付款)以外的所有其他支付网关,付费订单状态为“处理”和“已完成”。

所以我的目标是“处理”所有支付网关的订单状态,如Paypal或信用卡支付,更新订单状态以完成。

代码:

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

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


原始答案(适用于所有woocommerce版本):

代码:

/**
 * 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;
    } 
    // For paid Orders with all others payment methods (with paid status "processing")
    elseif( $order->get_status()  === 'processing' ) {
        $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)


-1
投票

对我来说,即使付款没有通过或失败,也会调用此挂钩,并且此结果是完成付款失败,经过一些研究后我将其更改为使用'woocommerce_payment_complete',因为只有在付款完成时才会调用它并覆盖@的问题LoicTheAztec上面提到 -

add_action( 'woocommerce_payment_complete', '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' );
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.