Rensa upp ej använda Magento-bilder
Magento tar tyvärr inte bort bilder på en produkt tyvärr om produkten tas bort. Följande skript kontrollerar alla bilder och kontrollerar om de fortfarande finns i databasen för Magento. Om inte, raderas bilden. Använd följande kod:
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;
}
?>
Rensa upp Magento-utrymme: kan spara många GB
I mitt fall provade jag skriptet för en butik med 40K bilder varav 10K inte användes. Detta är en minskning av diskutrymmet med några gigabyte.
Sista ord
Detta manus är tack vare en kommentar på RapidCommerce. Om du använder skriptet är det på ditt eget ansvar. Prova det på en staging-server och gör en säkerhetskopia i förväg. skål!
Senast uppdaterad 26 januari 2015
Hej, jag använder skriptet med delete.php-namnet i roten, för att köra med webbläsaren, det visas att filerna uteslöts, men de finns fortfarande i den!
Ändra
annan
{
echo "Ta bort bild : $image\n";
//if($testrun==false) unlink($image);
$removedCount++;
}
till
annan
{
echo "Ta bort bild : $image\n";
unlink($image);
$removedCount++;
}
hej, jag får det här felet
Frågedatabas för bilder...
Fatalt fel: Oupptäckt undantag 'PDOException' med meddelandet 'SQLSTATE[42S02]: Bastabell eller vy hittades inte: 1146 Tabell 'muslimas_mage958.catalog_product_entity_media_gallery' existerar inte' i /home/muslimas/public_html/lib/Zend/Db.phcement:/Pdo8/trapement:/P28/trapement: #0 /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php(228): PDOStatement->exekvera(Array) #1 /home/muslimas/public_html/lib/Varien/Db/Statement/Pdo/Mysql.php_Do_Array(110): Zene_Statement(110_) #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/tract.php/480):(Abs) Zend_Db_Statement->exekvera(Array) #4 /home/muslimas/public_html/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('VÄLJ värde FR...', Array) #5 /home/muslimas/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('SELECT value FR…', Array) #6 /home/muslimas/public_html/lib/Zend/Dbbs):/Aapterp/tractAdapter/Dbbs): /home/muslimas/public_html/lib/Zend/Db/Statement/Pdo.php på rad 235
Du kan ha ett prefix för databastabellnamn. Skriptet använder inte den inbyggda funktionen för att få tabellnamnet, så det finns inget prefix. Försök att ersätta tabellnamnet med Mage::getSingleton('core/resource')->getTableName('catalog_product_entity_media_gallery')
hej jag använde ditt skript men det ger fel PDOexception
Fungerade perfekt, tack för att du delar med dig!
Mycket bättre att köra än någon av modulerna erbjuder som inte riktigt kan hantera stora mängder produktbilder.