当前位置: 首页 > 面试题库 >

WooCommerce:自动完成付款的订单

充培
2023-03-14
问题内容

通常,wooCommerce应该自动完成虚拟产品的订单。但是事实并非如此,这是一个实际的问题,即使是BUG之类的。

因此,在这一点上,您可以找到一些有用的东西(但不是很方便):

1)一段代码 (您可以在wooCommerce文档中找到):

/**
 * 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”,“货到付款”和“支票”,则应用代码段代码(与虚拟产品有关的已付款订单的更新状态为“已完成”)。

一些帮助将是非常好的。


问题答案:

最准确,有效和轻巧的解决方案 (适用于WooCommerce 3及更高版本) -2019

该过滤器钩位于:

  • WC_Order当在结帐时 需要* 付款,所有付款方法都使用的 类内部payment_complete()方法。 ***
  • WC_Order_Data_Store_CPT类内部update()方法。

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

说明:

  1. 轻巧有效:

由于它是一个过滤器挂钩,woocommerce_payment_complete_order_status 因此仅在需要在线支付时才触发
(不适用于“支票”,“ bacs”或“ cod”支付方式) 。在这里,我们只更改 允许的已付款订单状态

因此,无需为支付网关或其他任何条件添加条件。

  1. 准确 (避免多次通知)

这是 避免同时发送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文件中。

*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文件中。

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



 类似资料:
  • 我用woocommerce做了一个简单的网店,有三种付款方式。理想情况下,可通过直接银行转账和开户。订单ID是根据付款方式创建的。例如,如果使用iDEAL付款,订单id将变为ID190100;如果以账户付款,订单id将变为RK190100。我从BeRocket的插件“WooCommerce的顺序订单号”中得到了这一点,但这些都是在付款完成之前创建的。订单ID必须在付款后才能最终确定。现在,尚未付款

  • 我WooCommerce,我正在使用“更改管理付款状态返回到WoocommercePending order status unpayed for WoocommercePending”答案代码,当订单状态在后端手动更改为pending时,重置订单的已付款状态。 例如,如果订单状态从“完成”更改为“挂起”,则删除以下内容:“支付日期为4月2日,2019年@5:29 PM” 现在我这里的问题是在订单

  • 我使用WooCommerce通过电话/电子邮件等手动接受订单,我使用后端记录订单,手动添加订单。 目前,当生成“待付款”的订单作为状态时,库存会自动减少/扣减。我不希望这种情况发生。理想情况下,我只想减少库存,当订单被标记为“正在处理”,然后付款,然后采取。 我明白这是如何WooCommerce工作回来,有没有一种方法来避免库存减少,直到某一个状态已经被选中? 我已经在functions.php中

  • 我正在尝试取消/删除在订单发货后将订单状态保存为“已完成”时发送的自动客户电子邮件。 不想发送自动电子邮件的原因是,我在电子邮件模板文件(override)/woocommerce/email/customer-completed-order.php中添加了一个代码,它将在发送给客户的电子邮件中显示在admin中创建的新订单注释,如果我们添加订单注释并保存它,然后将订单状态更改为completed

  • 我在这个相关的答案中找到了对我的问题的部分和可行的答案: send-an-email-notification-when-order-status-changhe-fron-pendig-to-cancelled 我正在考虑使用提供的解决方案,但想看看我是否可以更改电子邮件通知,明确地说,“未决付款订单现在取消”,所以它不同于常规取消的订单。 我该怎么做?

  • 如果‘处理’状态将自动更新为‘完成’,我想从woocommerce更改每个订单. 我尝试在functions.php文件中编写函数,但没有成功。 当我已经收到用户的付款时,如何在Woocommerce中自动将订单状态从“正在处理”更改为“已完成”? 我使用了这个代码,但它没有效果 感谢的