本文为付费教程的骨架翻译:场景与步骤按原文可见部分梳理,锁定代码按 Bricks 官方过滤器补全实现,并已注明「补全实现」。未复制原文代码。
场景:倒计时日期接不进自定义字段
营销活动页、新品发布页经常放一个 Countdown 倒计时元素。但截至 Bricks 1.9.7.1,内置 Countdown 元素的 Date 控件不支持动态数据——你没法在构建器里直接把日期绑定到某个自定义字段(比如 ACF 的 Date Time Picker)上。每次活动改期,都得进编辑器手动改日期,容易漏改。
BricksLabs 给出了两条出路:
- 用 BricksExtras 插件的 Pro Countdown 元素(付费插件,自带动态日期支持);
- 用 Bricks 官方过滤器在渲染前把日期设置改写为自定义字段的值——不依赖插件,本文采用这条路线。
步骤骨架(原教程)
原教程的可见步骤(具体代码被付费墙截断):
- 用 ACF 添加一个类型为 Date Time Picker 的字段(例如
event_date),并赋值到相应文章/页面。其他自定义字段插件(如 Meta Box)的日期时间字段同理。 - 在页面里添加 Countdown 元素,日期先用任意占位值。
- 在子主题
functions.php或代码片段插件里挂官方过滤器,让 Countdown 渲染时读取当前文章的日期字段值并替换 Date 设置。
补全实现:渲染前改写日期设置
原文提到使用 bricks/element/render 过滤器族;补全实现选用 Bricks 官方标准过滤器 bricks/element/settings(在元素渲染前改写设置,是动态注入设置值的正路),完整代码如下(补全实现):
/**
* Countdown 元素动态日期:从 ACF Date Time Picker 字段取值
* 补全实现(基于 Bricks 官方 bricks/element/settings 过滤器)
*/
add_filter( 'bricks/element/settings', function( $settings, $element ) {
// 只处理 Countdown 元素
if ( $element->name !== 'countdown' ) {
return $settings;
}
// 读取当前文章/页面的 ACF 日期时间字段(字段名按你的实际修改)
$event_date = function_exists( 'get_field' ) ? get_field( 'event_date' ) : '';
if ( $event_date ) {
// ACF 返回的格式可能是 Ymd 或带时间戳,统一转成 Bricks Countdown 期望的格式
$timestamp = is_numeric( $event_date ) ? (int) $event_date : strtotime( $event_date );
$settings['date'] = date( 'Y-m-d H:i:s', $timestamp );
}
return $settings;
}, 10, 2 );
要点:
$element->name是 Bricks 元素的内部标识,Countdown 对应countdown。get_field( 'event_date' )取当前文章/页面的字段值;在归档页/循环里取不到文章上下文时,可改用get_post_meta( get_the_ID(), 'event_date', true )。- ACF Date Time Picker 默认返回值可能是
Y-m-d H:i:s字符串,strtotime转时间戳后统一格式化为 Bricks Countdown 需要的Y-m-d H:i:s,避免时区/格式不一致导致倒计时算错。
原理说明
- 为什么 Countdown 不支持动态数据:Bricks 部分控件(如日期类)在设计上没有接入动态数据解析器,构建器里拖不进
{field}标签。这是 Bricks 的功能边界,不是 Bug。 bricks/element/settings过滤器:Bricks 在每次渲染元素前都会执行apply_filters( 'bricks/element/settings', $settings, $element ),允许你在输出前任意增删改元素的设置数组。改动设置 → 元素按新设置渲染,等于给任何控件补上了「动态数据」能力。- 过滤器的两个参数:第一个
$settings是元素设置数组(键为控件 ID,如date),第二个$element是元素对象(含name、id、post_id等),按name精准筛选、用post_id定位数据来源。 - 别忘了在子主题
functions.php(或 Code Snippets 插件)里挂载,并确认字段名、日期格式与你的站点一致。
小结
Countdown 日期接不进自定义字段,就用 bricks/element/settings 在渲染前改写设置——这是 Bricks 给「官方没做动态数据的控件」补动态能力的标准姿势,不止倒计时,任何控件(日期、数字、链接……)都能照此办理。付费插件能解决的,官方过滤器也能,只是要多写几行代码。