WPML
ステータス
解決済み
解決されたバージョン
2.3.8

問題の概要

WPML Media Translationプラグインのバージョン2.3.0以降、翻訳間でメディアを翻訳および同期することが可能です。

セットアッププロセス(以前のバージョンから移行する際にも実行されます)の一環として、WPML Mediaはコンテンツ内で使用されているメディアURLをサイト全体でスキャンします。

メディアを含む投稿にフラグを立てることは後々役立ちます。これにより、メディア翻訳に関連する特定のイベント(特定のメディアの投稿を翻訳する場合など)において、実際にメディアを含む投稿のみがスキャンされ、翻訳されたメディアでコンテンツが更新されます。

ただし、非常に大規模なサイトの場合、セットアッププロセスによってデータベースに負荷がかかり、プロセス全体が予想よりも遅くなる可能性があります。

この負荷の大部分は、URLに基づいて添付ファイルIDを特定するために必要なクエリによって引き起こされます。通常、添付ファイルIDはHTMLタグの属性から判断できます(例:id=”attachment_8” – ここでは、8が添付ファイルのIDです)。このような属性が使用されていない場合、WPML Mediaは実際のURLからIDを判断します。この場合、2つのタイプのクエリが使用されます。

  • wp_postsテーブルの‘guid’フィールドと照合するクエリ
  • wp_postmetaテーブルのmeta_valueフィールドと照合する別のクエリ。

しかし、これらのテーブルフィールドはいずれもデフォルトではインデックス化されていません。テキストの照合であるため(部分的なテキスト検索ではないにしても)、大規模なデータベースでは遅くなる可能性があります。

回避策

この問題を回避する方法は、(少なくとも一時的に)これらのフィールドにインデックスを追加することです。
これは、次のような2つのSQLクエリを使用して実行できます。

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

これらの追加は、ディスク上のデータベースの物理サイズをわずかに大きくする以外に、データベースに副作用を及ぼすことはありません。WPMLメディアのセットアップを実行した後に元に戻したい場合は、次の2つのMySQLクエリを使用して実行できます。

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

注意:クエリで言及されているテーブルのwp_プレフィックスは、WordPressの設定によって異なる場合があります。通常、デフォルトではwp_です。

導入事例:約140,000件の添付ファイルと約5,000件の投稿があるサイトでは、セットアップの完了に30分以上かかる場合があります。インデックスを追加すると、セットアップは数分で完了します。テストは通常の開発環境で行われました。これらの値は、実際の本番サーバーではさらに良好になる可能性があります。

すべての既知の問題 →