WPML
ステータス
解決済み
報告対象
WPML Media Translation 2.7.3
解決されたバージョン
WPML 4.7.2
トピックタグ
Bug

問題の概要

WPML Media Translationでは、1つの画像を翻訳すると、似たようなファイル名パターンを持つすべての画像にその翻訳が意図せず適用されるという特異な動作があります。たとえば、img_file1.jpgという名前の画像を翻訳すると、img_file10.jpgimg_file11.jpgのような他の画像にも影響が及びます… これらがまったく別の画像であるにもかかわらずです。

この問題は、メディア翻訳がファイル名のパターンに基づいて画像を処理および置換する仕組みに起因しており、ファイル名の構造の大部分が共通している場合に、意図しない置換が発生します。

回避策

続行する前に、サイトの完全なバックアップを必ず取得してください。


  • …/wp-content/plugins/wpml-media-translation/classes/media-translation/class-wpml-media-translated-images-update.php ファイルを開きます。

  • 76行目を探します。

  • 次を:
    		$media_src_contains_pre_update = function ( $media_src ) use ( $pre_update_translated_media_guid ) {
    			$thumb_file_name                   = basename( $pre_update_translated_media_guid );
    			$pre_update_translated_media_parts = explode( '.', $thumb_file_name );
    
    			$media_src_extension                   = pathinfo( $media_src, PATHINFO_EXTENSION );
    			$pre_update_translated_media_extension = is_array( $pre_update_translated_media_parts ) ? end( $pre_update_translated_media_parts ) : null;
    
    			return $pre_update_translated_media_parts[0] && false !== strpos( $media_src, $pre_update_translated_media_parts[0] ) && $media_src_extension === $pre_update_translated_media_extension;
    		};

  • 以下に置き換えます:
    		$media_src_contains_pre_update = function ( $media_src ) use ( $pre_update_translated_media_guid ) {
    			$thumb_file_name                   = basename( $pre_update_translated_media_guid );
    			$pre_update_translated_media_parts = explode( '.', $thumb_file_name );
    
    			$media_src_extension                   = pathinfo( $media_src, PATHINFO_EXTENSION );
    			$pre_update_translated_media_extension = is_array( $pre_update_translated_media_parts ) ? end( $pre_update_translated_media_parts ) : null;
    			$pattern = "/-d+xd+.".$pre_update_translated_media_parts[1]."$/";
    			$try = preg_replace($pattern, '.'. $pre_update_translated_media_parts[1], $media_src);
    			return $pre_update_translated_media_parts[0] && false !== str_contains( implode('.', $pre_update_translated_media_parts), $try ) && $media_src_extension === $pre_update_translated_media_extension;
    		};

すべての既知の問題 →