Magento elimina imágenes de productos eliminados

Limpiar imágenes de Magento no utilizadas

Lamentablemente, Magento no elimina las imágenes de un producto si se elimina el producto. El siguiente script verifica todas las imágenes y si aún están presentes en la base de datos de Magento. Si no es así, elimina la imagen. Utilice el siguiente código:

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;
}

?>

Limpiar el espacio de Magento: podría ahorrar muchos GB

En mi caso, he probado el script para una tienda con 40K imágenes de las cuales 10K no se han utilizado. Esto supone una reducción de espacio en disco de unos pocos Gigabytes.

Palabra final

Este script es gracias a un comentario en Comercio rápidoSi utilizas el script, es bajo tu propia responsabilidad. Pruébalo en un servidor de prueba y haz una copia de seguridad con antelación. ¡Saludos!

Pensamientos de 6 en “Magento remove images of deleted products”

  1. Hola, uso el script con el nombre delete.php en la raíz, para ejecutarlo con el navegador, se muestra que los archivos fueron excluidos, ¡pero todavía están en él!

    1. Cambiar

      demás
      {
      echo “Eliminar imagen: $image\n”;
      //si($testrun==falso) desvincular($image);
      $removedCount++;
      }

      a

      demás
      {
      echo “Eliminar imagen: $image\n”;
      desvincular($image);
      $removedCount++;
      }

  2. Hola, me sale este error

    Consultar base de datos de imágenes…
    Error fatal: Excepción no detectada 'PDOException' con el mensaje 'SQLSTATE[42S02]: No se encontró la tabla base o vista: 1146 La tabla 'muslimas_mage958.catalog_product_entity_media_gallery' no existe en /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php:228 Rastro de pila: #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(Matriz) #3 /home/muslimas/public_html/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Matriz) #4 /home/muslimas/public_html/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECCIONAR valor FR…', Matriz) #5 /home/muslimas/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('SELECCIONAR valor FR…', Matriz) #6 /home/muslimas/public_html/lib/Zend/Db/Adapter/Abstract.php(737): en /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php en la línea 235

    1. Es posible que tenga un prefijo de nombre de tabla de base de datos. El script no utiliza la función incorporada para obtener el nombre de la tabla, por lo que no hay prefijo. Intente reemplazar el nombre de la tabla con Mage::getSingleton('core/resource')->getTableName('catalog_product_entity_media_gallery')

  3. Funcionó perfectamente, ¡gracias por compartir!
    Mucho mejor de ejecutar que cualquiera de los módulos que realmente no pueden manejar grandes cantidades de imágenes de productos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol
Ir arriba