后台看到可配置商品和子商品都有数量,前台却显示 Out of Stock,最常见的误区是只查看父商品。可配置商品本身不承担具体库存,它是否可售由当前网站可用的关联简单商品决定。只要子商品在状态、网站、来源或可销售数量上不满足条件,父商品就可能整体显示缺货。
先确认子商品真的属于当前销售渠道
逐个检查关联简单商品是否启用、分配到当前网站、具有必需属性值,并且没有被删除或解除关联。子商品可见性可以是“单独不可见”,这不会阻止它作为可配置选项销售。真正关键的是网站归属与状态。
使用 Multi-Source Inventory 时,Source Quantity 不是前台直接使用的 Salable Quantity。销售渠道关联的是 Stock,Stock 再包含一个或多个 Source。子商品有 10 件数量,但这 10 件位于没有分配给当前网站 Stock 的 Source,前台仍不可售。
Salable Quantity 还会扣除 Reservation
下单会创建负 reservation,发货时再通过库存扣减和补偿完成链路。检查不一致:
bin/magento inventory:reservation:list-inconsistencies
bin/magento inventory:reservation:list-inconsistencies -r
输出表示订单状态与 reservation 计算不一致时,先确认异常订单,再决定是否生成补偿。不要直接删除 inventory_reservation 表记录,也不要看到数量不同就全部补偿;未发货订单存在负 reservation 本来就是正常状态。
还要检查 Backorders、Out-of-Stock Threshold 和 Manage Stock。可销售数量并不总等于物理数量减已下单数量,阈值与允许超卖会改变判断。
索引表能告诉你前台看到了什么
在确定 stock ID 后,检查库存索引:
SELECT sku, quantity, is_salable
FROM inventory_stock_1
WHERE sku IN ('CHILD-S', 'CHILD-M');
表名中的数字与 Stock ID 对应,不一定总是 1。索引中 is_salable=0 而后台 Source 数量大于 0,说明问题还在 Stock、Reservation 或索引链路;索引正确而页面缺货,则继续检查全页缓存、主题和自定义库存插件。
bin/magento indexer:status inventory
bin/magento indexer:reindex inventory
不同版本的 inventory indexer 名称可能有差异,可先运行 bin/magento indexer:info 查看实际列表。
父商品状态由可售子项聚合
颜色、尺码属性配置错误会让前端组合无法解析到正确子 SKU。检查商品页的 configurable JSON,选择每组属性后确认映射到的 simple product 与后台一致。第三方 swatch 或库存扩展如果缓存了旧的 salable 状态,也可能只让某些组合错误。
修复后不要只刷新父商品页面。分别测试每个子选项、不同网站和一个登录客户组,完成下单并取消一次,再确认 reservation、Source Quantity 与 Salable Quantity 的变化符合预期。库存显示恢复且生命周期闭环正确,才算解决。

