Comment définir le prix spécial du produit dans magento via une requête SQL directe ?
-
12-12-2019 - |
Question
Je dois mettre à jour en masse le prix spécial à partir d'un fichier CSV (qui m'indique le SKU, le prix spécial, la date de/à partir de).
Pour le moment, je le fais en utilisant la méthode des modèles magento comme celle-ci (après avoir analysé les lignes CSV) dans une boucle 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;
Ce n'est pas grave lorsqu'une poignée de produits doivent être mis à jour.Cependant, lorsque vous mettez à jour plus de 100 produits, cela devient incroyablement lent et affecte également les performances du site.
Puis-je importer en masse des prix spéciaux et également définir les dates via une requête SQL directe ?
En recherchant ce problème, j'ai trouvé une solution possible (basée sur cet article http://fishpig.co.uk/magento/tutorials/update-prices-sql) avec réglage du special_price
dans la base de données directement comme ceci :
Note: bd_ est mon préfixe de table
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
Ce apparaît fonctionner (je peux voir la valeur dans l'interface utilisateur de magento mise à jour).Je ne suis pas encore sûr que ce soit la bonne façon de procéder pour définir le prix spécial directement dans la base de données.
De plus, je n'ai pas encore trouvé comment régler le from
/to
Rendez-vous.
Toute aide à ce sujet sera très appréciée.
La solution
Disons que $storeId
est le magasin pour lequel vous souhaitez mettre à jour le prix $specialPrice
est votre prix spécial, $sku
est le SKU de votre produit, $fromDate
et $toDate
sont... eh bien, vous voyez l'idée.
Maintenant, exécutez ce code :
$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
);
}
Autres conseils
Si vous souhaitez mettre à jour les produits existants, vous n'avez pas besoin d'effectuer les modifications manuellement.Importez simplement un fichier CSV qui ne doit contenir que les attributs sous forme de colonnes nécessaires à la mise à jour.Le SKU est un champ obligatoire, alors n'oubliez pas de l'inclure dans votre CSV.
Il importera des produits très rapidement.