使用wpdb处理WooCommerce缺货商品时如何添加10天修改日期条件
WooCommerce缺货商品自动移回收站新增修改日期判断实现方案
核心修改逻辑是在原有数据库查询条件中追加商品最后修改时间的判断规则,保留原有12小时缓存机制,不额外增加性能开销。
修改后完整代码
add_action('init', 'automatically_trash_sold_items_in_woocommerce_callback'); function automatically_trash_sold_items_in_woocommerce_callback() { // 读取现有transient缓存,缓存未过期则跳过执行 if ( false === ( $automatically_trash_sold_items_in_woocommerce = get_transient( 'automatically_trash_sold_items_in_woocommerce' ) ) ) { global $wpdb; // 追加修改时间判断:仅最后修改时间距今超过10天的缺货商品才会移入回收站 $wpdb->query( "UPDATE {$wpdb->posts} P JOIN {$wpdb->postmeta} PM ON P.ID = PM.post_id SET P.post_status='trash' WHERE P.post_type='product' AND PM.meta_key='_stock_status' AND PM.meta_value='outofstock' AND P.post_modified < DATE_SUB(NOW(), INTERVAL 10 DAY)" ); // 写入12小时有效期的transient缓存 set_transient( 'automatically_trash_sold_items_in_woocommerce', true, 12 * HOUR_IN_SECONDS ); } }
改动点说明
- 时间判断直接在SQL层完成:使用MySQL原生
DATE_SUB(NOW(), INTERVAL 10 DAY)计算10天前的时间节点,仅筛选post_modified字段(对应商品最后修改时间)早于该节点的缺货商品执行操作,不满足时间条件的缺货商品不会被处理 - 完全保留原有12小时transient缓存逻辑,缓存有效期内不会重复执行数据库更新,不会产生额外性能开销
- 无需PHP层循环遍历商品,单条SQL完成筛选+状态更新,执行效率和原代码基本一致
测试提示:如果需要立即验证效果,可手动删除系统中名为
automatically_trash_sold_items_in_woocommerce的transient缓存,否则需要等12小时缓存过期后才会执行新的判断逻辑。
内容的提问来源于stack exchange,提问作者ersezar
相关产品推荐
相关产品推荐

