如何禁止WooCommerce后台管理员减少商品库存仅允许增加?
解决方案
问题分析
你之前的代码未能生效,核心原因有两点:
- 误用了
woocommerce_update_product_stock_query钩子:该钩子用于修改库存更新的SQL语句,但你仅修改了$new_stock变量,未将其整合到返回的SQL中,导致修改无法生效。 - 未区分操作场景:没有判断当前是后台手动修改库存还是订单触发的库存减少,无法满足需求中的例外规则。
可靠实现代码
将以下代码添加到主题的functions.php文件中:
// 限制后台手动修改库存仅允许增加,订单触发时正常减少 function restrict_stock_decrease_in_admin( $product ) { // 仅针对后台手动编辑产品库存的操作生效 if ( is_admin() && ! wp_doing_cron() && isset( $_POST['_stock'] ) ) { // 获取旧库存和提交的新库存值 $old_stock = (int) $product->get_stock_quantity(); $new_stock = (int) $_POST['_stock']; // 判断是否为订单相关的库存操作(排除订单触发的库存减少) $is_order_action = isset( $_POST['woocommerce_order_id'] ) || ( isset( $_POST['action'] ) && $_POST['action'] === 'woocommerce_process_shop_order' ); // 非订单操作且新库存小于旧库存时,强制恢复旧库存并提示 if ( ! $is_order_action && $new_stock < $old_stock ) { $product->set_stock_quantity( $old_stock ); add_action( 'admin_notices', function() { echo '<div class="notice notice-warning is-dismissible"><p>禁止减少商品库存,已恢复原有库存数量。</p></div>'; } ); } } } add_action( 'woocommerce_product_set_stock', 'restrict_stock_decrease_in_admin', 10, 1 );
代码说明
- 场景精准控制:通过
is_admin()限定后台生效,wp_doing_cron()排除定时任务,$_POST['_stock']锁定手动库存修改操作。 - 订单操作排除:检测POST数据中的订单标识,确保订单生成时的库存减少逻辑不受限制。
- 强制拦截逻辑:当新库存小于旧库存且非订单操作时,直接将库存值重置为旧库存,并在后台显示提示信息。
- 钩子选择合理:使用
woocommerce_product_set_stock钩子,该钩子在商品库存被设置时触发,能直接干预最终的库存值。
使用注意事项
- 建议使用子主题的
functions.php文件添加代码,避免主题更新导致代码丢失。 - 测试前请备份网站数据,防止意外问题影响正常业务。
内容的提问来源于stack exchange,提问作者athmanou
相关产品推荐
相关产品推荐

