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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:05:14