WordPress中excerpt_length限制摘要长度无效

最近升级 WordPress 到 6.x,发现首页文章列表的摘要长度由之前的指定长度变成文章全文了,吓得我连夜查资料修改。

本文发表于梓喵出没博客,任何转载需遵循 CC BY-NC-SA 协议,即保留本站署名、本站原文链接,且仅用于非商业化或非盈利方向使用。

现象

本站主题在首页列表中的文章摘要是通过 the_excerpt 方法输出的,并使用 excerpt_length 钩子限制长度:

echo the_excerpt(); //输出文章摘要code by 梓喵出没博客/azimiao.com
//钩子设置摘要长度(code by azimiao.com)
add_filter("excerpt_length", "theExcerpt_Length");
function theExcerpt_Length($length) {
    return 155;
}

在 WordPress 5.x 上,输出的内容长度符合预期;升级到 6.x 后,输出内容巨长,基本上都是文章全文。

原因

很简单,在 excerpt_length 钩子与 the_excerpt 方法中,其指定的长度并不是字符串长度,而是“单词”数量,官方文档描述如下:

apply_filters( 'excerpt_length', int $number )
//Filters the maximum number of words in a post excerpt.

在之前的版本中,一个中文字符貌似被视作了一个单词,因此我错误的认为该值即为字符串长度并使用至今。

在新版本上,空格分隔的英文单词被认作一个单词,而连续的一段中文也会被认作一个单词。对于一篇满是中文的文章来说,它相当于只有一个单词。

当然,即使中文中夹杂着一些英文,也不过是切割后增加了几个单词而已,其数量远远低于 155 阈值,因此出现了输出全文的现象。

另一个引申的问题是,中文搜索结果中,问到如何限制摘要长度,回答都是 excerpt_length 钩子值,因此鲜有人(包括我)去看英文文档原文。一篇文章抄来抄去,霸占了搜索引擎,最后误导了一批人。

解决方法

不管该现象是属于 WordPress 自身的 BUG 亦或者是有意为之,问题总得解决一下。我暂时利用字符串裁切的方式规避问题,代码如下:

echo the_excerpt_by_azimiao_com(155);

function the_excerpt_by_azimiao_com($maxNum){

    $originExcerpt = get_the_excerpt();
    $originExcerpt = mb_substr($originExcerpt,0, $maxNum, 'utf-8') . '<a href="'.get_permalink($post->ID).'">查看更多</a>';
    return $originExcerpt;
}

由于本站使用了静态化插件,大部分字符串裁切发生在首次生成缓存时,因此暂不考虑内存 GC 与性能问题。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/8937.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

换马甲 Louis