¿Cómo se establece el precio_especial del producto en magento mediante una consulta SQL directa?
-
12-12-2019 - |
Pregunta
Necesito actualizar masivamente el precio especial desde un archivo CSV (que me indica el sku, el precio especial, hasta/desde la fecha).
Por el momento lo hago usando el método de modelos magento como este (después de analizar las filas CSV) en un bucle foreach:
$p = Mage::getModel('catalog/product');
$product_id = $p->getIdBySku($product['SKU']);
if (!$product_id) {
throw new Exception('Product Does Not Exists');
}
$p->setStoreId($store_id)->load($product_id);
$p->setSpecialPrice(floatval($product['Price']));
$p->setSpecialFromDate($product['FromDate']);
$p->setSpecialFromDateIsFormated(true);
$p->setSpecialToDate($product['ToDate']);
$p->setSpecialToDateIsFormated(true);
$p->save();
$p = null;
Esto está bien cuando es necesario actualizar un puñado de productos.Sin embargo, cuando actualiza más de 100 productos, esto se vuelve increíblemente lento y también afecta el rendimiento del sitio.
¿Existe alguna forma de importar en masa un precio especial y también establecer las fechas mediante una consulta SQL directa?
Mientras investigaba este problema, encontré una posible solución (basada en este artículo http://fishpig.co.uk/magento/tutorials/update-prices-sql) con el ajuste del special_price
en la base de datos directamente así:
Nota: bd_ es mi prefijo de tabla
UPDATE bd_catalog_product_entity AS CPE
INNER JOIN bd_catalog_product_entity_decimal AS CPED ON CPED.entity_id = CPE.entity_id
SET CPED.`value` = 2.99 -- New Special Price
WHERE
CPED.attribute_id = (
SELECT
attribute_id
FROM
bd_eav_attribute eav
WHERE
eav.entity_type_id = 4
AND eav.attribute_code = 'special_price'
)
AND CPED.store_id = 1 -- Retail Store
AND CPE.sku = 'ABS049' -- Sku Being Updated
Este aparece para estar funcionando (puedo ver el valor en la interfaz de usuario de Magento actualizado).Todavía no estoy seguro de si esta es la forma correcta de establecer el precio especial directamente en la base de datos.
Además, todavía no he descubierto cómo configurar el from
/to
fechas.
Cualquier ayuda al respecto será muy apreciada.
Solución
digamos que $storeId
es la tienda para la cual deseas actualizar el precio $specialPrice
es su precio especial, $sku
es el SKU de su producto, $fromDate
y $toDate
son... bueno, ya entiendes la idea.
Ahora ejecuta este código:
$id = Mage::getSingleton('catalog/product')->getIdBySku($sku);
if ($id) {
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($id), //array with ids to update
array( //array with attributes to update
'special_price' => $specialPrice,
'special_from_date' => $fromDate,
'special_to_date' => $toDate,
),
$storeId //store id to update. If you want to update the global value use 0 in here
);
}
Otros consejos
Si desea actualizar productos existentes, no es necesario realizar cambios manualmente.Simplemente importe CSV que debe contener solo aquellos atributos como columnas que son necesarios para actualizar.SKU es un campo obligatorio, así que no olvides incluirlo en tu CSV.
Importará productos muy rápido.