🆕 Bricks 2.4 已发布:查询循环性能提升 40%,迁移教程同步更新 →

首页 / 中文教程 / 教程

Bricks 查询循环只显示促销中(On Sale)的 WooCommerce 产品

教程:Bricks 查询循环只显示促销中(On Sale)的 WooCommerce 产品——woocommerce 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。

Ray ChanRay Chan·2026-08-11·约 2 分钟
目录
  1. 1.应用场景
  2. 2.步骤骨架(原教程)
  3. 3.补全实现:bricks/posts/query_vars
  4. 4.另一种思路:bricks/query/run
  5. 5.小结

应用场景

电商站首页或促销专区,经常需要一个“正在促销的产品“列表:只显示当前有促销价(Sale Price)的产品,且要能随着后台促销设置自动增减,不用手动维护。

WooCommerce 里“促销中”的本质是产品设置了 _sale_price 元数据(并满足促销起止时间)。用 Bricks 的查询循环(Query Loop)配合 PHP 查询,就能精确筛出这批产品。原教程来自 BricksLabs(Pro 付费墙锁定,代码被截断),本文按官方文档补全实现。

步骤骨架(原教程)

原教程的操作路径是这样的(代码部分原文被付费墙截断):

  1. 在 Bricks 中编辑页面或模板;

  2. 添加查询循环(Query Loop),文章类型选 Products;

  3. 在查询设置中启用 PHP 查询编辑器(PHP query editor)——Bricks 1.10+ 的 Query Loop 自带该选项,允许用 PHP 自定义查询结果;

  4. 粘贴一段返回促销产品 ID 的 PHP 代码(原文在此截断);

  5. 设计循环项样式(产品图、标题、价格等)。

补全实现:bricks/posts/query_vars

⚠️ 以下代码为补全实现:原付费教程代码不可见,此处根据 Bricks 官方钩子文档编写,原理等效,可直接使用。

在子主题 functions.php 或代码片段插件中添加:

add_filter( 'bricks/posts/query_vars', function( $query_vars, $settings ) {
    // 仅对产品查询生效(post_type 为 product 的查询循环)
    if ( isset( $settings['post_type'] ) && $settings['post_type'] === 'product' ) {
        $query_vars['meta_query'][] = [
            'key'     => '_sale_price',
            'value'   => '',
            'compare' => '!=',
        ];
    }
    return $query_vars;
}, 10, 2 );

bricks/posts/query_vars 是 Bricks 官方提供、专门用来修改文章类查询参数的过滤器,回调收到两个参数:$query_vars(WP_Query 参数数组)和 $settings(查询循环的设置)。这里给所有产品查询追加一条 meta_query:_sale_price 不为空,即只保留设置了促销价的产品。未设置促销价的产品 _sale_price 为空字符串,会被排除。

前端设置:

  1. 查询循环 → 文章类型选 Products(产品);

  2. Posts per page 按需设置(如 -1 显示全部促销产品);

  3. 循环项里放产品图、标题 {post_title:link}、价格等动态数据。

效果:循环里只剩促销产品,促销结束(价格元数据清除)后自动从列表消失。

另一种思路:bricks/query/run

如果希望用更彻底的自定义查询类型(而非在 posts 查询上打补丁),可以用 bricks/query/run 钩子注册自定义查询结果:

add_filter( 'bricks/query/run', function( $results, $query_obj ) {
    if ( $query_obj->object_type !== 'sale_products' ) {
        return $results;
    }
    $results = wc_get_product_ids_on_sale();
    return $results;
}, 10, 2 );

wc_get_product_ids_on_sale() 是 WooCommerce 官方函数,返回当前所有促销产品的 ID 数组(内部已处理促销起止时间逻辑,比手动查 _sale_price 更严谨)。然后在查询循环的查询类型里选择这个自定义类型 sale_products 即可。

相关阅读:

小结

两个方案对比:

  • bricks/posts/query_vars:轻量、兼容性最好,直接在标准产品查询上加 meta 条件,适合绝大多数“只筛促销”的需求;

  • bricks/query/run + wc_get_product_ids_on_sale():更“正规”,能复用 WooCommerce 的促销时间计算,适合需要和 Bricks 过滤器(Filter)联动做前端筛选的场景。

小结:促销产品筛选的本质是 meta 条件(_sale_price 非空)或官方 ID 函数,Bricks 两条官方钩子都能实现。付费原文虽然拿不到,但用官方文档的钩子补全后效果一致,这也是“付费墙教程”的标准应对姿势——骨架 + 官方钩子补全,不编造原文代码。

常见误区

筛促销产品两个坑:一是促销是有时间窗口的——_sale_price 设了但起止日期不对、或已过期,产品就不算「在促」,查询要配合 WooCommerce 的促销时间判断(用 wc_get_product_ids_on_sale() 最稳);二是钩子选法:只想在普通产品查询上加个 meta 条件,用 bricks/posts/query_vars 最轻;要和 Bricks 前端 Filter 联动做实时筛选,才用 bricks/query/run + 官方 ID 函数。另外「在促」本质是 _sale_price 非空且生效,别只判断字段存在就完事。

常见问题(FAQ)

Q:为什么有的促销产品没出现? A:促销有起止时间,过期或日期未到就不算「在促」,用 wc_get_product_ids_on_sale() 判断最稳。

Q:两种钩子怎么选? A:只加 meta 条件筛食用 bricks/posts/query_vars 最轻;要配合前端 Filter 实时筛食用 bricks/query/run。

Q:只判断 _sale_price 存在够吗? A:不够,还要它在促销时间窗内生效,否则筛出来的是「设了价但没在促」的产品。

Q:能和 Bricks 查询筛选器联动吗? A:能,用 bricks/query/run + 官方 ID 函数那条路就能和 Filter 联动。

延伸阅读

Ray Chan

站长

Ray Chan

WordPress Developer & Bricks Specialist

WordPress developer with 10+ years of client builds. Switched to Bricks in 2023 — now builds fast WordPress sites and migrates legacy Elementor/Divi projects.

延伸阅读