今天咱来聊聊WordPress里标题特殊字符转义这个事。为啥要折腾这个?怎么才能正确地只禁用标题转义?我结合自己的经验跟大家捋一捋。
转义到底是干嘛的?
说穿了,转义就是给网站输出加一道“安全锁”。它把那些可能有特殊意义的字符处理一下,从根本上堵住输出环节被插入恶意代码的漏洞。虽然咱们普通站长平时根本想不到怎么利用这种漏洞,但防一手总没错。而且从SEO角度,转义后的代码干干净净,对排名没副作用,不然WordPress核心团队也不会把它作为默认功能。

那些我踩过或者不推荐的坑
首先,千万别图省事全局关闭转义。网上有些教程直接让你用
add_filter('run_wptexturize', '__return_false');
这相当于为了修一扇窗,把整栋房子的防盗网都拆了。wptexturize 在其他地方还负责着重要的安全过滤,全局禁用会留下隐患。
其次,一些老方法已经过时了。WordPress 4.4 之后,官方推荐用 add_theme_support( ‘title-tag’ ); 来管理标题,而不是老式的 wp_title()。
所以下面这类代码,除非你还在维护古董级主题,否则基本没用了:
remove_filter('the_title', 'wptexturize');
remove_filter('wp_title', 'wptexturize');
remove_filter('single_post_title', 'wptexturize');
我目前在用的正确方法
现在主流主题都用 add_theme_support( ‘title-tag’ );,标题最终由 wp_get_document_title() 生成。这个函数末尾提供了一个很实用的过滤钩子 document_title。我的做法是利用这个钩子,只对标题内容进行反转义,既不影响其他地方的安全过滤,又精准解决了标题显示问题。
下面是正在使用的代码,分享给大家:
function wpdx_decode_title_entities($title) {
if (isset($title)) {
$title = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
}
return $title;
}
add_filter('document_title', 'wpdx_decode_title_entities');
把这段代码放到当前主题的 functions.php 文件末尾,或者集成到你的自定义插件里,保存刷新就能生效。这样处理下来,标题显示正常了,网站的整体安全也没被动摇,算是目前比较稳妥的方案。
