如何在WooCommerce中正确保存商品的历史库存数量?
原有实现失效的核心原因
之前代码用到的woocommerce_product_before_set_stock钩子存在逻辑认知偏差:
- 该钩子触发时机在商品类内部调用
set_stock()方法的执行流程中,触发时商品实例的stock_quantity属性已经被赋值为即将设置的新值 - 此时直接调用
$product->get_stock_quantity()获取到的是即将生效的新库存数,而非调整前的历史旧值,最终导致存储的_old_stock_quantity元数据始终和当前库存完全一致
正确的历史库存记录实现方案
选用woocommerce_update_product_stock钩子完成旧库存存储,该钩子在数据库层执行库存更新操作前触发,不会提前修改商品实例的属性值,可准确读取到调整前的原始库存数。
可直接复用的实现代码
add_action( 'woocommerce_update_product_stock', function ( $new_stock, $product_id, $adjust_operation ) { // 过滤无效的非商品ID触发场景 if ( empty( $product_id ) ) { return; } // 直接从数据库读取调整前的原始库存值,不依赖商品实例属性 $original_old_stock = get_post_meta( $product_id, '_stock', true ); // 将调整前的库存值写入自定义元字段,作为历史库存记录 update_post_meta( $product_id, '_old_stock_quantity', $original_old_stock ); }, 10, 3 );
功能使用说明
- 获取最近一次调整前的历史库存:通过
get_post_meta($product_id, '_old_stock_quantity', true)读取对应元字段即可 - 获取当前实时库存:直接调用WooCommerce商品对象的
$product->get_stock_quantity()方法即可 - 如果需要记录全量库存变动历史,而非仅保存上一次调整前的数值,可在上述逻辑中将每次的旧值、新值、变动时间追加存储为数组结构的元字段,避免单次写入覆盖历史记录
内容的提问来源于stack exchange,提问作者Eugen Belousov
相关产品推荐
相关产品推荐

