J'essaie de mettre à jour le prix de beaucoup de produits (plus de 10 000). La façon dont je le fais actuellement prend beaucoup de temps. Quelle est la meilleure façon de parcourir tous les produits et de mettre à jour la plupart d'entre eux?
Merci
J'essaie de mettre à jour le prix de beaucoup de produits (plus de 10 000). La façon dont je le fais actuellement prend beaucoup de temps. Quelle est la meilleure façon de parcourir tous les produits et de mettre à jour la plupart d'entre eux?
Merci
Réponses:
Salut Magento fournit un attribut par le code ci-dessous
$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();et Mage::getSingleton('catalog/product_action')->updateAttributes(). product_api a pris 1,7 seconde en moyenne et product_action a pris 1,0 seconde en moyenne. cependant, a $product->getResource()->saveAttribute()pris une moyenne de 0,04 secondes sur la moyenne. Merci!
$product->getResource()->saveAttributeaction. THX!!
Écrivez une requête SQL.
Deuxième meilleur moyen (et celui que je recommande): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes
Exemple de code par 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);
Comment cela fonctionnerait-il avec des valeurs multisélectionnées? Est-ce qu'il «ajoute» la valeur ou écrase d'autres valeurs présélectionnées
Les sélections multiples sont normalement enregistrées sous forme d'entiers séparés par des virgules, comme 27,42,4711. Par conséquent, si vous modifiez la valeur pour dire 1, les autres valeurs sont perdues. Mais ce que vous pouvez faire, c'est comme CONCAT(value, ',1')ajouter la nouvelle valeur à la fin, séparée par une virgule. Je pense que même si vous ajoutez une valeur deux fois, ce n'est pas un problème, car Magento la filtre la prochaine fois que l'élément est enregistré et ignore la deuxième valeur.
<?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')à Mage::getModel('catalog/product_action')avec exactement les mêmes paramètres mentionnés ci-dessus.
Produits 10k, utilisez SQL. EAV brouille juste les eaux. Par question est le moyen le plus rapide.
Rechercher l'attribut_id
SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'
Mettre à jour avec la attribute_idrequête trouvée ci-dessus.
UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID
Je suppose que vous pouvez faire une sous-sélection avec mise à jour, mais pour simplifier, deux requêtes SQL sont plus faciles à saisir.
REMARQUE: entity_type_id = 4 correspond le plus souvent aux entrées EAV du produit. Dans le cas où vous devez mettre à jour en masse la catégorie ou les attributs client, cela différera ainsi que le tableau mis à jour en fonction du type d'attribut que vous mettez à jour. Aussi, si vous avez une configuration multi-magasins, assurez-vous de noter et de conditionnerstore_id
Suite à la réponse de Fabian ci-dessus, vous pouvez mettre à jour plusieurs champs à la fois. L'exemple ci-dessous n'en a que 2 (en stock, état des stocks), mais vous pouvez en utiliser autant que vous le souhaitez.
$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);