超长文章在Wordpress中不能显示的解决办法(与shortcode有关)

谢益辉 2009-05-15

2009-06-14 更新

自从WordPress 2.8开始,这里的正则表达式又变了,经本人测试,'(.?)\ [('.$tagregexp.')\b([^\ [\ ]\r\n]*?)(?:(\/))?\](?:(.+?)\ [\/\2\])?(.?)' 是有效的。

这两天捣鼓Wordpress,遇到了无数的问题,估计Google不下百次,有些问题实在诡异,不过幸好都让我找到了答案。例如,昨天被这个问题搞得几乎崩溃:有的帖子在更新发布之后就变成空白了,刚开始我以为是数据库连接问题,后来在phpMyAdmin中检查了一遍又一遍,甚至直接更改数据库,都没法让文章显示出来,于是又去查codex,看the_content()等函数,依旧无果。最后在千般尝试下,发现把文章删除一部分文字之后就可以显示出来了,于是我意识到这与被删的文字有关,但从未听说Wordpress系统对文章内容有审查啊,所以应该不是关键词过滤的问题,我于是一句一句话地删除,看删到哪里之后文章就发不出了,最后统计了一下字节数,但这个数字对解决问题根本没用,因为不能因此就避免长文章。

我想来想去,想到了可能是插件的问题,由于需要“头文字”效果,我安装了TinyCode插件,它的内部用到了WP的shortcode。在将TinyCode禁用的情况下,长文章可以显示,问题便找到了:出在shortcode上。继续Google,发现几个月前有人出现了类似的问题,一位德国高手提供了解决方案,修改/wp-includes/shortcodes.php文件。找到:

function get_shortcode_regex() {
  global $shortcode_tags;
  $tagnames = array_keys($shortcode_tags);
  $tagregexp = join( '|', array_map('preg_quote', $tagnames) );
  
  return '\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\1\])?';
}

将正则表达式替换为:

  return '\[('.$tagregexp.')\b([^\]]*?)(\/)?\](?:(.+?)\[\/\1\])?';

这样问题便解决了。Wordpress这么完善的系统也会有Bug……