如何在WooCommerce中触发商品从缺货到有货的流程?
实现WooCommerce商品从缺货转有货的触发逻辑
要实现仅在商品从缺货切换为有货时触发特定流程,且覆盖所有场景(后台操作、API调用、退款等),核心是先记录库存更新前的旧状态,再在更新完成后对比状态变化。以下是可靠的实现方案:
1. 核心思路
利用WooCommerce提供的「库存更新前/后」钩子组合,在更新前保存商品的旧库存状态,更新完成后对比新旧状态,判断是否符合「缺货转有货」的条件,再执行自定义逻辑。
2. 代码实现
// 保存简单产品库存更新前的旧状态 add_action( 'woocommerce_product_before_set_stock', 'save_old_stock_status_for_simple_product', 10, 2 ); function save_old_stock_status_for_simple_product( $product, $stock_quantity ) { // 存储旧库存数量和状态到临时元数据 update_post_meta( $product->get_id(), '_temp_old_stock_qty', $product->get_stock_quantity() ); update_post_meta( $product->get_id(), '_temp_old_stock_status', $product->get_stock_status() ); } // 处理简单产品库存更新后的状态对比 add_action( 'woocommerce_product_set_stock', 'trigger_instock_flow_for_simple_product', 10, 2 ); function trigger_instock_flow_for_simple_product( $product, $stock_quantity ) { // 获取之前存储的旧状态 $old_stock_qty = get_post_meta( $product->get_id(), '_temp_old_stock_qty', true ); $old_stock_status = get_post_meta( $product->get_id(), '_temp_old_stock_status', true ); $new_stock_status = $product->get_stock_status(); // 判断是否是从缺货转为有货 if ( ( $old_stock_status === 'outofstock' || $old_stock_qty <= 0 ) && $new_stock_status === 'instock' && $stock_quantity > 0 ) { // 这里执行你的自定义流程 // 示例:发送通知、更新关联数据等 // do_your_custom_process( $product ); } // 清理临时元数据,避免残留 delete_post_meta( $product->get_id(), '_temp_old_stock_qty' ); delete_post_meta( $product->get_id(), '_temp_old_stock_status' ); } // 保存可变产品变体库存更新前的旧状态 add_action( 'woocommerce_variation_before_set_stock', 'save_old_stock_status_for_variation', 10, 2 ); function save_old_stock_status_for_variation( $variation, $stock_quantity ) { update_post_meta( $variation->get_id(), '_temp_old_stock_qty', $variation->get_stock_quantity() ); update_post_meta( $variation->get_id(), '_temp_old_stock_status', $variation->get_stock_status() ); } // 处理可变产品变体库存更新后的状态对比 add_action( 'woocommerce_variation_set_stock', 'trigger_instock_flow_for_variation', 10, 2 ); function trigger_instock_flow_for_variation( $variation, $stock_quantity ) { $old_stock_qty = get_post_meta( $variation->get_id(), '_temp_old_stock_qty', true ); $old_stock_status = get_post_meta( $variation->get_id(), '_temp_old_stock_status', true ); $new_stock_status = $variation->get_stock_status(); if ( ( $old_stock_status === 'outofstock' || $old_stock_qty <= 0 ) && $new_stock_status === 'instock' && $stock_quantity > 0 ) { // 变体的自定义流程 // do_your_custom_variation_process( $variation ); } delete_post_meta( $variation->get_id(), '_temp_old_stock_qty' ); delete_post_meta( $variation->get_id(), '_temp_old_stock_status' ); }
3. 覆盖场景说明
- 后台操作:管理员在商品编辑页修改库存、批量更新库存时,会触发上述钩子。
- API调用:通过WooCommerce REST API更新库存时,同样会触发库存更新钩子。
- 退款/取消订单:订单退款或取消时,系统自动恢复库存,会触发对应库存更新钩子,该逻辑会自动捕获状态变化。
- 第三方插件:只要插件通过WooCommerce官方库存接口更新库存,都会触发这些钩子,确保兼容性。
4. 注意事项
- 临时元数据
_temp_old_stock_qty和_temp_old_stock_status仅用于本次库存更新的状态对比,更新完成后会立即删除,不会残留。 - 如果商品使用「库存状态手动设置」而非「基于数量自动设置」,需确保
$old_stock_status的判断准确(比如用户手动将状态从outofstock改为instock,同时数量>0)。
内容的提问来源于stack exchange,提问作者dubloons
相关产品推荐
相关产品推荐

