- 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……