如何在自定义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
相关产品推荐
相关产品推荐

