无法用含长破折号的字符串替换wp_get_document_title()文本的问题
WordPress标题替换失效的原因及解决办法
可能的原因
- 空格/分隔符匹配问题:你代码中硬编码的
" – "(长破折号前后各一个空格),和wp_get_document_title()返回标题里的分隔符格式可能不一致——比如实际标题里是全角空格、多个空格,或者分隔符前后无空格,导致str_replace找不到匹配项。 - 字符编码隐性差异:即使肉眼看是长破折号,不同环境下可能存在Unicode编码变体(比如某些相似字符的编码不同),或UTF-8 BOM干扰,导致字符不匹配。
- 站点名称的额外处理:
get_bloginfo('name')返回的内容可能被WordPress过滤(比如转义HTML字符),或包含不可见字符,拼接后的$maintitle和实际标题中的站点名称部分不匹配。
解决办法
方法1:用正则表达式兼容多种分隔符
正则能匹配不同的空格、分隔符变体,适配更多场景:
$site_name = get_bloginfo('name'); // 匹配站点名称前的任意空格+分隔符(长/短破折号)+任意空格,替换为空 $res = preg_replace('/\s*[–-]\s*' . preg_quote($site_name, '/') . '$/', '', wp_get_document_title());
方法2:排查字符差异
先输出原始内容的编码,明确问题所在:
// 输出原始内容对比 echo '文档标题:' . wp_get_document_title() . '<br>'; echo '待替换内容:' . $maintitle . '<br>'; // 输出十六进制编码,精准对比字符 echo '文档标题编码:' . bin2hex(wp_get_document_title()) . '<br>'; echo '替换内容编码:' . bin2hex($maintitle) . '<br>';
通过对比十六进制编码,就能快速定位是空格、字符还是编码的问题。
方法3:按固定结构分割标题
如果标题结构稳定为[页面标题] – [站点名称],可以直接分割:
$title_parts = explode(' – ', wp_get_document_title()); $res = count($title_parts) >= 2 ? trim($title_parts[0]) : wp_get_document_title();
注意这里的分隔符要和实际标题中的完全一致,若有差异可调整分割符。
内容的提问来源于stack exchange,提问作者creators
相关产品推荐
相关产品推荐

