Estoy tratando de actualizar el precio de muchos productos (más de 10.000). La forma en que lo estoy haciendo ahora es extremadamente lenta. ¿Cuál es la mejor manera de recorrer todos los productos y actualizar la mayoría de ellos?
Gracias
Estoy tratando de actualizar el precio de muchos productos (más de 10.000). La forma en que lo estoy haciendo ahora es extremadamente lenta. ¿Cuál es la mejor manera de recorrer todos los productos y actualizar la mayoría de ellos?
Gracias
Respuestas:
Hola Magento proporcione un atributo por el siguiente código
$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();
y Mage::getSingleton('catalog/product_action')->updateAttributes()
. product_api tardó 1.7 segundos en promedio y product_action tomó 1.0 segundos en promedio. sin embargo, $product->getResource()->saveAttribute()
tomó un promedio de 0.04 segundos en promedio. ¡Gracias!
$product->getResource()->saveAttribute
acción. ¡¡GRACIAS!!
Escribe una consulta SQL.
Segunda mejor manera (y la que recomiendo): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes
Ejemplo de código de 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);
¿Cómo funcionaría esto con valores de selección múltiple? ¿'Agrega' el valor o sobrescribe otros valores preseleccionados?
Las multiselecciones normalmente se guardan como enteros separados por comas, como 27,42,4711
. Por lo tanto, si cambia el valor para decir 1
, los otros valores se pierden. Pero lo que puedes hacer es algo comoCONCAT(value, ',1')
agregar el nuevo valor al final, separado por una coma. Creo que incluso si agrega un valor dos veces, esto no es un problema, porque Magento lo filtra la próxima vez que se guarda el elemento e ignora el segundo valor.
<?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')
a Mage::getModel('catalog/product_action')
con los mismos parámetros mencionados anteriormente.
10k productos, use SQL. EAV simplemente enturbia las aguas. Por pregunta es la forma más rápida.
Encuentra atributo_id
SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'
Actualización con la consulta encontrada attribute_id
de arriba.
UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID
Supongo que podría hacer una subselección con actualización, pero por simplicidad, dos consultas SQL son más fáciles de entender.
NOTA: entity_type_id = 4
casi siempre son las entradas del producto EAV. En caso de que necesite actualizar en masa la categoría o los atributos del cliente, esto diferirá, así como la tabla que se actualiza según el tipo de atributo que está actualizando. Además, si tiene una configuración de varias tiendas, asegúrese de tener en cuenta y condicionarstore_id
Además de la respuesta anterior de Fabian, puede actualizar varios campos a la vez. El siguiente ejemplo tiene solo 2 (en stock, estado de stock), pero puede usar tantos como desee.
$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);