⚠️ 原文为 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}上下文自动切换为当前循环项,无需额外处理。
相关阅读:
适用场景与常见误区
这个字数标签适合:列表卡片截断自定义字段简介、归档页统一摘要长度、避免某篇字段特别长把排版撑破。误区:一是中英文混排时「字数」按字符数算,截断点和视觉长度不一致,按字符截断通常就够;二是忘了在白名单注册,前台不显示;三是截断后没加省略号,读着突兀。它和 WP 自带 post_excerpt 限字同一思路,只是把能力扩展到任意自定义字段。
中文小结
自定义字段限字数 + 省略号,Bricks 原生不提供,但注册自定义动态数据标签是标准解法:bricks/dynamic_data/tags 声明标签、render 回调里用 get_post_meta 取值、preg_split 按空格分词截断、超长补 ...。这套标签与字段插件无关(数据都在 wp_postmeta),ACF / Meta Box / JetEngine 通用。进阶方向:支持按字符截断(中文场景更适用)、支持 more 参数自定义省略号、或对 WYSIWYG 字段先剥离 HTML 再截断——核心渲染函数改几行即可。
延伸阅读
- 想要现成外贸独立站,从零搭出能收询盘的站?看 铲子铺 chanzipu 的外贸建站教程(同用 Bricks)
常见问题(FAQ)
这个标签和 post_excerpt 限字一样吗? 思路一样,区别是它能作用于任意自定义字段,而不只是文章摘要。
中英文截断为什么不一致? 字数按字符数算,中英字符宽度不同,视觉长度会有差;按字符截断通常够用。
前台不显示先查什么? 确认标签在白名单注册了,且字段名拼写和 ACF 里一致。
截断后怎么加省略号? 在标签逻辑里判断超长时追加「…」,读起来更自然。
- 相关阅读:Bricks Setup Guide
延伸阅读
Bricks 让元素输出 N 次(N = 自定义字段值):Array 查询类型实战
教程:Bricks 让元素输出 N 次(N = 自定义字段值):Array 查询类型实战——query loop 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 输出 Meta Box 设置页里选中文章的数据(PHP 查询实现)
教程:Bricks 输出 Meta Box 设置页里选中文章的数据(PHP 查询实现)——meta box 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 按 ACF Gallery 图片数量做动态条件输出
教程:Bricks 按 ACF Gallery 图片数量做动态条件输出——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 查询循环输出 ACF 图片字段的 Alt、Caption、标题数据
教程:Bricks 查询循环输出 ACF 图片字段的 Alt、Caption、标题数据——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
