Nettoyer les images Magento non utilisées
Magento ne supprime malheureusement pas les images d'un produit si le produit est supprimé. Le script suivant vérifie toutes les images et vérifie si elles sont toujours présentes dans la base de données de Magento. Si ce n'est pas le cas, il supprime l'image. Utilisez le code suivant :
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; } ?>
Nettoyer l'espace Magento : cela pourrait économiser beaucoup de Go
Dans mon cas, j'ai essayé le script pour un store avec 40K images dont 10K n'ont pas été utilisées. Il s'agit d'une réduction d'espace disque de quelques gigaoctets.
Dernier mot
Ce script est grâce à un commentaire sur RapidCommerce. Si vous utilisez le script, c'est sous votre propre responsabilité. Essayez-le sur un serveur de test et faites une sauvegarde à l'avance. Santé !
Bonjour, j'utilise le script avec le nom delete.php à la racine, pour exécuter avec le navigateur, il est indiqué que les fichiers ont été exclus, mais ils sont toujours dedans !
Changement
autre
{
echo « Supprimer l’image : $image\n » ;
//si($testrun==false) unlink($image);
$ suppriméCount++;
}
à
autre
{
echo « Supprimer l’image : $image\n » ;
dissocier($image);
$ suppriméCount++;
}
bonjour, j'ai cette erreur
Interroger la base de données pour les images…
Erreur fatale : Exception non interceptée « PDOException » avec le message « SQLSTATE[42S02] : Table ou vue de base non trouvée : 1146 La table « muslimas_mage958.catalog_product_entity_media_gallery » n'existe pas » dans /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php:228 Pile d'exécution : #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 value FR…', Array) #5 /home/muslimas/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('SELECT value FR…', Tableau) #6 /home/muslimas/public_html/lib/Zend/Db/Adapter/Abstract.php(737) : dans /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php à la ligne 235
Vous avez peut-être un préfixe de nom de table de base de données. Le script n'utilise pas la fonction intégrée pour obtenir le nom de la table, il n'y a donc pas de préfixe. Essayez de remplacer le nom de la table par Mage::getSingleton('core/resource')->getTableName('catalog_product_entity_media_gallery')
Salut, j'ai utilisé votre script mais il donne une erreur PDOexception
Cela a parfaitement fonctionné, merci pour le partage !
Bien plus facile à exécuter que n'importe lequel des modules proposés qui ne peuvent pas vraiment gérer une grande quantité d'images de produits.