修改PHP主题 移除WooCommerce促销列表中的缺货商品
WooCommerce促销模块过滤缺货商品实现方案
适用于基于WooCommerce搭建、使用mweb_theme_query自定义查询类输出促销商品列表的场景,无需PHP开发经验,按以下方案操作即可实现仅展示有库存可售商品的效果。
方案1:直接修改现有查询参数(优先尝试)
WooCommerce商品的库存状态存储在文章元数据_stock_status中,instock为有货、outofstock为缺货。绝大多数主题自定义查询类兼容WordPress原生的meta_query过滤参数,直接在原有$query_options数组中增加库存过滤规则即可。
修改后的完整代码如下:
$settings = $this->get_settings_for_display(); $query_options = array( 'category_id' => $settings['category_id'], 'posts_per_page' => $settings['posts_per_page'], 'orderby' => 'on_sale', 'post_type' => 'product', // 新增库存过滤规则,仅返回有库存商品 'meta_query' => array( array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=' ) ) ); $query_data = \mweb_theme_query::get_custom_query( $query_options );
方案2:使用WooCommerce原生钩子兼容(方案1不生效时使用)
如果主题的get_custom_query方法没有透传meta_query参数,不需要修改模块查询代码,直接把下述代码添加到当前主题(优先用子主题)的functions.php文件中即可,该逻辑仅对促销排序的商品列表生效,不会影响站点其他商品查询逻辑:
add_filter( 'woocommerce_product_query_meta_query', 'filter_onsale_only_instock', 10, 2 ); function filter_onsale_only_instock( $meta_query, $query ) { // 仅匹配当前促销模块的查询规则,避免影响其他页面 if ( isset($query->query_vars['orderby']) && $query->query_vars['orderby'] === 'on_sale' ) { $meta_query[] = array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=' ); } return $meta_query; }
操作注意事项
- 修改代码前请备份对应原文件,避免语法错误导致站点异常
- 代码添加完成后请清理站点缓存、WooCommerce商品瞬态缓存,再刷新前台页面验证效果
- 若使用子主题,请将钩子代码添加到子主题的
functions.php中,避免主题版本更新后自定义代码被覆盖
内容的提问来源于stack exchange,提问作者hadilionson
相关产品推荐
相关产品推荐

