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

如何在自定义Cron作业中为WooCommerce预售商品添加产品标签

如何在WooCommerce Cron作业中同时更新库存状态并添加产品标签?

完全可以实现,你只需要将标签添加的逻辑封装成可复用的函数,然后在Cron作业的循环中调用即可,同时还能优化原代码中的一些小问题。以下是具体的修改方案:

1. 封装可复用的标签添加函数

把你现有标签添加逻辑改成独立函数,既可以在Cron中调用,也能保留原有的售罄钩子触发逻辑:

// 为产品添加缺货标签的可复用函数
function add_out_of_stock_tag( $product ) {
    // 获取当前产品已有的标签ID
    $current_tag_ids = $product->get_tag_ids();
    // 要添加的缺货标签ID
    $out_of_stock_tag_id = 4074;
    
    // 避免重复添加同一标签
    if ( !in_array( $out_of_stock_tag_id, $current_tag_ids ) ) {
        $current_tag_ids[] = $out_of_stock_tag_id;
        $product->set_tag_ids( $current_tag_ids );
    }
}

2. 修改Cron作业函数,整合标签添加逻辑

更新原Cron函数,在库存状态修改后调用上述函数,同时修复缓存清理的位置问题:

// 由wp_schedule_event调用的自定义Cron挂钩函数
add_action( 'jape_pre_order_stock_update', 'update_pre_order_stock_status' );
function update_pre_order_stock_status(){
    // 通过WP_Query获取所有需要更新的相关产品ID
    $products_ids = get_posts( [
        'post_type'     => 'product',
        'post_status'   => 'publish',
        'numberposts'   => 100, // <= 要处理的产品数量(-1表示全部)
        'fields'        => 'ids',
        'tax_query'     => array( array(
            'taxonomy'  => 'product_cat',
            'field'     => 'slug',
            'terms'     => array(
                'comic-book-pre-orders',
                'dc-comics-pre-orders',
                'image-comics-pre-orders',
                'manga-pre-orders',
                'marvel-comics-pre-orders',
                'other-publisher-pre-orders',
            ),
        ) ),
        'meta_query' => array( 
            'relation' => 'AND',
            array(
                'key'       => '_stock_status',
                'value'     => 'instock',
                'compare'   => '=',
            ),
            array(
                'key'       => 'woo_expiry_date',
                'value'     => date_i18n('Y-m-d'),
                'compare'   => '<=',
                'type'      => 'DATE',
            ),
            array(
                'key'       => 'woo_expiry_action',
                'value'     => 'out',
                'compare'   => '=',
            ),
        ),
    ] );

    foreach( $products_ids as $product_id ) {
        $product = wc_get_product($product_id);
        if ( !$product ) continue; // 跳过无效产品对象
        
        $shipping_class_id = 1002;

        // 批量修改产品属性
        $product->set_stock_quantity(0);
        $product->set_stock_status('outofstock');
        $product->set_shipping_class_id( $shipping_class_id );
        
        // 添加缺货标签
        add_out_of_stock_tag( $product );
        
        // 只保存一次,减少数据库操作
        $product->save();
        
        // 清理当前产品的缓存(原代码放在循环外只会清理最后一个产品)
        rocket_clean_post( $product_id );
    }
}

3. 保留原有的售罄钩子触发逻辑(可选)

如果你还需要保留原有“商品售罄时自动加标签”的功能,只需要将原钩子函数改成调用复用函数即可:

// 保留原有的售罄触发逻辑
add_action( 'woocommerce_no_stock', 'action_woocommerce_no_stock', 10, 1 );
function action_woocommerce_no_stock( $product ) {
    add_out_of_stock_tag( $product );
    $product->save();
}

关键修改说明

  • 将标签逻辑封装后,实现了代码复用,避免重复编写相同逻辑
  • 批量修改产品属性后仅调用一次save(),提升性能
  • 修复了缓存清理的位置问题,确保每个更新后的产品都能清理对应缓存
  • 添加了产品对象有效性判断,避免无效数据导致的错误

内容的提问来源于stack exchange,提问作者JapeNZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:53:18