Próbuję zaktualizować cenę do wielu produktów (ponad 10.000). Sposób, w jaki to robię teraz, jest niezwykle czasochłonny. Jaki jest najlepszy sposób na przeglądanie wszystkich produktów i aktualizowanie większości z nich?
Dzięki
Próbuję zaktualizować cenę do wielu produktów (ponad 10.000). Sposób, w jaki to robię teraz, jest niezwykle czasochłonny. Jaki jest najlepszy sposób na przeglądanie wszystkich produktów i aktualizowanie większości z nich?
Dzięki
Odpowiedzi:
Cześć Magento podaj atrybut poniżej kodu
$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();
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!
$product->getResource()->saveAttribute
akcji. DZIĘKI!!
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($allProductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allProductIds, $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ść.
<?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')
się Mage::getModel('catalog/product_action')
z dokładnie te same parametry wymienione powyżej.
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_id
z 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
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);