首页 / 中文教程 / 教程

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

在 Bricks Query Loop 中只输出正在促销的产品。原文为付费教程,本文给出场景与步骤骨架,并用 Bricks 官方钩子 bricks/posts/query_vars 补全实现。

Ray Chan·2026-08-11·约 1 分钟

应用场景

电商站首页或促销专区,经常需要一个“正在促销的产品“列表:只显示当前有促销价(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 两条官方钩子都能实现。付费原文虽然拿不到,但用官方文档的钩子补全后效果一致,这也是“付费墙教程”的标准应对姿势——骨架 + 官方钩子补全,不编造原文代码。

需要帮忙?

用 Bricks 建站?我接客户项目。

从快速营销站到完整的 Bricks 建站,再到从 Elementor 迁移——我都做过。本站每篇教程都来自真实项目经验。告诉我你的需求,一个工作日内回复。

  • Bricks 建站与改版
  • Elementor / Divi → Bricks 迁移
  • Bricks → Astro / headless 性能升级
  • 速度优化,PageSpeed 95+ 目标