我曾写过wordpress博客首页、存档页显示摘要,rss输出全文的完美解决方案总结一文,总结了首页、存档页显示摘要,feed rss 仍输出全文的办法,其中提到我比较了几种插件的算法,自己写了一个插件,而我的插件的主要特点就是能够在摘要中保留原文的字体、颜色、链接、图片等html标签。然而试用之后发现,单纯地保留标签可能会导致意想不到的结果,如果按字数截取时正好截取到某个标签的中间,造成标签没有闭合,后面的显示就会错乱。

为了解决这个问题,我在网上进行了大量的搜索,发现html标签的配对闭合问题似乎是个经典难题,问的人很多,提出解决方案的却很少。后来终于搜到了 WordPress 的 Advanced Excerpt 这个插件。这是一个相当好的插件,可以自定义摘要长度、摘要后面显示的内容(如省略号)、保留哪些html标记等,而且它截取的摘要字数是按照滤去 html 标签之后的字数算的,即统计是真正显示的字数,而不是代码的字数,更加准确,显示也更加整齐。不过可惜的是它对中文的支持不够好,可能会出现截取半个汉字的现象。

2

查看 Advanced Excerpt 的源代码,发现它实现 html 标签配对用的是 force_balance_tags() 函数,再查这个函数,原来居然是 wordpress 自带的函数,它用堆栈的方式来配对 html 标签,如果有不闭合的标签,它会自动补全。试用发现,这个函数实现的效果非常好。查了半天的难题,原来 wordpress 自己已经解决了,真是踏破铁鞋无觅处,蓦然回首,那人却在灯火阑珊处 ^_^

参考 Advanced Excerpt 里面的办法修改了一下我的插件,效果完全符合我的预期,而且代码非常简短,只有半页左右……似乎已经没有必要写成插件了,我考虑直接放在 function.php 里算了。

我的插件没啥可定制性,对于需要定制性的同学,还是推荐用 Advanced Excerpt,不过需要修改一下使之对中文支持更好。修改办法很简单,打开 advanced-excerpt.php,搜索 substr,替换成 mb_substr,大概共有6处,全部替换即可。这样替换之后,理论上就不会出现截取半个汉字的现象了。

使用 Advanced Excerpt 时还有一点需要注意,在 Advanced Excerpt 选项界面,设置摘要字数的地方,还有一个选项,“use words?”,即是否以单词方式计数?这个选项千万不可勾选,否则它就会按照英文单词的方式用空格来计数,对中文几乎就无效了。