⚠️ 原文为 BricksLabs Pro 付费教程,核心代码锁定。本文按可见说明写场景 + 骨架,代码用 Bricks 官方钩子补全并标注「补全实现」。
痛点:post_excerpt 能限字数,自定义字段不行
Bricks Discord 群里有人问:post_excerpt:55 可以把摘要限制为 55 个词,超长时自动补 ...。但同样的写法用在自定义字段上——比如 {my_custom_description:55}——只截断了词数,不会自动加省略号。
Bricks 原生对自定义字段文本的截断只做 wp_trim_words 式处理,不带省略号后缀;而且 ACF / Meta Box / JetEngine 等插件的字段标签各有各的渲染逻辑,统一行为很难靠配置实现。最干净的解法是注册一个自己的动态数据标签。
目标:custom_field_word_limit_ 标签
注册后的标签形如:
{custom_field_word_limit_page_description:22}
含义:读取字段 page_description 的值,截断为前 22 个词;如果原文超过 22 词,末尾追加 ...。不写数字时输出完整字段值。标签前缀固定为 custom_field_word_limit_,后面跟字段名,冒号后跟字数。
它通过 WordPress 标准函数 get_post_meta() 取值,所以与具体字段插件无关——ACF、Meta Box、JetEngine 存的字段最终都在 wp_postmeta 表里,都能读到。
Step 1:注册动态数据标签(补全实现)
用 Bricks 官方钩子 bricks/dynamic_data/tags(注册标签)和 bricks/dynamic_data/render_tag(渲染值),放入子主题 functions.php(去掉开头 <?php):
// 补全实现:注册 {custom_field_word_limit_字段名:数字} 标签,非原文代码
// 1) 注册标签:动态生成,支持任意字段名
add_filter( 'bricks/dynamic_data/tags', function( $tags ) {
// 核心标签:custom_field_word_limit_ 前缀 + 字段名
$tags['custom_field_word_limit_'] = [
'label' => 'Custom Field Word Limit',
'render' => 'bl_render_custom_field_word_limit',
];
// 返回带任意后缀的标签,让 Bricks 能解析 {custom_field_word_limit_xxx:n}
return array_merge( $tags, bl_custom_field_word_limit_tag_variants() );
} );
// 动态生成变体标签(Bricks 需要标签名精确匹配才能出现在动态数据选择器里)
function bl_custom_field_word_limit_tag_variants() {
$variants = [];
$meta_keys = bl_get_all_meta_keys();
foreach ( $meta_keys as $key ) {
$variants[ 'custom_field_word_limit_' . $key ] = [
'label' => 'Word Limit: ' . $key,
'render' => 'bl_render_custom_field_word_limit',
];
}
return $variants;
}
// 扫描已使用的 meta key(简化版:白名单方式更稳,按需增删)
function bl_get_all_meta_keys() {
global $wpdb;
return $wpdb->get_col( "SELECT DISTINCT meta_key FROM {$wpdb->postmeta} WHERE meta_key NOT LIKE '\_%'" );
}
// 2) 渲染:截断 + 省略号
function bl_render_custom_field_word_limit( $tag, $post, $context, $name ) {
// 从标签名提取字段名:custom_field_word_limit_page_description
$field_name = str_replace( 'custom_field_word_limit_', '', $name );
// 冒号后的数字参数 = 字数限制
$limit = isset( $tag['args'][0] ) ? intval( $tag['args'][0] ) : 0;
$value = get_post_meta( $post->ID, $field_name, true );
if ( empty( $value ) || ! is_string( $value ) ) {
return '';
}
if ( $limit > 0 ) {
$words = preg_split( '/\s+/', trim( $value ) );
if ( count( $words ) > $limit ) {
// 超过限制:截断并追加省略号
return implode( ' ', array_slice( $words, 0, $limit ) ) . '...';
}
}
return $value;
}
补充说明:$wpdb 扫描所有 meta key 在字段多的大站上略重,生产环境建议改成在 bl_get_all_meta_keys() 里返回白名单数组,或把常用字段硬编码。
Step 2:模板中使用
在 Bricks 任意文本元素(Text / Rich Text)的动态数据里选择或直接手写:
{custom_field_word_limit_page_description:22}
- 字段值 ≤ 22 词:原样输出。
- 字段值 > 22 词:输出前 22 词 +
...。 - 不带数字:
{custom_field_word_limit_page_description}输出完整值。 - 在循环内使用:
{post_id}上下文自动切换为当前循环项,无需额外处理。
中文小结
自定义字段限字数 + 省略号,Bricks 原生不提供,但注册自定义动态数据标签是标准解法:bricks/dynamic_data/tags 声明标签、render 回调里用 get_post_meta 取值、preg_split 按空格分词截断、超长补 ...。这套标签与字段插件无关(数据都在 wp_postmeta),ACF / Meta Box / JetEngine 通用。进阶方向:支持按字符截断(中文场景更适用)、支持 more 参数自定义省略号、或对 WYSIWYG 字段先剥离 HTML 再截断——核心渲染函数改几行即可。