
概述
默认情况下,WordPress 会将 Title 标题中的破折号 <code>-</code>、与符号 <code>&</code> 等特殊符号进行转义(例如:<code>-</code> 转义为 <code>–</code>,<code>&</code> 转义为 <code>&</code>)。部分 SEO 人员声称这会导致 SEO 问题,但该说法无任何实际依据。若你仍希望解决这一“所谓问题”,可参考本文教程。
一、WordPress 为什么要转义特殊字符
一句话:为了安全。通过转义特殊字符,可避免某些极端情况下的恶意代码输出(尽管此类情况极少发生,且具体恶意利用方式尚不明确)。
转义后的代码结果(如 <code>–</code> 代替 <code>-</code>)仅为 HTML 实体的文本表示,不会对 SEO 产生不利影响——否则 WordPress 官方开发团队不会将其作为默认行为。
二、不推荐的或无效的处理方法
(一)不推荐的方法
网络上常见的解决方法是全局禁用 <code>wptexturize</code> 功能,示例如下:
add_filter('run_wptexturize', '__return_false');
强烈不推荐此方法!因为 <code>wptexturize</code> 在其他场景中(如正文、评论内容)通过转义增强安全性仍有必要,全局禁用可能引入潜在风险。
(二)失效的方法
自 WordPress 4.4 起,官方建议使用 <code>add_theme_support('title-tag');</code> 启用 Document Title 机制输出标题,不再直接通过 <code>wp_title()</code> 函数输出标题。因此,以下方法在现代主题中已普遍失效(仅适用于极老旧主题):
// 以下方法现已失效,无需尝试
remove_filter('the_title', 'wptexturize');
remove_filter('wp_title', 'wptexturize');
remove_filter('single_post_title', 'wptexturize');
三、正确的禁止 Title 转义的方法
现代 WordPress 主题均通过 <code>add_theme_support('title-tag');</code> 启用 Document Title,标题最终由 <code>wp_get_document_title()</code> 函数输出。该函数最末端提供了一个 <code>document_title</code> 过滤钩子,我们可通过此钩子将转义后的 HTML 实体反转义为原始符号,且仅影响标题输出,无需全局禁用 <code>wptexturize</code>。
实现代码
将以下代码添加到当前主题的 <code>functions.php</code> 文件或自定义插件中即可:
/**
* 禁止 WordPress 转义 title 标题中的破折号 - 和 & 号等特殊符号
* 来源:https://www.wpdaxue.com/disable-title-wptexturize.html
*/
function wpdx_decode_title_entities($title) {
// 若标题存在,则反转义 HTML 实体为原始字符(支持 UTF-8 编码)
if (isset($title)) {
$title = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
}
return $title;
}
// 挂载到 document_title 过滤钩子
add_filter('document_title', 'wpdx_decode_title_entities');
原理说明
- <code>html_entity_decode($title, ENT_QUOTES, 'UTF-8')</code>:将 HTML 实体(如 <code>–</code>、<code>&</code>)解码为原始字符(<code>-</code>、<code>&</code>),<code>ENT_QUOTES</code> 参数确保同时处理单引号和双引号实体,<code>UTF-8</code> 保证中文等多字节字符正常显示。
- <code>document_title</code> 钩子:仅在标题输出前触发,不影响其他内容(如正文、评论)的转义逻辑,安全性与灵活性兼顾。
通过以上方法,即可精准解决 Title 标题特殊符号转义问题,且不影响 WordPress 整体安全性。

评论(0)