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

修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:15:43