Moyen le plus rapide de mettre à jour un attribut dans tous les produits

Réponses:

22

Salut Magento fournit un attribut par le code ci-dessous

$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');

Exemple:

$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');

Utilisation de la collection de produits:

$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');


}
Amit Bera
la source
C'est super rapide! J'ai essayé 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!
Joshua Pack
Y a-t-il quelque chose de similaire à cette méthode qui peut mettre à jour les attributs à un certain niveau de magasin?
Robbie Averill
Thx @Amit Bera - 1 question restante;) est-il également possible d'enregistrer plusieurs attributs en une seule fois? De devrait-on boucler l' $product->getResource()->saveAttributeaction. THX!!
snh_nl
@amit bera, veuillez regarder ce magento.stackexchange.com/questions/201757/… que dois-je faire ??
abhishek
@amit: J'ai besoin de savoir comment changer de site Web en masse (attribut de mise à jour dans plusieurs magasins)
zus
18

É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($allPro‌​ductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allPro‌​ductIds, $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.

Fabian Blechschmidt
la source
Cela ne mettra à jour que 1k lignes à la fois, pas aussi rapidement: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER
Lorsque je comprends bien le code, il écrit toutes les 1000 lignes, mais il met à jour tout de suite.
Fabian Blechschmidt
1
Merci @FabianBlechschmidt! Voici mon exemple de code ( gist ):<?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);
Max Uroda
1
Le problème avec cette approche est qu'elle ne réindexe pas les produits, vous pouvez donc ne pas voir les changements dans le frontend et les voir simplement dans le panneau d'administration. Pour réindexer également après la mise à jour, vous pouvez passer Mage::getSingleton('catalog/resource_product_action')à Mage::getModel('catalog/product_action')avec exactement les mêmes paramètres mentionnés ci-dessus.
shampooing du
1
@snh_nl a mis à jour la réponse. J'espère que cela répond à votre question
Fabian Blechschmidt
5

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

B00MER
la source
2

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);
Silas Palmer
la source
Donc, c'est si vous voulez mettre à jour tous les produits avec la même valeur d'attribut - comment pouvez-vous l'adapter pour mettre à jour disons 3 produits, tous le même attribut, mais avec des valeurs différentes pour l'attribut? thx
snh_nl
Voir la réponse d'Amit Bera ci-dessus: magento.stackexchange.com/a/43924/3433
Silas Palmer