Magento cleanup unused product images
<?php | |
/** | |
* Cleanup images from Magento | |
*/ | |
require 'app/Mage.php'; | |
if (!Mage::isInstalled()) { | |
echo "Application is not installed yet, please complete install wizard first."; | |
exit; | |
} | |
Mage::app('admin')->setUseSessionInUrl(false); | |
umask(0); | |
$connection = Mage::getSingleton('core/resource') | |
->getConnection('core_write'); | |
$sql = "select distinct " | |
. "cp.entity_id, " | |
. "cpg.value_id, " | |
. "cpv.value as default_value, " | |
. "cpg.value " | |
. "from catalog_product_entity as cp " | |
. "join catalog_product_entity_varchar as cpv on cp.entity_id = cpv.entity_id " | |
. "join catalog_product_entity_media_gallery as cpg on cp.entity_id = cpg.entity_id " | |
. "where " | |
// . "1 = 2 " | |
// . "and " | |
. "cpv.attribute_id in(85, 86, 87) " | |
. "and " | |
. "cpv.value != cpg.value;"; | |
$results = $connection->fetchAll($sql); | |
$media = 'media/catalog/product'; | |
$lastEntityId = null; | |
$origSums = array(); | |
foreach ($results as $row) { | |
if ($row['entity_id'] != $lastEntityId) { | |
$lastEntityId = $row['entity_id']; | |
$origSums = array(); | |
} | |
$origFile = $media . $row['default_value']; | |
if (!file_exists($origFile)) { | |
continue; | |
} | |
$file = $media . $row['value']; | |
if (file_exists($file)) { | |
if (!isset($origSums[$origFile])) { | |
$origSums[$origFile] = md5_file($origFile); | |
} | |
$sum = md5_file($file); | |
if (!in_array($sum, $origSums)) { | |
$origSums[$file] = $sum; | |
} else { | |
echo 'Delete image ' . $file . ' (#' . $row['entity_id'] . ')' . PHP_EOL; | |
unlink($file); | |
} | |
} | |
if (!file_exists($file)) { | |
echo 'Delete record for ' . $file . ' (#' . $row['entity_id'] . ')' . PHP_EOL; | |
$deleteSql = 'delete from catalog_product_entity_media_gallery where value_id = ' . $row['value_id'] . ';'; | |
$connection->query($deleteSql); | |
} | |
} | |
// Find files on filesystem which aren't listed in the database | |
$files = glob($media . '/[A-z0-9]/*/*'); | |
foreach ($files as $file) { | |
$searchFile = str_replace($media, '', $file); | |
// Lookup | |
$mediaSql = "select count(*) as records from catalog_product_entity_media_gallery where value = '{$searchFile}'"; | |
$mediaCount = $connection->fetchOne($mediaSql); | |
if ($mediaCount < 1) { | |
echo 'Delete image ' . $file . PHP_EOL; | |
unlink($file); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Jeroen, thank you for your script. I improved it a little by adding dry-run feature and web console. You can find it here.
Regards
Adriano C.