-
-
Save Kamik/1faf506ea3440e07bb3bfb10c5ffaefb to your computer and use it in GitHub Desktop.
Delete no more used Product Images on Magento
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require_once 'abstract.php'; | |
class Mage_Shell_CheckImages extends Mage_Shell_Abstract | |
{ | |
const CATALOG_PRODUCT = '/catalog/product'; | |
const CACHE = '/cache/'; | |
protected function _glob_recursive($pattern, $flags = 0) | |
{ | |
$files = glob($pattern, $flags); | |
foreach (glob(dirname($pattern) . '/*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) { | |
$files = array_merge($files, $this->_glob_recursive($dir . '/' . basename($pattern), $flags)); | |
} | |
return $files; | |
} | |
public function run() | |
{ | |
if ($this->getArg('help')) { | |
echo $this->usageHelp(); | |
return; | |
} | |
$media = Mage::getBaseDir('media'); | |
$debug = $this->getArg('debug'); | |
$dryrun = $this->getArg('dry') ? true : false ; | |
$includeCache = $this->getArg('cache'); | |
$imagesOnDb = array(); | |
$imagesOnDisk = array(); | |
$setup = new Mage_Core_Model_Resource_Setup('core_setup'); | |
/** @var Varien_Db_Adapter_Pdo_Mysql $connection */ | |
$connection = $setup->getConnection(); | |
$sql = "SELECT DISTINCT value | |
FROM ( | |
SELECT value | |
FROM `{$setup->getTable('catalog_product_entity_media_gallery')}` | |
WHERE attribute_id | |
IN (SELECT attribute_id FROM `{$setup->getTable('eav_attribute')}` WHERE `attribute_code` in ('media_gallery') AND entity_type_id = 4) | |
UNION | |
SELECT value | |
FROM `{$setup->getTable('catalog_product_entity_varchar')}` | |
WHERE attribute_id | |
IN (SELECT attribute_id FROM `{$setup->getTable('eav_attribute')}` WHERE `attribute_code` in ('image','small_image','thumbnail') AND entity_type_id = 4) | |
) AS T"; | |
$result = $connection->query($sql); | |
foreach ($result->fetchAll() as $rec) { | |
$imagesOnDb[$rec['value']] = 1; | |
} | |
$imagesOnDb = array_keys($imagesOnDb); | |
if ($debug) print_r(array_slice($imagesOnDb, 0, 100)); | |
if ($debug) echo $media . "/*\n"; | |
$skip = strlen($media . self::CATALOG_PRODUCT); | |
foreach ($this->_glob_recursive($media . self::CATALOG_PRODUCT . '/*', GLOB_MARK) as $img) { | |
if (substr($img, -1) != '/') { | |
if ($includeCache || (substr($img, $skip, 7) != self::CACHE)) { | |
$imagesOnDisk[] = substr($img, $skip); | |
} | |
} | |
} | |
if ($debug) print_r(array_slice($imagesOnDisk, 0, 100)); | |
$imagesToDelete = array_diff($imagesOnDisk, $imagesOnDb); | |
if ($debug) { | |
print_r($imagesToDelete); | |
} else { | |
foreach ($imagesToDelete as $x) { | |
if ($dryrun) { | |
echo 'rm '.$media . self::CATALOG_PRODUCT . $x.PHP_EOL; | |
} else { | |
@unlink($media . self::CATALOG_PRODUCT . $x); | |
} | |
} | |
} | |
if ($debug) { | |
echo "\r\n"; | |
} | |
} | |
public function usageHelp() | |
{ | |
return <<<USAGE | |
Usage: php -f check_images.php | |
debug debug mode | |
cache remove cache images too | |
dry dryrun | |
USAGE; | |
} | |
} | |
$shell = new Mage_Shell_CheckImages(); | |
$shell->run(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment