Я пытаюсь обновить цену для многих продуктов (более 10.000). То, как я это делаю сейчас, очень трудоемко. Какой лучший способ просмотреть все продукты и обновить большинство из них?
Благодарность
Я пытаюсь обновить цену для многих продуктов (более 10.000). То, как я это делаю сейчас, очень трудоемко. Какой лучший способ просмотреть все продукты и обновить большинство из них?
Благодарность
Ответы:
Привет Magento предоставить атрибут с помощью кода ниже
$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();
и Mage::getSingleton('catalog/product_action')->updateAttributes()
. product_api занял 1,7 секунды в среднем, а product_action - 1,0 секунды в среднем. Тем не менее, $product->getResource()->saveAttribute()
взял на 0,04 секунды в среднем. Благодарность!
$product->getResource()->saveAttribute
действия. СПАСИБО!!
Написать запрос SQL.
Второй лучший способ (и тот, который я рекомендую): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes
Пример кода от 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);
Как это будет работать с множественными значениями? Добавляет ли оно значение или перезаписывает другие предварительно выбранные значения?
Мультиселекты обычно сохраняются как целые числа, разделенные запятыми, например 27,42,4711
. Поэтому, если вы измените значение, чтобы сказать 1
, другие значения будут потеряны. Но то, что вы можете сделать, это что-то вроде CONCAT(value, ',1')
средства добавления нового значения в конец, разделенного запятой. Я думаю, что даже если вы добавите значение два раза, это не проблема, потому что Magento фильтрует его при следующем сохранении элемента и игнорирует второе значение.
<?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')
на Mage::getModel('catalog/product_action')
те же параметры, что указаны выше.
10 тыс. Продуктов, используйте SQL. EAV просто мутит воду. За вопрос самый быстрый способ.
Найти attribute_id
SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'
Обновление с найденным attribute_id
выше запросом.
UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID
Я полагаю, вы могли бы сделать выборку с обновлением, но для простоты два SQL-запроса проще всего понять.
ПРИМЕЧАНИЕ: entity_type_id = 4
чаще всего это продукт EAV записей. В случае, если вам необходимо массовое обновление категории или атрибутов клиента, это будет отличаться, также как и таблица, которая обновляется в зависимости от типа атрибута, который вы обновляете. Кроме того, если у вас есть настройка нескольких магазинов, убедитесь, что обратите внимание и условияstore_id
В дополнение к ответу Фабиана выше, вы можете обновить несколько полей одновременно. В приведенном ниже примере есть только 2 (на складе, на складе), но вы можете использовать столько, сколько хотите.
$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);