Najszybszy sposób na aktualizację atrybutu we wszystkich produktach

Odpowiedzi:

22

Cześć Magento podaj atrybut poniżej kodu

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

Przykład:

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

Korzystanie z kolekcji produktów:

$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
źródło
To jest super szybkie! Próbowałem Mage::getSingleton('catalog/product_api')->update();i Mage::getSingleton('catalog/product_action')->updateAttributes(). produkt_api zajął średnio 1,7 sekundy na śr. $product->getResource()->saveAttribute()przyjął jednak średnio 0,04 sekundy na średnim. Dzięki!
Joshua Pack
Czy istnieje coś podobnego do tej metody, która może aktualizować atrybuty na pewnym poziomie sklepu?
Robbie Averill
Dzięki @Amit Bera - pozostało 1 pytanie;) czy jest też sposób na zapisanie wielu atrybutów za jednym razem? Trzeba byłoby zapętlić się wokół $product->getResource()->saveAttributeakcji. DZIĘKI!!
snh_nl
@amit bera, proszę zajrzyj do tego magento.stackexchange.com/questions/201757/... co powinienem zrobić?
abhishek
@amit: Potrzebuję, jak mogę zbiorczo zmienić stronę internetową (aktualizacja atrybutu w wielu sklepach)
zus
18

Napisz zapytanie SQL.

Drugi najlepszy sposób (i ten, który polecam): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

Przykład kodu 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);

Jak to działa z wartościami wielokrotnego wyboru? Czy „dodaje” wartość, czy zastępuje inne wstępnie wybrane wartości

Multiselects są zwykle zapisywane jako liczby całkowite oddzielone przecinkami, jak 27,42,4711. Dlatego jeśli zmienisz wartość, aby powiedzieć 1, inne wartości zostaną utracone. Ale to, co możesz zrobić, to coś w rodzaju CONCAT(value, ',1')dodania nowej wartości do końca, oddzielonej przecinkiem. Myślę, że nawet jeśli dodasz wartość dwa razy, nie stanowi to problemu, ponieważ Magento filtruje ją przy następnym zapisaniu elementu i ignoruje drugą wartość.

Fabian Blechschmidt
źródło
Spowoduje to aktualizację tylko 1 tys.
Wierszy
Kiedy dobrze rozumiem kod, zapisuje co 1000 wierszy, ale aktualizuje wszystko z rzędu.
Fabian Blechschmidt
1
Dziękuję @FabianBlechschmidt! Oto mój przykład kodu ( 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
Problem z tym podejściem polega na tym, że nie reindeksuje produktów, więc możesz nie widzieć zmian w interfejsie użytkownika i po prostu widzieć je w panelu administracyjnym. Również reindex po aktualizacji może zmienić Mage::getSingleton('catalog/resource_product_action')się Mage::getModel('catalog/product_action')z dokładnie te same parametry wymienione powyżej.
szampon
1
@snh_nl zaktualizował odpowiedź. Mam nadzieję, że to odpowiada na twoje pytanie
Fabian Blechschmidt
5

10 000 produktów, użyj SQL. EAV po prostu zamazuje wody. Na pytanie jest najszybszy sposób.

Znajdź identyfikator_atrybutu

SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'

Aktualizacja z znalezionym attribute_idz powyższego zapytania.

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

Podejrzewam, że można wykonać podselekcję z aktualizacją, ale dla uproszczenia łatwiej jest uchwycić dwa zapytania SQL.

UWAGA: entity_type_id = 4 najczęściej są to wpisy EAV produktu. W przypadku konieczności masowej aktualizacji kategorii lub atrybutów klienta może się to różnić, podobnie jak tabela, która jest aktualizowana w zależności od typu atrybutu, który aktualizujesz. Również jeśli masz konfigurację dla wielu sklepów, pamiętaj o tym i zwróć uwagę na warunkistore_id

B00MER
źródło
2

Zgodnie z powyższą odpowiedzią Fabiana możesz aktualizować wiele pól jednocześnie. Poniższy przykład ma tylko 2 (w magazynie, stan zapasów), ale możesz użyć ich tyle, ile chcesz.

    $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
źródło
Jest tak, jeśli chcesz zaktualizować wszystkie produkty do tej samej wartości atrybutu - jak możesz to dostosować, aby zaktualizować powiedzmy 3 produkty, wszystkie te same atrybuty, ale z różnymi wartościami atrybutu? thx
snh_nl
Zobacz odpowiedź Amit Bera powyżej: magento.stackexchange.com/a/43924/3433
Silas Palmer