La forma más rápida de actualizar un atributo en todos los productos

Respuestas:

22

Hola Magento proporcione un atributo por el siguiente código

$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');

Ejemplo:

$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');

Usando la colección de productos:

$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');


}
Amit Bera
fuente
¡Esto es súper rápido! Lo he intentado 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!
Joshua Pack
¿Hay algo similar a este método que pueda actualizar los atributos en un determinado nivel de tienda?
Robbie Averill
Thx @Amit Bera - 1 pregunta restante;) ¿hay también una manera de guardar múltiples atributos de una vez? De uno tendría que recorrer la $product->getResource()->saveAttributeacción. ¡¡GRACIAS!!
snh_nl
@amit bera, por favor mire este magento.stackexchange.com/questions/201757/… ¿qué debo hacer?
abhishek
@amit: necesito cómo puedo cambiar el sitio web de forma masiva (actualizar atributo en varias tiendas)
zus
18

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($allPro‌​ductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allPro‌​ductIds, $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.

Fabian Blechschmidt
fuente
Esto solo actualizará 1k filas a la vez, no tan rápido: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER
Cuando entiendo el código correctamente, escribe cada 1000 filas, pero actualiza todo en una fila.
Fabian Blechschmidt
1
Gracias @FabianBlechschmidt! Aquí está mi ejemplo de código ( esencia ):<?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);
Max Uroda
1
El problema con este enfoque es que no reindexa los productos, por lo que es posible que no vea los cambios en la interfaz y solo los vea en el panel de administración. Para reindexar también después de la actualización, puede cambiar Mage::getSingleton('catalog/resource_product_action')a Mage::getModel('catalog/product_action')con los mismos parámetros mencionados anteriormente.
champú
1
@snh_nl actualizó la respuesta. Espero que esto responda tu pregunta
Fabian Blechschmidt
5

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_idde 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

B00MER
fuente
2

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);
Silas Palmer
fuente
Entonces, si desea actualizar todos los productos al mismo valor de atributo, ¿cómo podría adaptar esto para actualizar, por ejemplo, 3 productos, todos el mismo atributo, pero con diferentes valores para el atributo? thx
snh_nl
Ver la respuesta de Amit Bera arriba: magento.stackexchange.com/a/43924/3433
Silas Palmer