Magento supprime les images des produits supprimés

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é !

Réflexions de 6 sur « Magento remove images of deleted products »

  1. 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 !

    1. 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++;
      }

  2. 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

    1. 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')

  3. 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

fr_FRFrançais
Défiler vers le haut