问题:只想显示作者手动填写的摘要
Bricks Facebook 群里有人问:能否只在文章手动设置了摘要时才显示摘要?他的博客模板想在正文上方显示摘要,但前提是作者本人主动填写过,而不是 WordPress 自动从正文截取的那一段。
这个需求听起来简单,难点在于:WordPress 的 post_excerpt 字段区分不了“作者手写的摘要”和“系统自动生成的摘要”。Bricks 的 Excerpt 元素上直接挂条件,也没有现成的判断项。解决方案是自己写一个判断函数,再挂到动态数据条件(Dynamic data condition)上。
Step 1:定义 bl_has_manual_excerpt 函数
把下面的函数加到子主题的 functions.php(去掉开头的 <?php 标签)或代码片段插件里。它接收可选的 post ID,返回 true 表示存在手动摘要,否则返回 false:
function bl_has_manual_excerpt( $post_id = null ) {
$post = get_post( $post_id );
if ( ! $post ) {
return false;
}
// 检查文章是否有摘要
if ( ! empty( $post->post_excerpt ) ) {
// 获取自动生成的摘要(默认取正文前 55 个词)
$auto_excerpt = wp_trim_words( $post->post_content, 55, '' );
// 对比存储的摘要与自动生成的摘要
return $post->post_excerpt !== $auto_excerpt;
}
return false;
}
原理:WordPress 在文章没有手动摘要时,会自动从正文前 55 个词生成一个摘要写入 post_excerpt。所以“有没有摘要”不能只看字段是否为空——需要把字段值和“系统自动生成的那份”做对比:如果两者不同,说明是作者手写的;如果完全相同,说明是自动生成的,不算手动摘要。这里用 wp_trim_words 以相同规则重新生成一份自动摘要用于比对。
Step 2:白名单注册函数
Bricks 出于安全考虑,默认只允许白名单内的函数通过 { echo:函数名 } 动态数据调用。需要把 bl_has_manual_excerpt 加进白名单:
add_filter( 'bricks/code/echo_function_names', function() {
return [ 'bl_has_manual_excerpt' ];
} );
注意:你 Bricks 实例里用到的其他函数(原生的或自定义的)也要一起加进这个数组。可以在 Bricks → Settings → Custom code 里点 Code review 按钮,检查当前正在使用的函数列表,把缺的补上。
Step 3:给元素加动态条件
在单篇模板里选中你要条件输出的元素(比如摘要区块所在的 Container),在 Conditions 面板选择 Dynamic data 条件,填入:
{ echo:bl_has_manual_excerpt }
保存后去前台检查:手动填了摘要的文章会显示该区块,没填的文章区块被隐藏。条件为真(返回 true)时元素显示,为假时隐藏,符合直觉。
小结:这个方案的通用价值在于“用函数返回值做动态条件”这条路——{ echo:函数名 } 可以接任意返回布尔值的自定义函数,不只是摘要判断。任何“按数据状态条件渲染”的需求(比如判断文章有无特色图片、有无自定义字段值、字段是否等于某值)都可以套同一个套路:写函数 → 白名单 → 挂条件。比在编辑器里堆一堆 AND/OR 条件清爽得多,逻辑也都在 PHP 一处维护。