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()->saveAttributeakcji. 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_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
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);