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