Preciso fazer uma atualização maciça dos dados do produto, mas o que preciso fazer não pode ser alcançado com a importação do produto. No exemplo, preciso atualizar a galeria de mídia e as categorias de determinados produtos, mas a solução que eu criei leva muito tempo.
Um pequeno resumo: adicionei um comando ao Magento 2 CLI que, dado um arquivo de configuração json, remove, adiciona, atualiza ou classifica as entradas da galeria de mídia para um determinado produto como este. Aqui colo um trecho do código:
/* $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();
Como é uma atualização maciça, a linha "$ product-> save ()" é chamada muitas vezes e sempre leva de 2 a 4 segundos. Como preciso lançar o código para milhares de produtos, preciso de uma maneira mais rápida de fazer isso.
Eu tentei com
$product->getResource()->saveAttribute($product, 'media_gallery');
e
$product->addAttributeUpdate('media_gallery', $mediaGallery, $storeId);
mas isso não funciona para a galeria de mídia (só funciona para eav, eu acho).
Existe uma maneira de salvar apenas a galeria de mídia e persistir com essas alterações mais rapidamente?
O que procuro é algo como um Magento\Catalog\Api\CategoryLinkManagementInterface::assignProductToCategories
método que salva a associação de categoria / produto mais rapidamente do que uma economia completa do produto.