WP 博客多语言化实操
(5) 博客菜单翻译实操
在将 WordPress 英文站从 www.shuijingwanwq.com/en/ 迁移到独立子域名 en.shuijingwanwq.com 后,英文文章页和首页已经可以正常访问,但继续检查首页及分类归档页时,我发现部分区块生成的链接仍然指向中文主域名或旧 /en/ 路径。
其中最明显的问题是英文首页的分类下拉列表。选择 Browser 分类后,浏览器访问的并不是英文分类页,而是:
https://www.shuijingwanwq.com/?category_name=browser-en
最终返回 404。
继续排查后发现,这并不是一个孤立链接,而是涉及分类下拉列表、站点标题、页脚菜单、英文导航、面包屑和不同模板中的固定链接。
本文记录整个检查、修复和验证过程。
一、当前多域名结构
站点使用 WordPress、Polylang、Twenty Twenty-Five 和 W3 Total Cache。
当前语言与域名关系如下:
中文站:
https://www.shuijingwanwq.com/
英文站:
https://en.shuijingwanwq.com/
英文站此前位于:
https://www.shuijingwanwq.com/en/
完成子域名迁移后,Nginx 中仍保留旧 /en/ 路径的 301 兼容规则,因此部分旧链接虽然还能打开,但会多一次跳转。
此前还排查过英文日历链接被拼接成双重 URL 的问题:
https://www.shuijingwanwq.com/2026/07/11/19354/
这次发现的问题与日历问题有相似之处:区块内容已经识别为英文,但部分动态链接仍然使用 WordPress 默认的中文站首页地址。
二、最初发现:英文分类下拉列表返回 404
在英文首页的分类下拉列表中选择 Browser 后,浏览器跳转到:
https://www.shuijingwanwq.com/?category_name=browser-en
响应状态为:
404
但英文分类的正确查询地址应该是:
https://en.shuijingwanwq.com/?category_name=browser-en
它会进一步跳转到正式分类归档:
https://en.shuijingwanwq.com/category/application-tool-en/browser-en/
并正常返回 200。
这说明:
- 英文分类别名
browser-en是正确的; - 分类数据本身没有丢失;
- 固定链接规则没有损坏;
- 真正错误的是分类下拉列表使用了中文主域名。
三、检查分类下拉区块
在主题编辑器中找到“分类列表”区块,可以看到它使用的是 WordPress 分类目录,并启用了“以下拉菜单显示”。

该区块可以设置:
- 是否以下拉菜单显示;
- 是否显示文章数目;
- 是否只显示顶级术语;
- 是否显示空术语;
- 是否显示层级关系。
但是没有设置跳转域名的入口。
英文页面输出的分类选项本身是正确的:
<option value="browser-en">Browser (32)</option>
问题出在 WordPress 自动生成的下拉跳转脚本:
[
"wp-block-categories-1",
"https://www.shuijingwanwq.com"
]
当用户选择 Browser 时,脚本会把分类别名拼接到中文首页:
https://www.shuijingwanwq.com/?category_name=browser-en
英文首页共输出 742 个分类选项,其中 735 个分类别名以 -en 结尾。因此这不是一个分类的错误,而是整份英文分类下拉列表都存在域名错误。
四、为什么没有全局修改 home_url()
一种看似直接的解决方案是:当请求来自 en.shuijingwanwq.com 时,把 WordPress 的 home_url() 全局修改为英文域名。
这种方案可能修复部分动态链接,但无法修复所有问题。
站点中的链接主要分为两类。
1. 动态生成的链接
例如:
- 分类下拉列表;
- 站点标题;
- 面包屑 Home;
- 部分搜索、归档和区块链接。
这类链接可能在渲染时调用 home_url() 或类似函数。
2. 保存在区块或导航中的固定链接
例如:
https://www.shuijingwanwq.com/en/
或者:
/en
这类链接已经写入导航区块、段落或模板内容。全局修改 home_url() 不会自动改写它们。
同时,全局过滤 home_url() 还可能影响:
- REST API;
- 登录和注销跳转;
- AJAX 请求;
- 表单提交;
- 后台预览;
- 插件回调地址;
- Polylang 域名判断;
- W3 Total Cache 缓存键。
因此最终采用了“动态链接定向修复 + 固定链接逐项修改”的方式。
五、第一次尝试:使用 render_block_core/categories
最初尝试通过 render_block_core/categories 过滤分类区块输出,将中文首页替换为当前语言首页。
但检查源站动态响应后发现,WordPress 自动生成的分类跳转脚本并不在过滤器能够修改的区块 HTML 中。
过滤器执行完成后,相关 JavaScript 才被追加到页面。
因此,页面仍然输出:
[
"wp-block-categories-1",
"https://www.shuijingwanwq.com"
]
这次尝试没有生效。
六、第二次尝试:使用 PHP 输出缓冲替换最终 HTML
随后尝试在 template_redirect 中启动输出缓冲,对最终 HTML 中的分类脚本进行正则替换。
但在当前 W3 Total Cache 输出缓冲环境下,替换仍然没有出现在最终响应中。
即使使用:
- Cloudflare MISS 请求;
- 带唯一查询参数的请求;
- POST 动态请求;
最终 HTML 仍然保留原始中文域名。
这说明在当前缓存和输出缓冲组合下,直接改写完整 HTML 不够稳定。
七、最终方案:在前端接管分类下拉事件
最终没有继续修改 WordPress 原始脚本,而是在分类下拉列表发生变化时,优先接管 change 事件。
新建 WPCode PHP 代码片段:
修复非默认语言站分类下拉列表跳转域名
最终代码如下:
add_action(
'wp_footer',
function () {
?>
<script id="swq-fix-category-dropdown-domain">
document.addEventListener('DOMContentLoaded', function () {
document
.querySelectorAll(
'select[name="category_name"][id^="wp-block-categories-"]'
)
.forEach(function (dropdown) {
dropdown.addEventListener(
'change',
function (event) {
if (
!dropdown.value ||
dropdown.value === '-1'
) {
return;
}
event.stopImmediatePropagation();
const url = new URL(
window.location.origin
);
url.searchParams.set(
dropdown.name,
dropdown.value
);
window.location.href = url.href;
},
true
);
});
});
</script>
<?php
},
100
);
WPCode 设置为:
Code Type:PHP Snippet
Insert Method:Auto Insert
Location:Run Everywhere
Status:Active
虽然 Location 使用 Run Everywhere,但代码挂载的是:
wp_footer
它只会在调用 wp_footer() 的前台页面输出补丁,不会通过 admin_footer 在 WordPress 后台输出。
这段代码没有写死英文域名,而是使用:
window.location.origin
因此:
- 中文站自动使用
https://www.shuijingwanwq.com; - 英文站自动使用
https://en.shuijingwanwq.com; - 以后增加其他语言域名也可以自动适配。
八、WPCode 已启用,但英文域名没有加载代码
启用代码片段后,检查结果一度表现为:
www.shuijingwanwq.com:补丁正常输出
en.shuijingwanwq.com:补丁没有输出
这说明代码本身没有语法问题,WPCode 片段也已经启用,但英文域名仍然读取旧的对象缓存。
这与此前 Polylang 多域名环境中出现的 W3 Total Cache Object Cache 问题一致。
使用此前准备的按 Host 清理对象缓存脚本:
/root/bin/w3tc-flush-host-object-cache \
en.shuijingwanwq.com
执行结果:
已按以下 Host 启动 WordPress,并调用 W3TC Object Cache 清理:
en.shuijingwanwq.com
刷新英文 Host 对象缓存后,英文源站终于输出:
<script id="swq-fix-category-dropdown-domain">
真实浏览器测试结果为:
选择 Browser
→ https://en.shuijingwanwq.com/category/application-tool-en/browser-en/
→ 200
分类下拉问题修复成功。
九、继续检查英文首页中的其他链接
修复分类下拉后,我继续检查英文首页的所有普通链接和动态控件。
检查范围包括:
- 普通
<a>链接; - 分类下拉列表;
- 归档下拉列表;
- 顶部导航;
- 页脚导航;
- 站点标题;
- 日历;
- 分页;
- 搜索表单;
- 中英文语言切换。
随后又发现了多处旧链接。
十、修复页脚 Blog 链接
英文页脚中的 Blog 链接原来是:
https://en.shuijingwanwq.com/en
这个地址没有进入英文首页,而是被 WordPress 识别为内容别名,最终跳转到一篇 2019 年的文章:
https://en.shuijingwanwq.com/2019/07/17/15210/
在页脚模板组件中可以看到,中英文菜单分别由两个 Language Visibility 区块控制。

英文 Blog 使用的是自定义链接:
/en
将它修改为:
/

保存模板并刷新英文 Host 对象缓存后,英文源站输出变为:
<a href="/" target="_blank">
<span>Blog</span>
</a>
它会直接进入当前英文域名首页。
十一、修复顶部和底部站点标题
英文页面顶部和底部的 Yongye 站点标题原来都指向:
https://www.shuijingwanwq.com/
点击后会进入中文首页。
在主题编辑器中检查“站点标题”区块,右侧只有:
- 将标题链接到主页;
- 在新窗口打开。
没有手动设置首页 URL 的入口。

因此,新建 WPCode 代码片段修复多域名首页链接。
后续面包屑 Home 也出现相同问题,所以最终代码片段名称调整为:
修复多域名动态首页链接
最终代码如下:
add_action(
'wp_footer',
function () {
?>
<script id="swq-fix-multidomain-home-links">
document.addEventListener('DOMContentLoaded', function () {
document
.querySelectorAll(
[
'.wp-block-site-title a',
'.wp-block-breadcrumbs ol > li:first-child a'
].join(',')
)
.forEach(function (link) {
link.href = window.location.origin + '/';
});
});
</script>
<?php
},
100
);
WPCode 设置为:
Code Type:PHP Snippet
Insert Method:Auto Insert
Location:Run Everywhere
Status:Active
它会把站点标题和面包屑首页链接统一修正为当前页面所在域名的首页。
英文页面验证结果:
顶部 Yongye
→ https://en.shuijingwanwq.com/
底部 Yongye
→ https://en.shuijingwanwq.com/
十二、修复顶部英文 Home 菜单
英文顶部导航中的 Home 原来关联旧英文首页页面:
https://www.shuijingwanwq.com/en/

虽然 Nginx 可以将它 301 到英文子域名,但这会产生一次不必要的跳转。
在英文主菜单中把 Home 改为自定义相对链接:
/

保存并刷新英文 Host 对象缓存后,源站输出变为:
<a href="/">Home</a>
十三、修复博客首页中的 About Me & Contact
英文博客首页个人品牌区域中的链接原来是:
https://www.shuijingwanwq.com/en/about-me-contact-2/
该内容位于英文专用的 Language Visibility 区块中,因此可以单独修改,不会影响中文链接。

将它修改为:
/about-me-contact-2/
保存并刷新英文 Host 对象缓存后,英文源站输出:
<a href="/about-me-contact-2/">
👉 About Me & Contact
</a>
十四、检查英文分类归档页
完成英文首页修复后,继续检查:
https://en.shuijingwanwq.com/category/programming-language-en/
基础检查结果:
HTTP:200
lang:en-US
canonical:https://en.shuijingwanwq.com/category/programming-language-en/
页面标题:Programming Language Category Archives - Yongye
H1:Category: Programming Language
分页链接也正确使用英文域名:
https://en.shuijingwanwq.com/category/programming-language-en/page/2/
分类下拉列表实际选择 Browser 后,也能进入:
https://en.shuijingwanwq.com/category/application-tool-en/browser-en/
十五、分类页又发现两个独立问题
虽然英文首页已经正常,但分类归档使用的是“所有归档”模板,因此还存在两处旧链接:
- 面包屑 Home 指向中文首页;
- 分类模板侧栏的 About Me & Contact 仍指向旧
/en/地址。
这说明 WordPress 区块主题中的不同模板可能包含看起来相同、但实际彼此独立的区块内容。
修改博客首页模板,不会自动修改所有归档模板。
十六、修复面包屑 Home
主题编辑器中的面包屑区块只能设置:
- 是否显示首页面包屑;
- 是否显示当前页面;
- 分隔符。

它没有首页 URL 设置项。
前台结构为:
<nav class="wp-block-breadcrumbs">
<ol>
<li>
<a href="https://www.shuijingwanwq.com/">
Home
</a>
</li>
</ol>
</nav>
因此将 .wp-block-breadcrumbs 加入前面的“修复多域名动态首页链接”代码片段。
修复后:
面包屑 Home
→ https://en.shuijingwanwq.com/
十七、修复所有归档模板中的 About 链接
在“所有归档”模板中找到英文 Language Visibility 下的 About Me & Contact,将:
https://www.shuijingwanwq.com/en/about-me-contact-2/
修改为:
/about-me-contact-2/
保存模板并再次刷新英文 Host 对象缓存。
十八、最终验证结果
对英文首页和英文分类归档页进行最终复查。
英文分类页:
https://en.shuijingwanwq.com/category/programming-language-en/
最终结果如下:
HTTP 状态:200
页面语言:en-US
canonical:正确
H1:Category: Programming Language
面包屑 Home:英文首页
顶部 Yongye:英文首页
底部 Yongye:英文首页
Header Home:英文首页
Footer Blog:英文首页
About Me & Contact:英文页面
分类下拉列表:正常
分类分页:正常
错误链接统计:
错误指向 www 中文域名:0
旧 www/en/ 路径:0
en.shuijingwanwq.com/en:0
页面中唯一仍然指向 www.shuijingwanwq.com 的链接是:
中文(中国)
这是正常的语言切换链接。
十九、Cloudflare 缓存的处理策略
修复过程中,Cloudflare 中已经缓存的旧页面不会立即包含新代码。
由于分类下拉列表、站点标题和侧栏存在于大量页面中,如果逐个清理 URL,工作量很大。
最终采用的策略是:
- 确认英文源站动态响应已经正常;
- 使用 POST、唯一查询参数或缓存 MISS 请求验证新输出;
- 不清理整个 Cloudflare 缓存;
- 让现有页面缓存自然过期;
- 新生成或缓存到期后的页面自动包含补丁。
因此在过渡期内,少量旧缓存页面仍可能暂时出现旧链接,但不会影响源站最终状态。
二十、这次排查得到的经验
1. 多域名迁移完成不代表模板链接全部完成迁移
即使 Polylang、Nginx、canonical 和文章链接都已经正常,区块模板中仍可能保留:
- 旧绝对 URL;
- 旧
/en/路径; - 默认语言
home_url(); - 导航中的旧页面关联。
2. 动态链接和固定链接需要分别处理
动态链接适合通过小范围代码补丁修复。
固定链接应直接在对应模板或导航区块中修改。
3. 区块主题的不同模板内容彼此独立
博客首页模板、所有归档模板、页眉模板组件和页脚模板组件可能分别保存自己的区块内容。
修改一个模板中的 About 链接,不代表其他模板中的同类链接也会自动更新。
4. WPCode 更新后,应关注对象缓存
在当前 W3 Total Cache 多域名环境中,WPCode 保存成功不代表其他 Host 会立即读取最新代码片段。
如果出现:
www 域名已经加载
en 域名没有加载
应优先检查当前 Host 的 Object Cache,而不是继续修改代码。
5. 不要仅依赖页面能否打开
旧链接可能通过 301 继续工作,但仍会带来:
- 多余跳转;
- 错误语言切换;
- 缓存复杂度增加;
- 搜索引擎抓取路径不统一;
- 后续规则维护困难。
最终检查应同时关注:
- 原始
href; - HTTP 状态码;
- 最终 URL;
- 重定向次数;
- 页面语言;
- canonical;
- 实际浏览器交互。
二十一、总结
这次问题最初只是英文分类下拉列表返回 404,但完整检查后发现,它涉及多个不同层次:
Polylang 语言域名
WordPress 区块动态脚本
区块主题模板
Language Visibility
导航固定链接
面包屑首页链接
WPCode
W3 Total Cache Object Cache
Cloudflare 页面缓存
最终采用的方案是:
- 用前端事件补丁修复分类下拉列表;
- 用当前域名修复站点标题和面包屑 Home;
- 在英文菜单中把 Home 和 Blog 改为
/; - 将英文 About 链接改为相对路径;
- 分别检查博客首页和所有归档模板;
- 按 Host 刷新 W3 Total Cache Object Cache;
- 让 Cloudflare 旧缓存自然过期。
最终英文首页和英文分类归档页都不再包含错误的中文域名或旧 /en/ 链接,分类下拉、分页、面包屑和导航均恢复正常。
WordPress 网站维护、性能优化与博客运营咨询
本站已持续运营超过 10 年,累计发布 1000+ 篇原创技术文章,长期实践 WordPress 网站建设、CDN / Cloudflare 配置、缓存优化、Google SEO、广告变现和多语言网站运营。
如果你的 WordPress 网站遇到访问慢、缓存异常、插件冲突、广告不显示、SEO 基础结构混乱、CDN 配置不确定等问题,可以联系我做一次远程技术排查。
适合以下用户:
✅ 个人博客站长
✅ WordPress 网站运营者
✅ 独立开发者与内容创作者
✅ SaaS 产品官网运营团队
✅ 希望优化网站速度与稳定性的站点
服务内容:
✅ WordPress 速度优化
✅ Cloudflare / CDN / 缓存配置排查
✅ 插件冲突与页面异常排查
✅ AdSense 广告显示问题排查
✅ SEO 基础结构检查
✅ 博客运营与商业化咨询
如需了解方案或交流相关问题,请直接联系我,并注明:WordPress 维护咨询。
联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com


发表回复