Magento Open Source / Adobe Commerceの商品画像に関するアレコレ〜その1

以前、商品画像のリサイズについて「Magentoのリサイズ後商品画像のパスはどのように決まるか」で解説しました。
今回はそれ以外の商品画像関係の細かいアレコレを取り上げていきたいと思います。

リサイズはいつ行われるのか?

Magento Open Source / Adobe Commerceの商品画像は、大きく分けて2通りの方法でリサイズされます。

  1. 管理画面での商品画像保存時にリサイズ
  2. 画像URLが要求された際にリサイズ

管理画面での商品画像保存時にリサイズ

前者の場合は、以下のような流れでリサイズされます。

  1. 管理者が管理画面から画像をアップロードする
  2. ディスク上の所定の場所に画像が配置される
  3. 管理者が商品情報を保存する
  4. Observerでリサイズ処理が実行される

REST APIでメディアギャラリーを更新する際も基本は同じとなっていて、操作の起点が管理者による手動操作かAPIかだけの違いでしかありません(REST APIの場合はリクエストそのものに画像データを含める形になります)。

大切な点としては、「商品データが保存されたあとにObserverがリサイズを必要であれば行っている」ということになります。
このリサイズ処理は Magento\Catalog\Observer\ImageResizeAfterProductSave に実装されていて、catalog_product_save_commit_after イベントで実行されるようになっています。

画像URLが要求された際にリサイズ

後者の場合は、Magento\Catalog\Helper\Image::getUrl()が呼ばれるとリサイズが実施されます。
ただし、

  • すでにキャッシュ済みのファイルがある
  • プレースホルダー画像が使用される

場合にはリサイズが行われず、すでにあるファイルが使用されます。

どうして大量のリサイズ後画像ができるのか?

Magentoのリサイズ後商品画像のパスはどのように決まるか」をまず先にお読みいただきたいのですが、リサイズ後の画像は

  • 画像の高さ
  • 画像の幅
  • 画像の品質
  • 角度
  • アスペクト比の維持フラグ
  • 枠線の有無
  • 背景透明の有無
  • 元サイズより大きくなるリサイズの可不可
  • 背景色の指定

の9つのパラメータの組み合わせで生成され、9つのパラメータの値を連結した文字列から算出されるハッシュ値のディレクトリに格納されます。
たとえサイズが同じであったとしても、他のパラメータが異なっていれば別ディレクトリにリサイズ後画像が生成される点に注意が必要です。
反対に同じパラメータ構成であれば同一のファイルを利用することが可能で、ディスク使用量を抑えることができます。

画像を管理画面から削除するとどうなるのか?

管理画面から商品画像を削除し、商品を保存すると、リサイズ前の画像はファイルシステム上から削除されます。ですが、リサイズ後の画像は消えません。
リサイズ後の画像を削除したい場合は、以下のような操作・対応が必要になります。

  1. リサイズ後の画像全てを管理画面の「キャッシュ管理」機能から一括でクリアする
  2. 削除コマンドをサーバー上で実行する
  3. 自前で削除処理を実装する

1の場合、すべてのリサイズ後画像を削除しようとするため、ファイル数が多い場合は処理完了までに時間がかかる可能性があります。
指定した商品のものだけを削除できないため、あまり現実的には使えない機能だと思っていただいて良いでしょう。

2と3についてはシステムに関する知識がある方限定です。
適切に対象ファイルを探し出して削除することになるので、慎重に作業するようにしましょう。

まだまだ続きます

今回は商品画像に関する比較的ソフトなTipsを取り上げました。
次回は、

  • 商品画像の差し替え
  • リサイズ後画像の更新

について解説したいと思います。