buzzoole code
Web Marketing

Come aggiornare velocemente i prezzi dei prodotti in Magento

aggiornare prezzi magento

Spesso capita di dover aggiornare in modo rapido i prezzi dei prodotti di Magento.
Nel caso il negozio non possieda un grande numero di articoli, questo procedimento di può comodamente fare a mano utilizzando il backend di Magento stesso e la scheda prodotto.
Ma quando si ha a che fare con uno store contenente migliaia o decine di migliaia di articoli questo procedimento risulterebbe troppo dispendioso in termini di tempo, per questo si può utilizzare una semplice query e un file in formato CSV; vediamo come.

Prima di tutto ci tengo a precisare che questo codice è stato scritto dai mitici autori del blog di Magepsycho a cui non voglio sottrarre il merito.
Creiamo un file CSV contenente solamente due colonne: nella prima inseriamo gli sku dei prodotti e nella seconda i prezzi da aggiornare.
Creato il file andrà fatto l’upload dello stesso all’ interno della root principale di Magento. Non inseritelo da altre parti altrimenti il codice non funzionerà.

A questo punto create un file PHP con il vostro editor preferito e chiamatelo per esempio upload_prezzi.php e copiate al suo interno il codice seguente(ripeto creato dagli autori di Magepsycho):


/**
* @author MagePsycho <info@magepsycho.com>
* @website http://www.magepsycho.com
* @category Export / Import
*/
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app('admin');
Mage::register('isSecureArea', 1);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
set_time_limit(0);
ini_set('memory_limit','1024M');
/***************** UTILITY FUNCTIONS ********************/
function _getConnection($type = 'core_read'){
return Mage::getSingleton('core/resource')->getConnection($type);
}
function _getTableName($tableName){
return Mage::getSingleton('core/resource')->getTableName($tableName);
}
function _getAttributeId($attribute_code = 'price'){
$connection = _getConnection('core_read');
$sql = "SELECT attribute_id
FROM " . _getTableName('eav_attribute') . "
WHERE
entity_type_id = ?
AND attribute_code = ?";
$entity_type_id = _getEntityTypeId();
return $connection->fetchOne($sql, array($entity_type_id, $attribute_code));
}
function _getEntityTypeId($entity_type_code = 'catalog_product'){
$connection = _getConnection('core_read');
$sql = "SELECT entity_type_id FROM " . _getTableName('eav_entity_type') . " WHERE entity_type_code = ?";
return $connection->fetchOne($sql, array($entity_type_code));
}
function _getIdFromSku($sku){
$connection = _getConnection('core_read');
$sql = "SELECT entity_id FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?";
return $connection->fetchOne($sql, array($sku));
}
function _checkIfSkuExists($sku){
$connection = _getConnection('core_read');
$sql = "SELECT COUNT(*) AS count_no FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?";
$count = $connection->fetchOne($sql, array($sku));
if($count > 0){
return true;
}else{
return false;
}
}
function _updatePrices($data){
$connection = _getConnection('core_write');
$sku = $data[0];
$newPrice = $data[1];
$productId = _getIdFromSku($sku);
$attributeId = _getAttributeId();
$sql = "UPDATE " . _getTableName('catalog_product_entity_decimal') . " cped
SET cped.value = ?
WHERE cped.attribute_id = ?
AND cped.entity_id = ?";
$connection->query($sql, array($newPrice, $attributeId, $productId));
}
/***************** UTILITY FUNCTIONS ********************/
$csv = new Varien_File_Csv();
$data = $csv->getData('prices.csv'); //path to csv
array_shift($data);
$message = '';
$count = 1;
foreach($data as $_data){
if(_checkIfSkuExists($_data[0])){
try{
_updatePrices($_data);
$message .= $count . '> Success:: While Updating Price (' . $_data[1] . ') of Sku (' . $_data[0] . ').
';
}catch(Exception $e){
$message .= $count .'> Error:: While Upating Price (' . $_data[1] . ') of Sku (' . $_data[0] . ') => '.$e->getMessage().'
';
}
}else{
$message .= $count .'> Error:: Product with Sku (' . $_data[0] . ') does\'t exist.
';
}
$count++;
}
echo $message;

Dopodichè non resterà che digitare sulla barra degli indirizzi www.nometuosito.com/upload_prezzi.php.
E voilà i prezzi dei vostri prodotti verranno aggiornati in un attimo.
Analogamente si può fare con le giacenze di magazzino o con qualsiasi altro attributo creato da voi, applicando solo alcune piccole modifiche al codice.

VERSIONE DI MAGENTO DI TEST: 1.7.2
PROBLEMI RISCONTRATI: nel caso riceviate un errore 503 dopo aver eseguito il codice vi consiglio di editare la riga in cui viene riportato la dicitura ini_set('memory_limit','1024M'); in quanto non sempre vi è possibile modificare questo valore di configurazione del file php.ini. Dipende dall’hosting che avete.
Una cosa a cui fare molta attenzione è il fatto che questo metodo non prevede alcun controllo su chi effettua l’aggiornamento, chiunque digiti l’url corretto può lanciare lo script, Per questo consiglio vivamente di proteggere il file upload_prezzi con user e password.

About the author

admin

Ciao Sono Davide Ambu, web designer e consulente di web marketing freelance. Parlo solo di marketing che non interessa a nessuno

3 Comments

Click here to post a comment

  • Salve, ho già utilizzato in passato questo codice e ha correttamente funzionato.
    Ora però ho la necessità di cambiare il listino (i prezzi di tutti i prodotti o quasi!) SOLO per un determinato web store. In Magento ho infatti 3 negozi (Web Store), e per ognuno differenti viste negozio. Devo aggiornare il listino del 3° web store creato.
    Come è possibile modificare il presente codice per poter velocemente modificare SOLO i prezzi riferiti al 3° web store e mantenere invariati tutti gli altri?
    Grazie mille!

    • Buongiorno Angela, devi usare la colonna “store” andando ad inserire il codice dello store che vuoi aggiornare in modo da ottenere un file simile

      store,sku, price
      abc, 1001, 5.00
      bab, 1001, 7.00

      lo sku dovrebbe essere lo stesso in tutti gli store

  • Ciao sono Ettore,

    Ho provato lo script e funziona benissimo.

    Come potrei fare per aggiornare anche il tier_price e group_price?

    Saluti

Su di me

admin

Ciao Sono Davide Ambu, web designer e consulente di web marketing freelance. Parlo solo di marketing che non interessa a nessuno

Ci rivediamo su Facebook!