WordPress的All-in-One-SEO-Pack插件是我所见过的最强大的一款做SEO的插件了,是由uberdose强人打造的。众所周知的是,WordPress本身就在静态URL等方面具有先天的SEO 友好性质,不过在标题、描述、关键词这几个方面仍然显示出一定的不足来。而All-in-One-SEO-Pack插件就可以很好地满足我们的需求。

然而今天通过google sitemap的查看忽然发现我的许多页面没有像预期一样有着分别自动形成的META Description信息,而是都成了默认的网站描述信息了。我马上到具体的页面中去查看,发现description并没有自动生成,莫名地缺失了,所以google只好去采集页面下面标签中的信息,所以才造成了重复。

*** 

那么为什么All-in-One-SEO-Pack没有为通过截取文章前若干文字而产生description呢?

通过仔细阅读代码,我发现了根源所在。

代码截取的时候使用的是如下的方式:

  $max = $this->maximum_description_length;
  if ($max < strlen($text)) {
     while($text[$max] != ' ' && $max > $this->minimum_description_length) {
       $max--;
     }
  }
  $text = substr($text, 0, $max);

其原理是,从一个设定的最大截取字数处开始反向寻找,直到找到一个空格就停止,从而截取到此处。

这种方式似乎让用汉语的人觉得莫名其妙,汉语中传统上基本没有空格一说的(除却避讳、数学表示等情况),而这问题偏偏出在书面语言的差异上面了!

插件的作者是说英语的,而包括英语在内的大多数西方语言都是以空格作为单词与单词的划分依据,所以该处的用法可以保证不会截取到一个完整单词的一小部分。而对于包括中文在内的各类以字作为最小语素的书面语言来说,这种判断方法是完全行不通的。因而要对汉语的书写习惯进行分析。

那么应该怎么处理呢?对于汉语来说,在书面语法上来说,我们是以换行和句号、感叹号等作为完整句意的分割的(有人会说段前空两格,这个嘛,还是用CSS实现自动缩进的好,记起很早时所写的那篇《网络文章中的中文格式问题》了。)然而判断换行还比较容易,而判断句号等符号会存在一定困难(从下文涉及判断汉字时即可看出)。

但事实上来说,我们干嘛非要去按照自然语言来截取呢?我们是为了提供给搜索引擎一个参考的语句,而这语句其实是用来提供关键词的,即使是最后搜索引擎用来展现给用户的也不过是截断的语句部分。所以不如就是先寻找换行之类,如果找不到则按照最大长度直接截取。

然而直接截取的时候又遇到问题了,出现了FFFD情况,出现了一个框中有FFFD字样。这显然是由于对汉字的强行截断而产生的。我也想当然地以为汉字在此处是以两个字符来存储的,也在网上查到了很多方法来判