如何在WooCommerce商店页面隐藏缺货已满10天的产品
WooCommerce原生未提供产品缺货时长的存储字段,你需要先自定义字段存储缺货起始时间,再结合查询条件实现隐藏逻辑,完整实现方案如下:
步骤1:实现缺货时间存储逻辑
通过监听WooCommerce库存状态变更钩子,在产品标记为缺货时写入当前时间戳,产品恢复库存时清空该字段:
// 监听产品库存状态变更,记录/清空缺货起始时间 add_action( 'woocommerce_product_set_stock_status', 'custom_record_oos_time', 10, 3 ); function custom_record_oos_time( $product_id, $stock_status, $product ) { if ( $stock_status === 'outofstock' ) { // 产品标记为缺货时写入当前时间戳 update_post_meta( $product_id, '_oos_start_time', time() ); } else { // 产品恢复库存时删除缺货时间字段 delete_post_meta( $product_id, '_oos_start_time' ); } }
如果需要兼容可变产品的库存状态变更,可以额外补充监听woocommerce_variation_set_stock_status钩子,逻辑和上述函数一致即可。
步骤2:修改产品查询,隐藏缺货满10天的产品
你原有代码中嵌套新WP_Query查询全量缺货ID的写法会产生额外数据库查询,性能损耗较大,直接修改当前查询的meta条件即可:
add_action( 'woocommerce_product_query', 'custom_hide_oos_over_10days', 10, 1 ); function custom_hide_oos_over_10days( $query ) { // 仅在前台商店主查询生效,可根据需求调整生效条件 if ( ! is_admin() && $query->is_main_query() ) { // 获取当前meta_query,避免覆盖原有条件 $meta_query = $query->get( 'meta_query' ) ?: []; // 追加排除条件:要么不是缺货,要么缺货但未满10天 $meta_query[] = [ 'relation' => 'OR', // 有货的产品正常展示 [ 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => '!=', ], // 缺货但没有记录起始时间的(旧数据)正常展示,可按需调整 [ 'key' => '_oos_start_time', 'compare' => 'NOT EXISTS', ], // 缺货但时长不满10天的正常展示 [ 'key' => '_oos_start_time', 'value' => time() - 10 * DAY_IN_SECONDS, // DAY_IN_SECONDS是WP原生常量,等于86400 'compare' => '>', 'type' => 'NUMERIC' ] ]; $query->set( 'meta_query', $meta_query ); } }
补充说明
如果需要处理代码上线前已经处于缺货状态的旧产品,可以写一次性执行的批量脚本,给现有缺货产品统一初始化_oos_start_time字段值即可。
内容的提问来源于stack exchange,提问作者Nik7
相关产品推荐
相关产品推荐

