Estou tentando atualizar o preço para muitos produtos (mais de 10.000). A maneira como estou fazendo isso agora é extremamente demorada. Qual é a melhor maneira de percorrer todos os produtos e atualizar a maioria deles?
obrigado
Estou tentando atualizar o preço para muitos produtos (mais de 10.000). A maneira como estou fazendo isso agora é extremamente demorada. Qual é a melhor maneira de percorrer todos os produtos e atualizar a maioria deles?
obrigado
Respostas:
Oi Magento fornecer um atributo por código abaixo
$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');
$product=Mage::getModel('catalog/product')->load($id);
$product->setSpecialFromDate('2010-10-28');
// below code use for time format
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');
$productIds = array(1,3,2);
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('entity_id', array('in' => $productIds));
foreach($products as $product)
{
$product->setSpecialFromDate('2010-10-28');
// below code use for time format
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');
}
Mage::getSingleton('catalog/product_api')->update();
e Mage::getSingleton('catalog/product_action')->updateAttributes()
. product_api levou 1,7 segundos na média e product_action levou 1,0 segundos na média. no entanto, $product->getResource()->saveAttribute()
levou em média 0,04 segundos em média. Obrigado!
$product->getResource()->saveAttribute
ação. VALEU!!
Escreva uma consulta SQL.
Segunda melhor maneira (e a que eu recomendo): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes
Exemplo de código por u_maxx:
$allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds();
$attributeCode = 'some_eav_attribute';
$attributeValue = NULL;
$attrData = array( $attributeCode => $attributeValue );
$storeId = 0;
// no reindex:<
Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allProductIds, $attrData, $storeId);
Como isso funcionaria com valores de seleção múltipla? 'Adiciona' o valor ou sobrescreve outros valores pré-selecionados
As seleções múltiplas são normalmente salvas como números inteiros separados por vírgula, como 27,42,4711
. Portanto, se você alterar o valor para dizer 1
, os outros valores serão perdidos. Mas o que você pode fazer é algo como CONCAT(value, ',1')
adicionar o novo valor ao final, separado por uma vírgula. Eu acho que mesmo se você adicionar um valor duas vezes, isso não é problema, porque o Magento o filtra na próxima vez que o item é salvo e ignora o segundo valor.
<?php $allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds(); $attributeCode = 'some_eav_attribute'; $attributeValue = NULL; $attrData = array( $attributeCode => $attributeValue ); $storeId = 0; Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
Mage::getSingleton('catalog/resource_product_action')
para Mage::getModel('catalog/product_action')
exatamente os mesmos parâmetros mencionados acima.
10k produtos, use SQL. O EAV apenas turva as águas. Por pergunta é a maneira mais rápida.
Encontre attribute_id
SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'
Atualize com a pesquisa encontrada attribute_id
acima.
UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID
Suponho que você poderia fazer uma subseleção com atualização, mas, para simplificar, é mais fácil entender duas consultas SQL.
NOTA: entity_type_id = 4
é sempre a entrada do EAV do produto. Caso você precise atualizar em massa os atributos da categoria ou do cliente, isso será diferente, assim como a tabela atualizada com base em que tipo de atributo é a sua atualização. Além disso, se você tiver uma configuração de várias lojas, certifique-se de observar estore_id
Além da resposta de Fabian acima, você pode atualizar vários campos por vez. O exemplo abaixo tem apenas 2 (em estoque, status de estoque), mas você pode usar quantos quiser.
$product_ids = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToFilter('status', array('eq' => 2)) //only disabled
->getAllIds();
$attrData = [
['attribute_one' => 1],
['attribute_two' => 1]
];
$storeId = 0;
Mage::getSingleton('catalog/resource_product_action')
->updateAttributes($product_ids, $attrData, $storeId);