昨天晚上遇到一个 WordPress 的问题,折腾了很久很久。就是我想在文章中加入一段 PHP 代码,一般我是用 pre 标签来包括整个代码段的,目的是防止代码转义。但果那段代码就是会转义,于是我查找解决方法。

  打开主题的 functions.php 文件,加入:

add_filter( 'the_content', 'pre_content_filter', 0 );
function pre_content_filter( $content ) {
return preg_replace_callback( '|<pre.*>(.*)</pre|isU' , 'convert_pre_entities', $content );
}
function convert_pre_entities( $matches ) {
return str_replace( $matches[1], htmlentities( $matches[1] ), $matches[0] );
}

  代码是不会转义了,但是我发现其中的中文全部变成了乱码,如下图:

WordPress 中文乱码

  查看了后台和数据库,都是正常的,显然从数据库到前台显示还有个转码的过程,问题应该就出在这个过程里。后来仔细分析了上面这段代码,发现问题就出在 str_replace 这个函数。str_replace 并不是 WordPress 自定义的函数,是 PHP 自带的,它在中文字符替换方面确实存有问题,会产生乱码,跟字节有关,具体可以搜索一下。

  换了其它各种函数,重写代码,结果都失败,搞了很久。后来我把测试环境搬回本地,发现竟然好了!但是在服务器上就是出现中文乱码的情况。后来我意识到,本地和服务器的环境,不同的地方就是 WordPress 版本和 PHP 的版本,两者都有可能。我本地装的是 phpStudy,切换 PHP 版本非常方便,本来是 PHP 7.2.10,切换到 5.6.27 还是正常的,但是切换到 PHP 5.2.17 的时候,本地也报错出现了乱码,所以问题就在于 PHP 版本!所以说,PHP 版本问题对 WordPress 影响还是挺大的。

  早上把服务器上的 PHP 版本升级到 7.2.15,一切正常了! 中文乱码问题搞定!效果见:https://ihacksoft.com/446.html