后台把库存设成 0 并选了不允许缺货订购,前台商品页照样显示加入购物车按钮,点下去提示已加入,到结算那一步才报错。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,主题自己写了一个加购按钮,地址直接取的 add_to_cart_url,绕过了 purchasable 判断。库存状态在页面上已经显示缺货,按钮那一段没有跟着判断。

「缺货仍可加购」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

if ($product->is_purchasable() && $product->is_in_stock()) {
  woocommerce_template_loop_add_to_cart();
}

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

具体做法是,加购前统一调 $product->is_purchasable() 和 $product->is_in_stock(),两个都为真才输出按钮;加购接口也要补同样的校验,只靠前端隐藏按钮等于没拦;用库存 0、库存 1、允许缺货三种商品各测一次。

最后用这个标准收尾,库存 0 的商品按钮换成缺货文字,直接调加购接口返回 400 而不是 200。

作者 9823189