WordPress 的摘要有两种:
模板里调 the_excerpt() 输出。
WordPress 默认的自动摘要是按空格分词截的。中文整段没有空格,所以它把整段当成一个“词”,结果是:要么完全不截断(输出一大段),要么直接截掉。
这就是为什么很多中文站的文章列表,摘要长得离谱。
自动摘要取的是正文,如果正文里有 这类短代码,会原样出现在摘要里。
它没直接用 the_excerpt,而是自己写了一个 lingfeng_strimwidth():
function lingfeng_strimwidth( $str, $len, $start = 0, $suffix = '……' ) {
$str = str_replace( array( ' ', ' ', ' ', '\r\n' ), '', strip_tags( $str ) );
if ( $len > mb_strlen( $str ) ) {
return mb_substr( $str, $start, $len );
}
return mb_substr( $str, $start, $len ) . $suffix;
}
这段代码有三个问题:
'\r\n' 用单引号是字面反斜杠 r n,换行从来没被删掉过; 变成 [captionid="x"],更没法看;strip_tags 管不了短代码,中括号原样保留。结果就是首页列表的摘要里出现一串中括号。
function my_excerpt( $str, $len = 100 ) {
$str = strip_shortcodes( $str ); // 先去掉短代码
$str = wp_strip_all_tags( $str ); // 再去掉 HTML 标签
$str = preg_replace( '/\s+/u', ' ', $str ); // 多个空白压成一个
$str = trim( $str );
if ( mb_strlen( $str, 'UTF-8' ) > $len ) {
$str = mb_substr( $str, 0, $len, 'UTF-8' ) . '…';
}
return $str;
}
关键三点:
strip_shortcodes,把 整段删掉;mb_strlen / mb_substr,按“字”算,不按字节;一定要先剥标签,再处理其他。如果先替换 > 再 strip_tags,标签就残缺了,strip_tags 认不出来,会把整段正文吞掉。
这个坑我踩过——结果就是摘要全空,只能走兜底文案。
自动摘要再怎么写,也是“机器截的”。它不知道哪句是重点。
所以我的建议是:每篇文章发布前,手写 60-80 字的摘要。这样列表页、搜索结果里的描述都更像人话,点击率也更高。
一句话记住:摘要要用 mb_substr 按字截、先 strip_shortcodes 再 strip_tags、空白压成一个空格而不是删光。
下一篇讲评论过滤。