0

0

WooCommerce 自定义订单状态“change”自动恢复库存教程

霞舞

霞舞

发布时间:2026-03-09 12:39:11

|

236人浏览过

|

来源于php中文网

原创

WooCommerce 自定义订单状态“change”自动恢复库存教程

本文介绍如何在 WooCommerce 中为自定义订单状态(如 change)配置自动恢复库存功能,使其行为类似 cancelled 状态:当订单状态变更为 change 时,自动将订单内所有商品(含变体)的库存数量增加对应订购量。

本文介绍如何在 woocommerce 中为自定义订单状态(如 `change`)配置自动恢复库存功能,使其行为类似 `cancelled` 状态:当订单状态变更为 `change` 时,自动将订单内所有商品(含变体)的库存数量增加对应订购量。

在 WooCommerce 开发中,常需扩展订单生命周期以支持特殊业务场景,例如客户退换货流程中的“换货单”(change order)。此类订单通常不取消原单,而是标记为 change 状态,并需将已扣减的库存重新返还——这与 cancelled 状态的库存处理逻辑一致,但 WooCommerce 默认仅对 cancelled、failed 和 refunded 等内置状态触发库存回滚。

要实现这一目标,核心在于监听订单状态变更事件,并在目标状态匹配时调用 WooCommerce 内置的库存恢复函数 wc_increase_stock_levels()。该函数会遍历订单中所有订单项(包括简单产品、变体、订阅等),安全地累加库存,同时兼容库存同步、低库存提醒及库存日志记录等机制。

ShopWe 网店系统
ShopWe 网店系统

1.修正会员卡升级会员级别的判定方式2.修正了订单换货状态用户管理中心订单不显示的问题3.完善后台积分设置数据格式验证方式4.优化前台分页程序5.解决综合模板找回密码提示错误问题6.优化商品支付模块程序7.重写优惠卷代码8.优惠卷使用方式改为1卡1号的方式9.优惠卷支持打印功能10.重新支付模块,所有支付方式支持自动对账11.去掉规格库存显示12.修正部分功能商品价格显示4个0的问题13.全新的支

下载

实现步骤如下:

  1. 确保已注册自定义订单状态 wc-change
    在添加状态钩子前,请确认你已通过 register_post_status 和 woocommerce_order_statuses 正确注册了 wc-change 状态(注意:WooCommerce 要求自定义状态必须以 wc- 前缀开头)。示例注册代码(建议放入主题 functions.php 或插件中):
// 注册自定义订单状态 'change'
add_action('init', 'register_wc_change_order_status');
function register_wc_change_order_status() {
    register_post_status('wc-change', array(
        'label'                     => _x('Change', 'Order status', 'textdomain'),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop('Change <span class="count">(%s)</span>', 'Change <span class="count">(%s)</span>', 'textdomain')
    ));
}

add_filter('woocommerce_order_statuses', 'add_wc_change_to_order_statuses');
function add_wc_change_to_order_statuses($order_statuses) {
    $new_order_statuses = array();
    foreach ($order_statuses as $key => $status) {
        $new_order_statuses[$key] = $status;
        if ('wc-processing' === $key) {
            $new_order_statuses['wc-change'] = _x('Change', 'Order status', 'textdomain');
        }
    }
    return $new_order_statuses;
}
  1. 监听状态变更并触发库存恢复
    使用 woocommerce_order_status_changed 动作钩子(该钩子在订单状态实际更新后触发,且传入完整 $order 对象),判断新状态是否为 change,并调用 wc_increase_stock_levels():
add_action('woocommerce_order_status_changed', 'handle_change_order_stock_recovery', 10, 4);
function handle_change_order_stock_recovery($order_id, $old_status, $new_status, $order) {
    // 注意:$new_status 是无前缀的状态标识符(如 'change'),非 'wc-change'
    if ('change' === $new_status) {
        // WooCommerce 内置函数,安全恢复所有订单项库存(含变体、库存管理启用的产品)
        wc_increase_stock_levels($order);

        // 【可选】记录日志便于调试
        if (defined('WP_DEBUG') && WP_DEBUG) {
            error_log("Order #{$order_id} status changed to 'change': stock restored.");
        }
    }
}

⚠️ 关键注意事项:

  • wc_increase_stock_levels() 仅对 启用库存管理(manage_stock == 'yes') 的产品生效;未启用库存管理的商品不会被修改。
  • 该函数会自动处理变体产品的 stock_quantity(父级不参与库存计算),并尊重 backorders 设置。
  • 不建议在 woocommerce_order_status_{old}_to_{new} 这类动态钩子中操作库存,因其执行时机早于数据库持久化,可能导致竞态问题;woocommerce_order_status_changed 是最可靠的选择。
  • 若需支持部分换货(即仅恢复部分商品库存),则需自行遍历 $order->get_items() 并调用 wc_update_product_stock(),但本方案默认采用全量恢复,符合典型换货场景。

? 验证效果:
以示例数据为例:

  • 商品 A102-L(变体 ID: 123)初始库存为 12;
  • 订单含 1 件该变体,状态变为 processing 后库存减至 11;
  • 当手动将订单状态更改为 Change(后台下拉选择),保存后库存立即恢复为 12;
  • 同理,A108-M(变体 ID: 456)从 13 恢复至 15。
    可在「WordPress 后台 → WooCommerce → 产品 → 编辑变体」页面实时查看库存字段变化,或通过数据库查询 wp_postmeta 表中 _stock 键值确认。

? 总结:
通过组合使用 register_post_status + woocommerce_order_statuses + woocommerce_order_status_changed 钩子,开发者可零侵入地扩展 WooCommerce 库存逻辑。本方案复用官方函数 wc_increase_stock_levels(),既保证健壮性与兼容性,又避免重复造轮子。适用于换货、撤回订单、质检退回等多种需“反向扣减库存”的业务场景。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

384

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2110

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

472

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

231

2023.10.19

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号