问题背景
本站从 Hueman 主题切换到 WordPress 官方 2025 主题(Twenty Twenty-Five)后,网站需要支持中英双语,使用了 Polylang 插件实现国际化。切换完成后发现一个怪异的问题:标签云、分类列表等组件的链接都能正确带上 /en/ 语言目录,唯独日历小工具的链接“掉队”了。
在英文页面(https://www.shuijingwanwq.com/en/)中,日历上每个日期点击后跳转的链接仍然是 https://www.shuijingwanwq.com/2026/06/08/ 的形式,而不是预期的 https://www.shuijingwanwq.com/en/2026/06/08/。

这个问题会导致用户从英文版日历点击日期后,跳转到中文版(默认语言)的日期归档页面,而不是对应的英文日期归档,严重影响多语言站点的用户体验。
问题根源分析
为什么只有日历“掉队”?
经过排查发现,WordPress 默认的日历小工具在生成日期链接时,并没有使用标准的、兼容多语言的 home_url() 函数,而是采用了 get_day_link()、get_month_link() 等更底层的函数。这些函数在生成链接时,不会主动考虑 Polylang 等插件添加的语言目录前缀(如 /en/)。
而标签云、分类列表等其他组件工作正常,是因为它们正确地使用了能识别当前语言环境的函数来生成链接。因此,无论 Polylang 如何设置,日历都“固执”地生成不带语言代码的链接。
Polylang 配置确认
在动手之前,先确认了 Polylang 的基础设置是正确的:
- 固定链接结构:
设置 > 固定链接选择了“自定义结构”https://www.shuijingwanwq.com /%year%/%monthnum%/%day%/%post_id%/ - URL 修改设置:
语言 > 设置 > 网址修改中已勾选“根据固定链接中的目录名称设置语言” - 默认语言:中文(
zh)作为默认语言,URL 中不显示/zh/目录
调试代码也验证了语言识别正常:
- 中文首页:
<!-- Polylang Current Language: zh --> - 英文首页:
<!-- Polylang Current Language: en -->
既然 Polylang 设置无误,问题就出在日历小工具本身——需要通过代码来“手动”修正日历链接。
解决方案:使用 WPCode 插件添加自定义代码
直接修改主题的 functions.php 文件虽然可行,但主题更新时修改会丢失。更推荐使用 WPCode 插件来安全地添加自定义代码片段。
第一步:安装 WPCode 插件
在 WordPress 后台,进入 插件 > 安装插件,搜索 WPCode,找到后点击“立即安装”并激活。

WPCode 是一个代码管理插件,可以安全地在 WordPress 中添加各种代码片段(PHP、CSS、JavaScript、HTML 等),而无需直接修改主题文件。
第二步:进入 Code Snippets 并添加新片段
激活 WPCode 后,在左侧菜单进入 Code Snippets(代码片段),点击顶部的 Add Snippet(添加片段)按钮。

在页面中,找到并点击 Add Your Custom Code (New Snippet) 卡片,即“create your own”的入口。
第三步:选择 PHP Snippet 类型
点击后,会弹出 Create Custom Snippet 窗口。在该窗口中,你会看到多个代码类型卡片,如 HTML Snippet、Text Snippet、CSS Snippet、JavaScript Snippet、PHP Snippet、Universal Snippet 等。
直接点击 PHP Snippet 卡片,选择 PHP 代码片段类型。

第四步:粘贴修复代码并设置
在编辑界面中,填写 标题(如“修复多语言日历链接”),然后将以下修复代码完整粘贴到 Code Preview 代码框中:
<?php
/**
* 为 WordPress 默认日历小工具的所有日期链接添加 Polylang 语言前缀
* 仅在英文(en)页面生效,中文页面保持原样
*/
function fix_calendar_links_with_polylang( $calendar_output ) {
// 1. 检查 Polylang 函数是否存在,且不在后台
if ( function_exists( 'pll_current_language' ) && ! is_admin() ) {
// 2. 获取当前语言
$current_lang = pll_current_language();
// 3. 只在英文页面进行替换
if ( $current_lang === 'en' ) {
// 4. 获取不带语言前缀的主页 URL(用于匹配旧链接)
$home_url = home_url( '/' );
// 5. 构建包含 /en/ 的正确主页 URL
$correct_home_url = str_replace( 'https://www.shuijingwanwq.com/', 'https://www.shuijingwanwq.com/en/', $home_url );
// 6. 在日历HTML中,将所有旧链接替换为新的
$calendar_output = str_replace( $home_url, $correct_home_url, $calendar_output );
}
}
return $calendar_output;
}
add_filter( 'get_calendar', 'fix_calendar_links_with_polylang' );
代码说明:
- 第 3 行的
if ( $current_lang === 'en' )确保替换操作仅在英文页面执行,中文页面不受影响 - 第 5 行构建包含
/en/的正确链接 - 第 6 行执行链接替换
插入位置设置:
在编辑界面下方的 Insertion 区域:
- Insert Method:选择 Auto Insert(自动插入)
- Location:选择 Frontend Only(仅前端),确保代码只在网站前台生效,更安全

完成设置后,将右上角的开关从 Inactive 切换为 Active(激活),点击 Save Snippet(保存片段)。
第五步:清除缓存
代码生效后,务必清除所有缓存:
- WPCode 不需要额外操作,代码保存即生效
- W3 Total Cache:进入插件设置,点击“清除所有缓存”
- 浏览器缓存:按
Ctrl + Shift + R(Windows/Linux)或Cmd + Shift + R(Mac)强制刷新 - 如果使用了 CDN(如 Cloudflare),也请清除 CDN 缓存
最终验证结果
修复完成后,分别访问中文首页和英文首页,验证日历链接:
| 页面 | 修复前 | 修复后 |
|---|---|---|
中文首页 (/) | https://.../2026/06/16/ ✅ | https://.../2026/06/16/ ✅ |
英文首页 (/en/) | https://.../2026/06/16/ ❌ | https://.../en/2026/06/16/ ✅ |

踩坑记录与关键要点
踩坑 1:第一版代码导致 /en/en/ 重复
最初版本的代码在替换时,没有判断当前页面是否已经包含语言目录,导致在英文页面中,链接被错误地从 https://.../en/2026/... 再次替换为 https://.../en/en/2026/...。
解决方案:在替换逻辑中,只针对不包含语言前缀的链接进行处理。
踩坑 2:中文页面被错误添加 /en/
由于中文(zh)作为默认语言,URL 中不包含 /zh/ 目录,而之前的代码没有限制仅对英文页面生效,导致中文页面的日历链接也被错误地加上了 /en/。
解决方案:增加 if ( $current_lang === 'en' ) 判断,只在英文页面执行替换操作。
关键要点总结
- WordPress 默认日历小工具生成链接时不兼容 Polylang 的语言目录,需要通过
get_calendar过滤器手动修正 - 使用 WPCode 插件添加代码比直接修改
functions.php更安全、更易于管理 - 务必判断当前语言,只对需要修正的语言(如英文)执行替换,避免影响默认语言页面
- 代码修改后记得清除所有缓存,包括插件缓存、浏览器缓存和 CDN 缓存

发表回复