製品データの大規模な更新を行う必要がありますが、実行する必要のあることは、製品のインポートでは実現できません。例では、特定の製品のメディアギャラリーとカテゴリを更新する必要がありますが、私が思いついたソリューションには時間がかかりすぎます。
簡単にまとめます。Magento2 CLIにコマンドを追加しました。json構成ファイルを指定すると、このような特定の製品のメディアギャラリーエントリを削除、追加、更新、またはソートします。ここにコードの抜粋を貼り付けます:
/* $product is of type Magento\Catalog\Model\Product */
//get existing media gallery
$existingMediaGallery = $product->getMediaGallery();
/*
do stuff with media gallery (alter $existingMediaGallery)
(add, remove, sort, ...)
*/
//set media gallery again
$product->setMediaGallery($existingMediaGallery);
//process media gallery
$mediaGalleryEntries = $product->getMediaGalleryEntries();
$this->getMediaGalleryProcessor()->clearMediaAttribute($product, array_keys($product->getMediaAttributes()));
if ($mediaGalleryEntries) {
foreach ($mediaGalleryEntries as $k => $entry) {
if (!isset($entry['removed']) && !empty($entry['types'])) {
$this->getMediaGalleryProcessor()->setMediaAttribute($product, $entry['types'], $entry['file']);
}
}
}
//save product
$product->save();
大規模な更新であるため、「$ product-> save()」行は何度も呼び出され、常に2〜4秒かかります。何千もの製品のコードを起動する必要があるので、それを行うためのより高速な方法が必要です。
私が試した
$product->getResource()->saveAttribute($product, 'media_gallery');
そして
$product->addAttributeUpdate('media_gallery', $mediaGallery, $storeId);
しかし、それはメディアギャラリーでは機能しません(eavでのみ機能します)。
メディアギャラリーのみを保存し、これらの変更をより速く保持する方法はありますか?
(私が探しているのはMagento\Catalog\Api\CategoryLinkManagementInterface::assignProductToCategories
、完全な製品の保存よりも速くカテゴリ/製品の関連付けを保存する方法のようなものです)