Ich versuche, den Preis auf viele Produkte (mehr als 10.000) zu aktualisieren. Die Art und Weise, wie ich das gerade mache, ist extrem zeitaufwändig. Was ist der beste Weg, um alle Produkte durchzugehen und die meisten zu aktualisieren?
Vielen Dank
Ich versuche, den Preis auf viele Produkte (mehr als 10.000) zu aktualisieren. Die Art und Weise, wie ich das gerade mache, ist extrem zeitaufwändig. Was ist der beste Weg, um alle Produkte durchzugehen und die meisten zu aktualisieren?
Vielen Dank
Antworten:
Hallo Magento, gib ein Attribut mit folgendem Code an
$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();
und Mage::getSingleton('catalog/product_action')->updateAttributes()
. product_api dauerte im Durchschnitt 1,7 Sekunden und product_action dauerte im Durchschnitt 1,0 Sekunden. jedoch $product->getResource()->saveAttribute()
nahm avg 0,04 Sekunden auf durchschnittl. Vielen Dank!
$product->getResource()->saveAttribute
Handlung umkreisen. DANKE!!
Schreiben Sie eine SQL-Abfrage.
Zweitbester Weg (und der, den ich empfehle): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes
Code-Beispiel von 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);
Wie würde das mit Multiselect-Werten funktionieren? Fügt es den Wert hinzu oder überschreibt es andere vorgewählte Werte?
Multiselects werden normalerweise als durch Kommas getrennte ganze Zahlen gespeichert, z 27,42,4711
. Wenn Sie also den Wert ändern 1
, gehen die anderen Werte verloren. Aber was Sie tun können, ist, CONCAT(value, ',1')
dass Sie den neuen Wert am Ende durch ein Komma trennen. Ich denke, auch wenn Sie zwei Mal einen Wert hinzufügen, ist dies kein Problem, da Magento ihn beim nächsten Speichern filtert und den zweiten Wert ignoriert.
<?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')
um Mage::getModel('catalog/product_action')
mit den exakt gleichen oben genannten Parametern.
10k Produkte verwenden SQL. EAV trübt nur das Wasser. Pro Frage ist der schnellste Weg.
Suchen Sie attribute_id
SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'
Update mit attribute_id
obiger Abfrage gefunden.
UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID
Ich nehme an, Sie könnten mit update eine Unterauswahl treffen, aber der Einfachheit halber sind zwei SQL-Abfragen am einfachsten zu verstehen.
HINWEIS: Es entity_type_id = 4
handelt sich meistens um die Produkt-EAV-Einträge. Wenn Sie Kategorien- oder Kundenattribute massenweise aktualisieren müssen, unterscheidet sich dies ebenso wie die Tabelle, die basierend auf der Art des zu aktualisierenden Attributs aktualisiert wird. Auch wenn Sie ein Multi-Store-Setup haben, achten Sie darauf und beachten Sie die Bedingungenstore_id
Aufgrund der obigen Antwort von Fabian können Sie mehrere Felder gleichzeitig aktualisieren. Das folgende Beispiel hat nur 2 (auf Lager, Lagerstatus), aber Sie können so viele verwenden, wie Sie möchten.
$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);