应用场景
电商站首页或促销专区,经常需要一个“正在促销的产品“列表:只显示当前有促销价(Sale Price)的产品,且要能随着后台促销设置自动增减,不用手动维护。
WooCommerce 里“促销中”的本质是产品设置了 _sale_price 元数据(并满足促销起止时间)。用 Bricks 的查询循环(Query Loop)配合 PHP 查询,就能精确筛出这批产品。原教程来自 BricksLabs(Pro 付费墙锁定,代码被截断),本文按官方文档补全实现。
步骤骨架(原教程)
原教程的操作路径是这样的(代码部分原文被付费墙截断):
-
在 Bricks 中编辑页面或模板;
-
添加查询循环(Query Loop),文章类型选 Products;
-
在查询设置中启用 PHP 查询编辑器(PHP query editor)——Bricks 1.10+ 的 Query Loop 自带该选项,允许用 PHP 自定义查询结果;
-
粘贴一段返回促销产品 ID 的 PHP 代码(原文在此截断);
-
设计循环项样式(产品图、标题、价格等)。
补全实现: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 为空字符串,会被排除。
前端设置:
-
查询循环 → 文章类型选 Products(产品);
-
Posts per page 按需设置(如 -1 显示全部促销产品);
-
循环项里放产品图、标题
{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 联动。
延伸阅读
- 想要现成外贸独立站模板与建站实战?看 铲子铺 chanzipu 的外贸建站教程(同用 Bricks,从零搭出能收询盘的站)
- 相关阅读:Bricks Query Loop Api Data
延伸阅读
Bricks 相关文章:同作者的其他文章(PHP 查询编辑器实现)
教程:Bricks 相关文章:同作者的其他文章(PHP 查询编辑器实现)——query loop 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialACF Relationship 字段 + Bricks 查询循环:显示关联文章
教程:ACF Relationship 字段 + Bricks 查询循环:显示关联文章——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 查询循环按 ACF Repeater 子字段值筛选行
教程:Bricks 查询循环按 ACF Repeater 子字段值筛选行——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 按 ACF Repeater 子字段排序行
教程:Bricks 按 ACF Repeater 子字段排序行——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
