You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:45:32