WooCommerce:自动完成付款订单

2024-01-28

通常 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*, 货到付款 and Cheque支付方式。 Paypal 和信用卡网关付款方式都可以。

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

And …

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

该插件适用于所有付款方式,但不是为了 other 信用卡网关付款方式.

我的问题:

使用(作为基础)第 1 点中的 wooCommerce 片段:

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

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

一些帮助会非常好。


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

该过滤器挂钩位于:

  • WC_Order Class inside payment_complete() method https://docs.woocommerce.com/wc-apidocs/source-class-WC_Order.html#122这是所有付款方式均使用 when 需要付款在结账时。
  • WC_Order_Data_Store_CPT Class inside update() method https://docs.woocommerce.com/wc-apidocs/source-class-WC_Order_Data_Store_CPT.html#157.

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

说明:

  1. 轻巧有效:

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

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

  2. Accurate (避免多次通知):

    这是唯一的方法避免同时发送 2 个不同的客户通知:
    • 一项用于“处理”订单状态
    • 一个表示“已完成”订单状态。

因此,客户只会收到一次关于“已完成”订单状态的通知。

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

add_filter( '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 文件中。

Related: WooCommerce:根据运输方式自动完成付款订单 https://stackoverflow.com/questions/48303688/woocommerce-autocomplete-paid-orders-based-on-shipping-method/48306674#48306674


2018 - 改进版本 (适用于 WooCommerce 3 及更高版本)

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

在 Woocommerce 中,除了以下所有其他支付网关bacs (电汇), cheque and cod (货到付款), 已付款订单状态为“处理中”和“已完成”.

因此,我的目标是“处理”所有支付网关(如 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;
    } 
    // Autocomplete all others payment methods
    else {
        $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 文件中。

在这篇文章的帮助下:如何通过 ID 检查 WooCommerce 订单的付款方式? https://stackoverflow.com/questions/26011837/how-to-check-payment-method-on-a-woocommerce-order-by-id

有了这个 :get_post_meta( $order_id, '_payment_method', true ); from 赫尔加特维克 https://stackoverflow.com/users/383847/helgatheviking

“银行电汇”(bacs)、“货到付款”(cod) 和“支票”(支票) 付款方式将被忽略并保持其原始订单状态。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WooCommerce:自动完成付款订单 的相关文章

随机推荐

  • 如何在 OpenCV + Visual C++ 中测量对比度

    以前的问题是 如何在 OpenCV 中选择最佳对比度的图像 但根据 Rook 的建议 我正在更改它 我将在我的项目中使用 OpenCV Visual Studio 2010 我只是想知道 OpenCV 如何让这对我来说更容易 我从视频中提取
  • SQL Server - 缺少索引 - 什么会使用索引?

    我正在使用 SQL Server 2008 我们正在使用 DMV 来查找丢失的索引 然而 在创建新索引之前 我试图找出哪个 proc query 需要该索引 我想要获得最多的信息 以便我可以对我的索引做出明智的决定 有时 SQL Serve
  • 将 List 转换为分隔字符串列表 [重复]

    这个问题在这里已经有答案了 可能的重复 从 List 返回字符串的最优雅的方式 https stackoverflow com questions 1334072 most elegant way to return a string fr
  • OpenCV Android 使用最大轮廓的边缘创建新图像

    我能够检测图像中最大的正方形 矩形 绿色 但是 我想将图像中检测到的最大正方形 矩形转换为新图像 存储在新的 Mat 中 这是该函数的返回图像 其上有最大的矩形 正方形 http img153 imageshack us img153 93
  • NodeJS 从后台进程读取 stdin

    我有一个在 Ubuntu 12 04 LTS 下作为服务运行的节点进程 它在 etc init 下有一个配置文件 该系统在连接了条形码阅读器的无头 x86 路由器板上运行 我需要做的是能够读取来自条形码阅读器的输入 其行为类似于 USB 键
  • 在 .NET Core 中使用 SHA-1

    在 dotnet core 中对字符串进行哈希处理时 我得到了奇怪的结果 我发现了这个类似的问题 使用 ASP NET Core 计算 SHA1 https stackoverflow com questions 35363358 comp
  • sqlite,从另一个表中的列更新列

    我目前正在处理更新的查询table1 state从数据中table2 state基于两个表中的城市字段 换句话说 当表 1 和表 2 中的城市字段匹配时 用表 2 中的州更新表 1 我遇到的问题是 当没有城市匹配时 会随机添加一个州 例如爱
  • 真的需要通配符泛型吗?

    例如 public String add Set gt 这是一个列表的列表 该方法可以向其中添加不同组件类型的列表 public void foo List
  • 在后台脚本中设置间隔

    我正在为实时产品开发浏览器扩展 我有一个在manifest json 中设置了 persistent true 的背景页面 我使用的是v2 版本 我使用 setInterval 每秒不断地轮询服务器以获取新数据 后台脚本还会缓存迄今为止收集
  • 使用纯 R 通过 dbplyr 处理日期

    dbplyr 将 dplyr 和基本 R 命令转换为 SQL 以便开发人员可以编写 R 代码并在数据库中执行它 整洁宇宙参考 https dbplyr tidyverse org 在 R 中处理日期时 通常使用 lubridate 包 然而
  • JDK 11 + JUnit 5 + Jigsaw:Junit 无法运行“模块信息”测试

    我尝试在 Gradle 项目中使用 JUnit 5 compileJava and compileTestJava两者都成功了 但是test失败并显示奇怪的消息Could not execute test class module info
  • 从“dragmove”回调中移动图层后,事件丢失

    我有一个移动图层的滚动条 因此该图层在滚动条的 dragmove 回调中移动 这会导致所有绑定事件在移动的图层上断开连接 请看这个小提琴 http jsfiddle net NY4QK 10 http jsfiddle net NY4QK
  • 链接 2 个异步调用(promise API)以串行运行

    这与我发布的问题类似today https stackoverflow com questions 16307652 promise api combining results of 2 asynchronous call 但需要串行链接请
  • 更新 Jupyter Notebook 扩展的正确方法是什么?

    升级 Jupyter Notebook 扩展 例如 RISE ipywidgets 的正确方法是什么 我有一个例程 可以通过运行来更新我的 Python 包pip install upgrade 并且当新的笔记本扩展版本可用时 这也会下载并
  • 如何将日期和时间分成两个元素?

    我制作了一个实时显示日期和时间的对象 我想知道如何将时间部分与日期分开 以便我可以将它放在自己的 HTML 元素中 以便我可以对其应用不同的样式 我对 JavaScript 不太熟悉 而且我发现使用日期对象非常复杂 LiveDateTime
  • 将最近的提交移至不同的现有分支

    我刚刚对功能分支进行了一些更改 但我意识到我在错误的分支上 如何获取我所做的最后一次提交 并将其移动到另一个已经存在的分支 我还没有推任何东西 我见过一些类似的问题 但它们都涉及创建一个新分支 并且他们所做的所有硬头重置都令人恐惧 git
  • 如何减少简单选择查询的响应时间?

    MarketPlane表包含超过 6000 万行 当我需要特定日期的飞机总数时 我执行此查询需要 7 分钟以上 我怎样才能减少这个时间 SELECT COUNT primaryKeyColumn FROM MarketPlan WHERE
  • jspc-maven-plugin 未执行?

    我在我的 pom xml 中添加了这样的 jspc 插件
  • Oracle:如何以最佳方式使用不同的 where 子句进行多次计数?

    我需要对同一表中具有不同 where 子句的行进行计数 以下是我所需的输出 Bu A B C D E F G H J K L M N GB01 267 284 84 45 35 32 458 801 111 899 892 56 99 NL
  • WooCommerce:自动完成付款订单

    通常 wooCommerce 应自动完成虚拟产品的订单 但事实并非如此 这是一个真正的问题 甚至是一个BUG之类的 所以此时你可以找到一些有用的东西 但不是很方便 1 一段代码 您可以在 wooCommerce 文档中找到 Auto Com