跳到主要内容

ArtinTech Solution

Letting Admins Change a Product Variant After an Order Is Placed

“能把我的订单从 30 码换成 32 码吗?”是时装电商在结账后最常收到的消息之一,而 WooCommerce 对此确实没有内置的解决办法。

两个独立的障碍

第一个障碍是,WooCommerce 订单商品在界面中根本没有“更换规格”的操作。你可以修改现有行的数量和价格,或者删除它再从头添加另一个商品,但在保持相同商品、价格和数量的前提下只更换规格,这个功能并不存在。

第二个不那么明显的障碍是,WooCommerce 原生的订单行编辑只有在 $order->is_editable() 返回 true 时才能使用,在默认安装中,这意味着订单状态必须是 pending、on-hold 或 auto-draft。而实际上,客户要求换尺码时,大多数真实订单早已进入 Processing,原生编辑器因此完全被锁住。

我们做了什么

我们在订单编辑页面的每个可变商品行下方加了一个 Change variant 链接,特意不依赖 WooCommerce 的 is_editable() 检查,只限制管理员权限,因为事后更正规格恰恰发生在订单已经往前推进的时候。点击后会把该商品所有尺码、颜色和长度组合加载为可点击按钮,复用了为 Manual Order Creator 打造的同一个选择器组件。

选择新规格时,会调用 WooCommerce 自己的 WC_Order_Item_Product::set_variation() 方法,这正是结账流程最初创建订单行时内部使用的方法,因此属性元数据的格式与 WooCommerce 其他部分的预期完全一致,而不是一个在订单邮件或 CSV 导出中会出错的手工近似版本。

每次更改还会写入一条订单备注,准确记录改了什么(例如从 Size 56 / Length 43 / Deep Blue 改为 Size 50 / Length 43 / Deep Blue),这样如果客户对收到的商品有异议,也有清晰的审计记录。

它刻意不做的事

这个功能只更换规格本身:尺码、颜色、长度和商品名称。它不会自动改动价格、数量或库存。这是刻意设定的边界:悄悄改变向客户收取的金额,或自动调整库存数量,都应由员工明确决定,而不是换尺码的副作用。

要点总结

  • 只在订单处于平台狭义上的“可编辑”状态时才能使用的功能,往往解决的是错误的场景;真正的需求出现在这个窗口关闭之后。
  • 复用平台自己的 setter 方法,而不是直接写入元数据,才能让定制修改与所有读取这些数据的地方保持兼容。
  • 明确划定一个功能不碰什么(价格、库存),与它做什么同样重要。

相关阅读:扩展订单预览弹窗、我们如何打造手动下单工具。

在您自己的 WooCommerce 或 WordPress 后台遇到类似限制?和我们聊聊:ArtinTech Solution 正是打造这类定制店铺工具的团队。

Share this article

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注