All In One SEO是我首选的WordPress SEO插件,我一直对它信任有加。直到昨天,用google site了一下自己的网站,发现很多文章的描述都是菜单名称、发表时间之类的,再打开这些文章检查head,发现根本没有meta description描述,我明明选上了All In One SEO自动生成描述那一项,怎么会没有。

怀疑了可以怀疑的所有地方,博客没问题,没有被黒,关了所有的插件换了默认主题,仍然不行。最奇怪的地方是,有些文章可以自动生成描述,有些不行。读了一下代码,锁定问题出在这个函数:

trim_excerpt_without_filters()

问题 – 对中文支持的不好

函数的代码如下:

function trim_excerpt_without_filters($text) {
    $text = str_replace(']]>', ']]>', $text);
    $text = preg_replace('|\[(.+?)\](.+?\[/\\1\])?|s', '', $text);
    $text = strip_tags($text);
    $max = $this->maximum_description_length;

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

问题就出在截取字符串的那段代码上,如下

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

经过一番搜索,我终于明白这是All In One SEO不支持中文的表现,这段代码只考虑了英文,英文中单词与单词之间靠空格分隔,为了把一个单词截断,所以要找到空格作为分隔。然而中文中很难出现空格,于是就会出现描述很短甚至根本无法输出描述的情况。要解决这个问题只能修改代码,将上面的函数替换成下面这样

function trim_excerpt_without_filters($text) {
    $text = str_replace(']]>', ']]&gt;', $text);
    $text = preg_replace('|\[(.+?)\](.+?\[/\\1\])?|s', '', $text);
    $text = strip_tags($text);
    $max = $this->maximum_description_length;

    if ($max < strlen($text)) {
        while((ord($text[$max]) & 0x80) != 0 && (ord($text[$max]) & 0x40) == 0 &&
        $max > $this->minimum_description_length) {
            $max--;
        }
    }

    $text = substr($text, 0, $max);
    return trim(stripcslashes($text));
}

这些是从另外一个高人的博客找来的,不想重复劳动,想看原因的就到解决这个问题的人那里去看吧

《完美解决All in One SEO Pack对中文支持不友好的问题》

这个问题只出现在自动生成描述时,当你手动填写描述时,All In One SEO会调用另一个函数处理字符串

All In One SEO Meta Description选取优先级

由高到低依次是

  1. 用户在编辑文章时填写到All In One SEO Description box中的内容,不过滤长度;
  2. 用户在编辑文章时填写到“摘要”中的内容,使用trim_excerpt_without_filters_full_length()函数过滤,不过滤长度;
  3. 通过截取文章内容作为描述,通过trim_excerpt_without_filters()函数过滤,如果内容过长就会被截取。
function trim_excerpt_without_filters_full_length($text) {
		$text = str_replace(']]>', ']]>', $text);
                $text = preg_replace( '|\[(.+?)\](.+?\[/\\1\])?|s', '', $text );
		$text = strip_tags($text);
		return trim(stripcslashes($text));
	}

总结

为了避免自动描述带来的问题,也为了不让自己辛苦填写的描述再插件被禁用后全部完蛋。

  • 将meta description内容填写到摘要里,而不是All In One SEO的Description中,这样即使禁用了All In One SEO,也可以自己写代码调用摘要作为描述,而All In One SEO也会自动将摘要作为meta description。
  • 使用自动生成描述的朋友需要手动更新一下trim_excerpt_without_filters()函数。
  • 以后在遇到插件不好使的问题,可以直接搜索【插件名称 不支持中文】

16条留言

    1. SEO插件我很久以前就没再用过

      1. 那你用什么?删除掉这个插件会不会受到影响,用得太久了,怕是会受到影响啊

        1. 我没有SEO插件,只是用文章摘要当meta description,别的优化没有。删掉估计会有影响,不如优化一下别的东西吧,按说一个SEO插件也不会耗资源到哪里去啊。

  1. 这个问题跟困扰我的一样啊,语言问题还真是烦,本来想偷懒让插件自动的,看来还是得手动填写。

    1. 我目前也手工输入了,偷懒没好结果啊

  2. […] 我最喜欢的SEO插件,设置界面非常简洁,没有多余的功能,适合新手或者懒人。唯一的问题是对中文支持不太好,不过已经有解决方案了,而我写摘要乐此不疲,所以不存在中文不支持的问题。 […]

    1. 只要不学我偷懒,用自动生成description的功能就好啊

  3. 你好用sinaapp基本是不收费的 ,虽然写着云豆收费,开始注册+验证送2500个 一个wordpress 博客 一年也就用1000个,够用两年的,用完继续买的话1元100个,一年也就是10元,还可以绑定域名 2B青年

    1. 多谢,解释的这么详细。我注册过一次,以为收费就没继续,看来是看走眼了

  4. 感谢分享,以前用过,现在已经抛弃了

    1. 看了你的网站,很厉害啊,请问阁下现在用什么SEO插件?还是自己写代码?

评论功能已关闭