首页 / 中文教程 / 教程

Bricks 自定义字段文本限字数动态标签:{custom_field_word_limit_字段名:数字}

给 ACF / Meta Box / JetEngine 的文本字段输出加字数限制并自动追加省略号。注册自定义动态数据标签,官方钩子补全实现。

Ray Chan·2026-08-12·约 2 分钟

⚠️ 原文为 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 再截断——核心渲染函数改几行即可。

需要帮忙?

用 Bricks 建站?我接客户项目。

从快速营销站到完整的 Bricks 建站,再到从 Elementor 迁移——我都做过。本站每篇教程都来自真实项目经验。告诉我你的需求,一个工作日内回复。

  • Bricks 建站与改版
  • Elementor / Divi → Bricks 迁移
  • Bricks → Astro / headless 性能升级
  • 速度优化,PageSpeed 95+ 目标