Pulisci le immagini Magento non utilizzate
Magento purtroppo non rimuove le immagini di un prodotto purtroppo se il prodotto viene rimosso. Lo script seguente controlla tutte le immagini e verifica se sono ancora presenti nel database di Magento. In caso contrario, elimina l'immagine. Utilizza il seguente codice:
setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
set_time_limit(0);
ini_set('memory_limit','1024M');
$media = Mage::getBaseDir('media').'/catalog/product';
echo "Query database for images …\n";
$query = "SELECT value FROM catalog_product_entity_media_gallery";
$data = Mage::getSingleton('core/resource')->getConnection('core_read')->fetchAll($query);
$dbData=array();
foreach($data as $item){
$dbData[$item['value']]=$item['value'];
}
echo "Images found in database:".count($dbData)."\n";
echo "Search images in media directory …\n";
$images = findFiles($media, array('jpg'));
echo "Images found under directory ($media):".count($images['jpg'])."\n";
echo "Start removing images …\n";
$removedCount=0;
$skippedCount=0;
foreach($images['jpg'] as $image) {
if(strpos($image,'cache')!==false)
{
//echo "Skip cached image : $image\n";
continue;
}
$imageCleanup = str_replace($media,"",$image);
if(isset($dbData[$imageCleanup]))
{
echo "Skip image is in database : $image\n";
$skippedCount++;
continue;
}
else
{
echo "Remove image : $image\n";
//if($testrun==false) unlink($image);
$removedCount++;
}
}
echo "Done, removed $removedCount images and skipped $skippedCount images.\n";
function findFiles($directory, $extensions = array()) {
function glob_recursive($directory, &$directories = array()) {
foreach(glob($directory, GLOB_ONLYDIR | GLOB_NOSORT) as $folder) {
$directories[] = $folder;
glob_recursive("{$folder}/*", $directories);
}
}
glob_recursive($directory, $directories);
$files = array ();
foreach($directories as $directory) {
foreach($extensions as $extension) {
foreach(glob("{$directory}/*.{$extension}") as $file) {
$files[$extension][] = $file;
}
}
}
return $files;
}
?>
Pulisci lo spazio di Magento: potresti risparmiare un sacco di GB
Nel mio caso, ho provato lo script per un archivio con 40K immagini di cui 10K non sono state utilizzate. Si tratta di una riduzione di spazio su disco di alcuni Gigabyte.
Parola finale
Questo script è grazie a un commento su Commercio rapido. Se usi lo script, è sotto la tua responsabilità. Provalo su un server di staging e fai un backup in anticipo. Salute!
Ultimo aggiornamento il 26 gennaio 2015
Ciao, utilizzo lo script con il nome delete.php alla radice, per eseguirlo con il browser, viene visualizzato che i file sono stati esclusi, ma sono ancora presenti!
Modifica
altro
{
echo “Rimuovi immagine: $image\n”;
//if($testrun==false) unlink($image);
$removedCount++;
}
A
altro
{
echo “Rimuovi immagine: $image\n”;
unlink($immagine);
$removedCount++;
}
ciao, ho questo errore
Interroga il database per le immagini …
Errore fatale: eccezione non rilevata 'PDOException' con messaggio 'SQLSTATE[42S02]: tabella di base o vista non trovata: 1146 La tabella 'muslimas_mage958.catalog_product_entity_media_gallery' non esiste' in /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php:228 Stack trace: #0 /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array) #1 /home/muslimas/public_html/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array) #2 /home/muslimas/public_html/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array) #3 /home/muslimas/public_html/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array) #4 /home/muslimas/public_html/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT valore FR…', Array) #5 /home/muslimas/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('SELECT valore FR…', Array) #6 /home/muslimas/public_html/lib/Zend/Db/Adapter/Abstract.php(737): in /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php alla riga 235
Potresti avere un prefisso tablename del database. Lo script non sta usando la funzione integrata per ottenere il nome della tabella, quindi non c'è alcun prefisso. Prova a sostituire il nome della tabella con Mage::getSingleton('core/resource')->getTableName('catalog_product_entity_media_gallery')
ciao ho usato il tuo script ma mi dà errore PDOexception
Ha funzionato perfettamente, grazie per la condivisione!
Molto più efficiente da gestire rispetto a qualsiasi altro modulo che non riesce a gestire grandi quantità di immagini di prodotti.