前言
导航站的多语言支持是基础功能之一。
由于 OneNav 基于 WordPress 的一个主题,所以通过 Polylang 这个 WordPress 插件来实现即可。
需要注意:你的一篇内容要支持几种语言,就要创建几篇文章。
Polylang 是 WordPress 建站平台上的一款免费的建立多语言网站版本的插件,它允许您创建双语或多语言 WordPress 网站。您可以在正常编写帖子,页面并创建类别和帖子标签后,为它们再创建一份别国语言的内容。
方案概述
- 安装 Polylang 插件
- 设置站点默认语言
- 设置其他语言的 URL 形式
- 在页面上添加切换语言的按钮
- 为一篇内容写多篇不同语言文章
- 分析文章的表数据
操作步骤
一、安装 Polylang 插件
选择插件 -> 安装新插件 -> 搜索 Polylang -> 安装并启用:

之后选择启用,会进入设置界面:



二、设置站点默认语言
在语言列表中,将哪个语言标 ⭐ 就是代表其为默认语言:

三、设置其他语言的 URL 形式
选择:
- ✅ 根据固定链接中的目录名称设置语言
- ✅ 为默认语言隐藏网址中的语言信息,比如默认为中文时,不要在网址中添加 /zh/ 部分
- ✅ 移除固定链接中的 /language/ 部分

之后,各个语言的文章链接就会类似于:
- 中文:
https://my.blog.com/2024/10/17/my_first_post/ - 日文:
https://my.blog.com/ja/2024/10/17/my_first_post/ - 英文:
https://my.blog.com/en/2024/10/17/my_first_post/
这对于你的主要用户群体来说是非常友好的。
四、在页面上添加切换语言的按钮
官方的 WordPress 主题中是没有 小工具 这一概念的,而 Polylang 的语言切换工具需要通过小工具来添加的。
我这里省事,安装个带小工具的第三方主题:

在自定义页面添加 语言切换器 小工具:

点击完成,之后发布,再回到页面上就可以看到切换语言的按钮了:

这里由于我目前只有一篇中文文章,所以只有中文按钮。
五、为一篇内容写多篇不同语言文章
这里先创建一篇中文文章:
直接写文章的话,会自动保存为你的默认语言。我这里是中文。


然后点击英文下面的加号,创建一篇对应的英文文章:


同样点击加号,再创建一篇日语文章:


之后回到页面上,就能通过切换语言看到对应的文章了:

六、分析文章的表数据
为了二开做准备,单纯使用插件的话可以不了解。
1、中文文章

-
wp_posts表:ID post_author post_date post_date_gmt post_content post_title post_excerpt post_status comment_status ping_status post_password post_name to_ping pinged post_modified post_modified_gmt post_content_filtered post_parent guid menu_order post_type post_mime_type comment_count 31 1 2024-10-18 11:04:21 2024-10-18 03:04:21 中文文章的内容。 这是中文文章的标题 publish open closed %e8%bf%99%e6%98%af%e4%b8%ad%e6%96%87%e6%96%87%e7%ab%a0%e7%9a%84%e6%a0%87%e9%a2%98 2024-10-18 11:04:21 2024-10-18 03:04:21 0 https://test.steam.cash/?p=31 0 post 0 32 1 2024-10-18 11:04:21 2024-10-18 03:04:21 中文文章的内容。 这是中文文章的标题 inherit closed closed 31-revision-v1 2024-10-18 11:04:21 2024-10-18 03:04:21 31 https://test.steam.cash/?p=32 0 revision 0 -
wp_postmeta表:post_id为32的没有数据。meta_id post_id meta_key meta_value 262 31 views 0 263 31 _down_count 0 264 31 _like_count 0 265 31 _star_count 0 266 31 _user_purview_level all 267 31 _edit_last 1 268 31 _edit_lock 1729220662:1 269 31 _seo_title 270 31 _seo_metakey 271 31 _seo_desc 272 31 sidebar_layout default 273 31 buy_option a:7:{s:8:""buy_type"";s:4:""view"";s:5:""limit"";s:3:""all"";s:8:""pay_type"";s:5:""money"";s:10:""price_type"";s:6:""single"";s:9:""pay_title"";s:0:"""";s:9:""pay_price"";s:1:""0"";s:5:""price"";s:1:""0"";}
这里在 wp_posts 建立了两张表,其中 post_id 为 32 的数据是子数据。
而 post_id 等于 31 的则是父数据,且在 wp_postmeta 中拥有完整的元数据(特征信息)。
比较让我惊奇的是,居然没有在
wp_postmeta表中建立一行来标记文章的语言属性。
2、英文文章

-
wp_posts表:ID post_author post_date post_date_gmt post_content post_title post_excerpt post_status comment_status ping_status post_password post_name to_ping pinged post_modified post_modified_gmt post_content_filtered post_parent guid menu_order post_type post_mime_type comment_count 33 1 2024-10-18 11:19:57 2024-10-18 03:19:57 English content. English title publish open closed english-title 2024-10-18 11:19:57 2024-10-18 03:19:57 0 https://test.steam.cash/?p=33 0 post 0 34 1 2024-10-18 11:19:57 2024-10-18 03:19:57 English content. English title inherit closed closed 33-revision-v1 2024-10-18 11:19:57 2024-10-18 03:19:57 33 https://test.steam.cash/?p=34 0 revision 0 -
wp_postmeta表:post_id为34的没有数据。meta_id post_id meta_key meta_value 274 33 views 0 275 33 _down_count 0 276 33 _like_count 0 277 33 _star_count 0 278 33 _user_purview_level all 279 33 sidebar_layout default 280 33 buy_option a:7:{s:8:""buy_type"";s:4:""view"";s:5:""limit"";s:3:""all"";s:8:""pay_type"";s:5:""money"";s:10:""price_type"";s:6:""single"";s:9:""pay_title"";s:0:"""";s:9:""pay_price"";s:1:""0"";s:5:""price"";s:1:""0"";} 281 33 _edit_last 1 282 33 _edit_lock 1729221598:1 283 33 _seo_title 284 33 _seo_metakey 285 33 _seo_desc
与中文文章的表数据看起来没什么差别。
3、日语文章

-
wp_posts表:ID post_author post_date post_date_gmt post_content post_title post_excerpt post_status comment_status ping_status post_password post_name to_ping pinged post_modified post_modified_gmt post_content_filtered post_parent guid menu_order post_type post_mime_type comment_count 36 1 2024-10-18 11:34:08 2024-10-18 03:34:08 日本語内容。 日本語文章 publish open closed %e6%97%a5%e6%9c%ac%e8%aa%9e%e6%96%87%e7%ab%a0 2024-10-18 11:34:08 2024-10-18 03:34:08 0 https://test.steam.cash/?p=36 0 post 0 37 1 2024-10-18 11:34:08 2024-10-18 03:34:08 日本語内容。 日本語文章 inherit closed closed 36-revision-v1 2024-10-18 11:34:08 2024-10-18 03:34:08 36 https://test.steam.cash/?p=37 0 revision 0 -
wp_postmeta表:post_id为37的没有数据。meta_id post_id meta_key meta_value 291 36 views 0 292 36 _down_count 0 293 36 _like_count 0 294 36 _star_count 0 295 36 _user_purview_level all 296 36 sidebar_layout default 297 36 buy_option a:7:{s:8:""buy_type"";s:4:""view"";s:5:""limit"";s:3:""all"";s:8:""pay_type"";s:5:""money"";s:10:""price_type"";s:6:""single"";s:9:""pay_title"";s:0:"""";s:9:""pay_price"";s:1:""0"";s:5:""price"";s:1:""0"";} 298 36 _edit_last 1 299 36 _edit_lock 1729222449:1 300 36 _seo_title 301 36 _seo_metakey 302 36 _seo_desc
与中文文章的表数据看起来依然没什么差别。
4、连接结构
既然 wp_posts 表中不记录语言和其他文章的连接信息。
那么问题就来了,下面这样将多个语言的文章连接的数据是记录在哪里的呢?

翻了下目录和标签相关的 wp_terms 表,在 wp_term_taxonomy 表中找到了这么一条数据:
| term_taxonomy_id | term_id | taxonomy | description | parent | count |
|---|---|---|---|---|---|
| 22 | 22 | post_translations | a:3:{s:2:""en"";i:33;s:2:""zh"";i:31;s:2:""ja"";i:36;} | 0 | 3 |
那么很显然,一篇内容的各语言版本文章是通过目录或标签的形式连接在一起的。
再看下其他表的信息:
-
wp_terms表:term_id name slug term_group 22 pll_6711d3dd4efb0 pll_6711d3dd4efb0 0 -
wp_term_relationships表:object_id term_taxonomy_id term_order 31 1 0 31 2 0 31 22 0 33 9 0 33 19 0 33 22 0 36 5 0 36 7 0 36 22 0
wp_terms 表中的 name 和 slug 字段应该是自动生成的,一般情况下用户也看不见就不用去管了。
wp_term_relationships 表中的数据和 wp_posts 表中的文章 ID 可以匹配上:
- 中文文章
post_id:31 - 英文文章
post_id:33 - 日语文章
post_id:36
其中 1、2、9、19、5 和 7 的分类或标签,分别对应各语言和各语言的“未分类”组。
参考资料: