Skip to content
Go back

WordPress 使用 Polylang 插件实现文章多语言支持(国际化)并分析表数据

| 0 Views Edit page

前言

导航站的多语言支持是基础功能之一。
由于 OneNav 基于 WordPress 的一个主题,所以通过 Polylang 这个 WordPress 插件来实现即可。
需要注意:你的一篇内容要支持几种语言,就要创建几篇文章

Polylang 是 WordPress 建站平台上的一款免费的建立多语言网站版本的插件,它允许您创建双语或多语言 WordPress 网站。您可以在正常编写帖子,页面并创建类别和帖子标签后,为它们再创建一份别国语言的内容。


方案概述

  1. 安装 Polylang 插件
  2. 设置站点默认语言
  3. 设置其他语言的 URL 形式
  4. 在页面上添加切换语言的按钮
  5. 为一篇内容写多篇不同语言文章
  6. 分析文章的表数据

操作步骤

一、安装 Polylang 插件

选择插件 -> 安装新插件 -> 搜索 Polylang -> 安装并启用:
安装 Polylang 插件
之后选择启用,会进入设置界面:
中文、日文和英文
默认语言是中文
安装成功

二、设置站点默认语言

在语言列表中,将哪个语言标 ⭐ 就是代表其为默认语言:
默认语言

三、设置其他语言的 URL 形式

选择:

  • ✅ 根据固定链接中的目录名称设置语言
  • ✅ 为默认语言隐藏网址中的语言信息,比如默认为中文时,不要在网址中添加 /zh/ 部分
  • ✅ 移除固定链接中的 /language/ 部分

URL 设置的最佳实践
之后,各个语言的文章链接就会类似于:

  • 中文: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 的语言切换工具需要通过小工具来添加的。
我这里省事,安装个带小工具的第三方主题:
Dashscroll
在自定义页面添加 语言切换器 小工具:
语言切换器
点击完成,之后发布,再回到页面上就可以看到切换语言的按钮了:
切换语言
这里由于我目前只有一篇中文文章,所以只有中文按钮。

五、为一篇内容写多篇不同语言文章

这里先创建一篇中文文章:

直接写文章的话,会自动保存为你的默认语言。我这里是中文。

写一篇默认语言文章
默认发布的文章是中文
然后点击英文下面的加号,创建一篇对应的英文文章:
写一篇英文文章
英语文章发布成功
同样点击加号,再创建一篇日语文章:
写一篇日语文章
日语文章发布成功

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

六、分析文章的表数据

为了二开做准备,单纯使用插件的话可以不了解。

1、中文文章

发布中文文章

  • wp_posts 表:

    IDpost_authorpost_datepost_date_gmtpost_contentpost_titlepost_excerptpost_statuscomment_statusping_statuspost_passwordpost_nameto_pingpingedpost_modifiedpost_modified_gmtpost_content_filteredpost_parentguidmenu_orderpost_typepost_mime_typecomment_count
    3112024-10-18 11:04:212024-10-18 03:04:21中文文章的内容。这是中文文章的标题publishopenclosed%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%982024-10-18 11:04:212024-10-18 03:04:210https://test.steam.cash/?p=310post0
    3212024-10-18 11:04:212024-10-18 03:04:21中文文章的内容。这是中文文章的标题inheritclosedclosed31-revision-v12024-10-18 11:04:212024-10-18 03:04:2131https://test.steam.cash/?p=320revision0
  • wp_postmeta 表:

    post_id32 的没有数据。

    meta_idpost_idmeta_keymeta_value
    26231views0
    26331_down_count0
    26431_like_count0
    26531_star_count0
    26631_user_purview_levelall
    26731_edit_last1
    26831_edit_lock1729220662:1
    26931_seo_title
    27031_seo_metakey
    27131_seo_desc
    27231sidebar_layoutdefault
    27331buy_optiona: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_id32 的数据是子数据。
post_id 等于 31 的则是父数据,且在 wp_postmeta 中拥有完整的元数据(特征信息)。

比较让我惊奇的是,居然没有在 wp_postmeta 表中建立一行来标记文章的语言属性。

2、英文文章

发布英文文章

  • wp_posts 表:

    IDpost_authorpost_datepost_date_gmtpost_contentpost_titlepost_excerptpost_statuscomment_statusping_statuspost_passwordpost_nameto_pingpingedpost_modifiedpost_modified_gmtpost_content_filteredpost_parentguidmenu_orderpost_typepost_mime_typecomment_count
    3312024-10-18 11:19:572024-10-18 03:19:57English content.English titlepublishopenclosedenglish-title2024-10-18 11:19:572024-10-18 03:19:570https://test.steam.cash/?p=330post0
    3412024-10-18 11:19:572024-10-18 03:19:57English content.English titleinheritclosedclosed33-revision-v12024-10-18 11:19:572024-10-18 03:19:5733https://test.steam.cash/?p=340revision0
  • wp_postmeta 表:

    post_id34 的没有数据。

    meta_idpost_idmeta_keymeta_value
    27433views0
    27533_down_count0
    27633_like_count0
    27733_star_count0
    27833_user_purview_levelall
    27933sidebar_layoutdefault
    28033buy_optiona: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"";}
    28133_edit_last1
    28233_edit_lock1729221598:1
    28333_seo_title
    28433_seo_metakey
    28533_seo_desc

与中文文章的表数据看起来没什么差别。

3、日语文章

发布日语文章

  • wp_posts 表:

    IDpost_authorpost_datepost_date_gmtpost_contentpost_titlepost_excerptpost_statuscomment_statusping_statuspost_passwordpost_nameto_pingpingedpost_modifiedpost_modified_gmtpost_content_filteredpost_parentguidmenu_orderpost_typepost_mime_typecomment_count
    3612024-10-18 11:34:082024-10-18 03:34:08日本語内容。日本語文章publishopenclosed%e6%97%a5%e6%9c%ac%e8%aa%9e%e6%96%87%e7%ab%a02024-10-18 11:34:082024-10-18 03:34:080https://test.steam.cash/?p=360post0
    3712024-10-18 11:34:082024-10-18 03:34:08日本語内容。日本語文章inheritclosedclosed36-revision-v12024-10-18 11:34:082024-10-18 03:34:0836https://test.steam.cash/?p=370revision0
  • wp_postmeta 表:

    post_id37 的没有数据。

    meta_idpost_idmeta_keymeta_value
    29136views0
    29236_down_count0
    29336_like_count0
    29436_star_count0
    29536_user_purview_levelall
    29636sidebar_layoutdefault
    29736buy_optiona: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"";}
    29836_edit_last1
    29936_edit_lock1729222449:1
    30036_seo_title
    30136_seo_metakey
    30236_seo_desc

与中文文章的表数据看起来依然没什么差别。

4、连接结构

既然 wp_posts 表中不记录语言和其他文章的连接信息
那么问题就来了,下面这样将多个语言的文章连接的数据是记录在哪里的呢?
文章多语言

翻了下目录和标签相关的 wp_terms 表,在 wp_term_taxonomy 表中找到了这么一条数据:

term_taxonomy_idterm_idtaxonomydescriptionparentcount
2222post_translationsa:3:{s:2:""en"";i:33;s:2:""zh"";i:31;s:2:""ja"";i:36;}03

那么很显然,一篇内容的各语言版本文章是通过目录或标签的形式连接在一起的。
再看下其他表的信息:

  • wp_terms 表:

    term_idnameslugterm_group
    22pll_6711d3dd4efb0pll_6711d3dd4efb00
  • wp_term_relationships 表:

    object_idterm_taxonomy_idterm_order
    3110
    3120
    31220
    3390
    33190
    33220
    3650
    3670
    36220

wp_terms 表中的 nameslug 字段应该是自动生成的,一般情况下用户也看不见就不用去管了。
wp_term_relationships 表中的数据和 wp_posts 表中的文章 ID 可以匹配上:

  • 中文文章 post_id31
  • 英文文章 post_id33
  • 日语文章 post_id36

其中 1291957 的分类或标签,分别对应各语言和各语言的“未分类”组。


参考资料:


Edit page