WPML
状态
已解决
解决于
2.3.8

问题概述

自 WPML Media Translation 插件的 2.3.0 版本起,可以在翻译之间翻译和同步媒体。

作为设置过程的一部分(当您从早期版本迁移时也会运行),WPML Media 会扫描整个站点以查找内容中使用的媒体 URL。

标记包含媒体的文章有助于后续操作,因此,在发生与媒体翻译相关的某些事件(例如翻译特定媒体文章)时,将仅扫描实际包含媒体的文章,以便使用翻译后的媒体更新内容。

但是,对于非常大的站点,设置过程可能会对数据库造成一些压力,导致整个过程比预期更慢。

在很大程度上,这种压力是由根据 URL 识别附件 ID 所需的查询引起的。通常,可以从 HTML 标签的属性中确定附件 ID(例如 id=”attachment_8” – 此处,8 是附件的 ID)。当未使用此类属性时,WPML Media 会根据实际 URL 确定 ID。在这种情况下,会使用两种类型的查询:

  • 针对 wp_posts 表中的 ‘guid’ 字段进行匹配的查询
  • 针对 wp_postmeta 表的 meta_value 字段进行匹配的另一个查询。

然而,默认情况下这些表字段都没有建立索引。由于这是文本匹配(即使不是部分文本搜索),因此对于大型数据库来说可能会很慢。

临时解决方法

解决此问题的一种方法是(至少暂时)为这些字段添加索引。
您可以使用类似以下的两个 SQL 查询来执行此操作:

ALTER TABLE `wp_posts` ADD INDEX `guid` (`guid`); ALTER TABLE `wp_postmeta` ADD INDEX `meta_value` (`meta_value`(512));

除了使磁盘上数据库的物理大小略微增加之外,这些添加操作不会对您的数据库产生任何副作用。如果您更希望在运行 WPML 媒体设置后将其回滚,可以使用以下两个 MySQL 查询来完成:

ALTER TABLE `wp_posts` DROP INDEX `guid`; ALTER TABLE `wp_postmeta` DROP INDEX `meta_value`;

注意:根据您的 WordPress 配置,查询中提到的数据表的 wp_ 前缀可能会有所不同。通常在默认情况下,它是 wp_

案例研究示例:在一个包含约 140,000 个附件和约 5,000 篇文章的站点上,设置可能需要 30 多分钟才能完成。添加索引后,设置只需几分钟即可运行完毕。这些测试是在常规开发环境中进行的。在实际的生产服务器上,这些数值甚至可能更理想。

所有已知问题 →