昨天晚上遇到一个 WordPress 的问题,折腾了很久很久。就是我想在文章中加入一段 PHP 代码,一般我是用 pre 标签来包括整个代码段的,目的是; s d = 3 S W g防止代码转义。但果那段代码就是会转义,于是我查找解决方法。
打开主题的 functions\ : r f.php 文件,加入o Z ::
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] ); }
代码是不会转义了,但S r 1 ) 5 e I是我发现其中的中文全部变成了乱码,如下图:
查看了后台和数据库,都是正常S ; E I 3 _ h的,显然从数据库到前台显示还有个转码的过程,问题应该就出在这个过程里。后来仔细分析了上面这段代码,发现问题就出Q * v H e . = g在 str_replace 这个函数。str_replace 并不是 WordPress 自定义的函数,是 PHP 自带的,它在中文字符替换方面确实存有问题,b y \ [ O l G会产生乱码,跟字节有关,具体可以搜索一下。
换了其它各种函数,重写代码,结果都失败,[ . _ @ [搞了很久E K b i [ I。后来我把测试环境搬回本地,发现竟然好了!但是在服务器上就是出现中文乱码的情况。后来我意识到,本地和服务器的环境,不同的地方就是 WordPress 版本和 PHPE M V I , 7 的版本,两者都有可能。我本地装的是 phpStudy,切换f Y J PHP 版本非常方便,本来是 PHP 7.2.10,切换到 5.6.27 还是o h a Z Z 6 9 ; B正常的,但是切换到2 @ , , PHP 5.2.17 的9 { o p ^时候,本地也报错出现了乱码,所以问题就在于 PHP 版本!所以5 z W D h说,PHP 版~ 6 J o 5 G x本问题对 WordPress 影响还是挺大的。
早上把服务器上的 PHP 版本升级到 7.2.15,一切正常了! 中文乱码问题搞定!效果见:https://www.hack520.com/446.h0 f : V k B = 1tml