摘要:the_excerpt 与自定义摘要函数

作者: admin 分类: wordpress主题制作教程 发布时间: 2026-11-06 18:37

摘要的两种来源

WordPress 的摘要有两种:

  1. 手动摘要:你在后台“摘要”框里自己写的;
  2. 自动摘要:没写的话,WordPress 从正文里截前 55 个词。

模板里调 the_excerpt() 输出。

自动摘要的两个问题

问题一:按“词”截,中文失效

WordPress 默认的自动摘要是按空格分词截的。中文整段没有空格,所以它把整段当成一个“词”,结果是:要么完全不截断(输出一大段),要么直接截掉。

这就是为什么很多中文站的文章列表,摘要长得离谱。

问题二:会带短代码

自动摘要取的是正文,如果正文里有 这类短代码,会原样出现在摘要里。

caogenbj 的自造摘要函数

它没直接用 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;
}

这段代码有三个问题:

  1. '\r\n' 用单引号是字面反斜杠 r n,换行从来没被删掉过;
  2. 把所有空格删干净,导致 变成 [captionid="x"],更没法看;
  3. 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;
}

关键三点:

  1. 先 strip_shortcodes,把 整段删掉;
  2. 用 mb_strlen / mb_substr,按“字”算,不按字节;
  3. 空白压成一个空格,不是删光(删光了英文单词会粘在一起)。

顺序很重要

一定要先剥标签,再处理其他。如果先替换 > 再 strip_tags,标签就残缺了,strip_tags 认不出来,会把整段正文吞掉。

这个坑我踩过——结果就是摘要全空,只能走兜底文案。

手动摘要还是更靠谱

自动摘要再怎么写,也是“机器截的”。它不知道哪句是重点。

所以我的建议是:每篇文章发布前,手写 60-80 字的摘要。这样列表页、搜索结果里的描述都更像人话,点击率也更高。

小结

一句话记住:摘要要用 mb_substr 按字截、先 strip_shortcodes 再 strip_tags、空白压成一个空格而不是删光。

下一篇讲评论过滤。

本系列导航

相关文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Powered by 草根站长笔记 © 2015-2026 草根站长笔记 Inc.版权所有,禁止转载