WPML

在 ElasticPress 集成中没有任何需要翻译的内容。兼容性插件会让 ElasticPress 自动返回特定语言的正确结果;您要做的就是安装这些组件,运行初始同步,并确认结果显示无误。

开始之前

在同一网站上安装并激活以下插件:

您还需要一个 Elasticsearch 端点:自托管,或托管服务(如 ElasticPress.io (在新标签页中打开)、Elastic Cloud 或 AWS OpenSearch)。根据您的 Elasticsearch 主机配置 ElasticPress,并在添加 WPML 层之前确认它在单语言网站上能成功建立索引。

在运行首次同步之前配置您的 WPML 语言。

按语言建立索引的工作原理

WPML ElasticPress 会为网站上的每种语言创建单独的 Elasticsearch 索引。每种语言的索引包含:

  • 每个可翻译文章类型的该语言译文。
  • 如果某个文章类型设置为在不存在翻译时回退到默认语言,则包含默认语言文章。
  • 不可翻译文章的副本。每种语言的索引都包含这些副本,以便它们能够出现在搜索结果中,无论访问者使用何种语言。

语言索引中的每个文档都会使用该语言进行分析。停用词、词干提取、缩写、复数和时态处理都是特定于语言的。这就是为什么法语搜索能匹配法语词干,而日语搜索能匹配日语形态的原因;如果没有按语言进行分析,搜索引擎就会将一种语言的规则应用于所有其他语言的文本。

对于每位访问者的搜索,WPML ElasticPress 会将查询路由到匹配的语言索引。在开始相关性排名之前,结果池就已经筛选出了正确的语言。

运行初始同步

在激活这四个插件并在 ElasticPress 中配置好 Elasticsearch 端点后,运行初始同步:

  1. 在 WordPress 管理后台中打开 ElasticPressSync。
  2. 单击 Start Sync。

WPML ElasticPress 会为每种语言触发一次同步,并逐一构建按语言分类的索引。在大型网站上,这可能需要几个小时;页面会在同步运行时报告进度。

如果您正从 WPML ElasticPress 1.0 更新到 2.0 或更高版本,请重新建立索引。在 2.0 版本引入按语言建立索引的功能后,索引格式已发生更改。

初始同步后,内容更新会自动流入正确的索引中。每当您创建、修改或删除文章时,WPML ElasticPress 都会根据该文章的语言或其文章类型的翻译设置,在后台更新相应的语言索引。

使用 WP-CLI 为特定语言建立索引

对于大型网站、计划任务、部署脚本,或任何无法使用管理后台 UI 的工作流,WPML ElasticPress 提供了一个 WP-CLI 命令(wp wpml_elasticpress sync),该命令封装了 ElasticPress 自身的 CLI 同步,并添加了用于语言选择的 --post-lang 标志。

仅为英语文章运行初始同步:

wp wpml_elasticpress sync --setup --post-type=post --post-lang=en

--setup 标志会在重建之前清除现有索引。执行此命令后,英语搜索将返回英语结果;其他语言的搜索不返回任何内容,因为它们的索引尚未建立。

添加第二种语言而不清除现有索引:

wp wpml_elasticpress sync --post-type=post --post-lang=fr

对每种额外的语言重复此操作。省略 --setup,以便保留之前已建立索引的语言。

在一次运行中同步多种语言:

wp wpml_elasticpress sync --post-lang=en,es

如果内存紧张,请调整批处理大小:

wp wpml_elasticpress sync --per-page=200

默认批处理大小为 350;降低该值有助于在内存受限的服务器上运行。

从头开始重建每个索引:

wp wpml_elasticpress sync --setup

这会清除所有语言索引并重建它们。当所有语言都出现问题或在重大升级后,请使用此命令。

如何检查 ElasticPress 搜索是否返回正确语言的内容

技术同步非常简单;本页面的价值在于验证。在初始同步完成后,以及每次更改影响搜索行为的内容或设置时,请执行这些检查。

1. 搜索从每种语言返回同语言结果

在前端,依次将语言切换器切换到每种语言,并搜索一个您知道以翻译形式存在的术语。

  • 通过。结果页面仅列出该语言的文章。
  • 失败。其他语言的结果与同语言匹配项一起出现。该语言的同步可能尚未完成——请检查 ElasticPressSync 是否有错误,并重新运行特定于语言的 WP-CLI 命令。

2. 仅源语言的内容在其他语言中返回零个结果

挑选一篇仅以您的默认语言存在的文章——在网站的其他语言中没有翻译。从网站的非默认语言版本中,搜索该文章中的短语。

  • 通过。零个结果。该文章未翻译成访问者的语言,因此不应出现。
  • 失败。该文章出现在结果中。这通常意味着在 WPML设置文章类型翻译 中,该文章类型被设置为回退到默认语言。这是 WPML 级别的设置,而不是错误。如果您不打算使用回退功能,请更改该设置。

在前端打开一篇已翻译的文章。Related Posts 小工具应该仅列出相同语言的其他文章。

  • 通过。每篇相关文章都链接到与当前页面语言相同的内容。
  • 失败。出现其他语言的相关文章。请确认在 ElasticPressFeatures 中已启用 Related Posts 功能,并且当前语言的语言索引已完成同步。

如果在 ElasticPress 中启用了 Documents 功能:将翻译后的 PDF 上传到文章的源语言版本,然后将不同语言的 PDF 上传到其译文。搜索仅出现在翻译后 PDF 中的短语。

  • 通过。从匹配语言的前端进行的搜索返回正确的 PDF;源语言搜索不返回翻译后的 PDF,反之亦然。
  • 失败。其他语言的 PDF 出现在结果中。请在启用 Documents 功能后重新同步。命令 wp wpml_elasticpress sync --setup 会重建每个带有文档索引的索引。

5. 后台搜索(术语、评论、用户)按语言筛选

如果您在 ElasticPressFeatures 中启用了 Terms、Comments 或 Users 功能,请从 WordPress 管理后台搜索它们,并确认结果按当前管理后台语言进行筛选。这会影响在多语言网站后台进行搜索的用户。

6. 多站点同步不清除同级站点的索引

如果您在多站点网络上运行 WPML 和 ElasticPress,请在一个站点上运行索引同步,然后检查网络中的其他站点。它们的索引应仍保持完整。

  • 通过。为一个站点建立索引不会影响同级站点的索引。
  • 失败。同级站点的索引为空。请停止操作,在受影响的站点上重新运行同步,并将问题报告给 WPML 支持团队,以便他们确认您遇到的是历史多站点问题还是新问题。

如果上述所有检查均通过,则您的多语言搜索已按预期正常工作。

支持的 ElasticPress 功能

WPML ElasticPress 目前使以下 ElasticPress 功能具备语言感知能力:

  • Post Search。跨文章、页面和自定义文章类型的前端搜索。
  • Related Posts。相关文章小工具会筛选出同语言的匹配项。
  • Documents。在附加的 PDF、.docx、.pptx 以及其他文件类型内进行搜索。
  • Terms、Comments 和 Users。后台搜索。

ElasticPress 的 WooCommerce 专属搜索功能(产品发现、分面产品筛选、跨目录即时产品搜索)目前不支持多语言。WooCommerce 搜索的多语言覆盖已列入 WPML 的路线图;在此功能发布之前,多语言网站上的 WooCommerce 搜索将通过 WPML 标准的 WooCommerce Multilingual 处理机制进行,而不是通过 ElasticPress。

常见陷阱

  • 启用新的 ElasticPress 功能后未运行同步。在 ElasticPressFeatures 中启用 Documents 或 Related Posts 不会将这些文档追溯添加到索引中。切换功能后请重新同步。
  • 在重大更改后未带 --setup 运行 WP-CLI 同步。如果您更改了哪些文章类型可翻译、启用了哪些功能,或者跨主版本边界升级了 WPML ElasticPress,请运行 wp wpml_elasticpress sync --setup 从头开始重建每个索引。
  • 主题搜索结果模板绕过了 ElasticPress 的过滤器。一些自定义主题实现了自己的搜索结果查询,而没有通过 ElasticPress。如果结果仅在前端显示错误(且通过了管理后台检查),则可能需要更新主题模板。
  • WooCommerce 产品搜索返回混合语言结果。这不是同步问题。这是上文提到的 WooCommerce 覆盖范围差距。目前请通过 WooCommerce Multilingual 的标准处理机制来路由产品搜索。
  • Documents 文本未出现在搜索中。请确认在 ElasticPressFeatures 中启用了 Documents 功能,并且自启用以来已运行过同步。

作者:Amir

作者:Amir