Unbenutzte Produktbilder löschen

Manchmal entstehen gerade beim Batch-Import von Produkten ein paar Bildleichen. Diese habe ich entfernen können in dem geprüft habe ob zu jeder Datei im Dateisystem ein Eintrag in der Datenbank besteht.

Das Script sollte in einem beliebigen Unterordner liegen. Im Standardaufruf wird nur geprüft ob es Bildleichen gibt - gelöscht wird nicht. Will man die unbenutzten Bilder auch löschen kann dies durch Anhängen ?remove=YES passieren.

<?php
require_once dirname(__FILE__).'/../app/Mage.php';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

class cleanDir {

	protected $initDir;

	protected $freeSize = 0;

	function __construct($dir) {
		$this->initDir = $dir;
		$this->clean ( $dir );

		var_dump( $this->freeSize );
	}

	function clean( $dir ) {

		foreach(glob("$dir/*") AS $cur ) {

			if ( basename($cur) == '.' || basename($cur) == '..' ) {
				continue;
			}

			if ( is_dir($cur) ) {
				$this->clean( $cur );
			}

			if ( is_file($cur) ) {

				if( $this->isUsed( $cur ) ) {
					echo "<p style='color: green'>$cur wird behalten";
				} else {

					$this->freeSize += filesize( $cur );

					if ( $_GET['remove'] == 'YES' ) {
						echo "<p style='color: gred'>$cur WURDE gelöscht";
						unlink( $cur );
					} else {
						echo "<p style='color: gred'>$cur ist unnötig";
					}

				}

			}

		}

	}

	function isUsed( $image ) {

		$image = str_replace( $this->initDir, '', $image );
		if ( $image[0] != '/' ) {
			$image = '/'.$image;
		}

		$db = Mage::getSingleton('core/resource')->getConnection('core_read');

		$stmt = $db->query( "SELECT COUNT(*) AS anz
              		FROM `catalog_product_entity_media_gallery`
              		WHERE `value` LIKE ?", array( $image ) );

 		if ( $res = $stmt->fetch() ) {
 			if ( $res['anz'] > 0 ) {
 				return true;
 			}
 		}

		return false;
	}

}

$cd = new cleandir( Mage::getBaseDir('media').DS.'catalog'.DS.'product'.DS );

Benutzung natürlich auf eine Gefahr :)



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
Oli am

Tolles Script, danke. Mit Holgers Modifikation ist es dann bei mir auch gelaufen.

Es findet jede Menge Bilder auch im Ordner media/catalog/product//cache/.... Gestern habe ich von Magento den Bilder-Cache neu erstellen lassen und alle Bilder in dem gefundenen Ordner haben das gestrige Datum. Somit sind sie mit diesem Durchlauf erstellt worden, nehme ich an.

Wenn man also das script mit "?remove=YES" aufruft und alle unnötigen Bilder entfernen lässt, sollte man den Bilder-Cache neu erstellen, sehe ich das richtig?

Andrea am

Hallo Tobias,

vielen Dank für dein Script. Ich wollte es verwenden um eine alt Magento Installation (v. 1.2) zu entrümpeln bevor die Artikel samt Bilder in die inzwischen aufgesetzte Neuinstallation umgezogen werden.

Die Ausführung des Scripts beginnt vielversprechend unterbricht dann aber mit folgender Fehlermeldung:

/var/www/web40/html/media/catalog/product//0/1/016.JPG wird behalten

/var/www/web40/html/media/catalog/product//0/1/017.JPG wird behalten

/var/www/web40/html/media/catalog/product//0/1/018.JPG wird behalten

Fatal error: Uncaught exception 'Exception' with message 'Notice: Undefined index: remove in /var/www/web40/html/imagecleaner.php on line 38' in /var/www/web40/html/app/code/core/Mage/Core/functions.php:246 Stack trace: #0 /var/www/web40/html/imagecleaner.php(38): mageCoreErrorHandler(8, 'Undefined index...', '/var/www/web40/...', 38, Array) #1 /var/www/web40/html/imagecleaner.php(27): cleanDir->clean('/var/www/web40/...') #2 /var/www/web40/html/imagecleaner.php(27): cleanDir->clean('/var/www/web40/...') #3 /var/www/web40/html/imagecleaner.php(13): cleanDir->clean('/var/www/web40/...') #4 /var/www/web40/html/imagecleaner.php(77): cleanDir->__construct('/var/www/web40/...') #5 {main} thrown in /var/www/web40/html/app/code/core/Mage/Core/functions.php on line 246

Kannst du weiterhelfen? Vielen herzlichen Dank im Voraus!

Michal am

Hi Thomas,

die Datei legst Du in den Root-Ordner deiner Magento Installation ab. Zum Ausführen musst Du die Datei über den Browser aufrufen: www.deinedomain.de/DeinScript.php - dann wird das Script gestartet, sollten nun die Bilder gelöscht werde, einfach ?remove=YES hinzufügen, also www.deinedomain.de/DeinScript.php?remove=YES. Hoffe konnte helfen.

Thomas am

tolle Idee, als Anfänger tauchen einige Fragen auf.

Das Skript gehört in Shop Ordner (in eine.phtml)? wie wird es gestartet?

Danke für die Info

Krysis am

Cooles Script. Danke Nur noch ein Nachtrag, relevant für die welche ein Db-Tablename-Prefix benutzen. Im query die Zeile FROM catalog_product_entity_media_gallery gegen das hier tauschen FROM ".Mage::getSingleton('core/resource')->getTableName('catalog_product_entity_media_gallery')."

albert am

Hallo Zusammen, was muss man ändern damit es unter 1.8.1.0 laufen kann? danke albert

Michal am

Danke Holger, mit der Änderung hat es funktioniert. Danke auch für das Script :)

Holger am

Hallo Marc,

probier es mal hiermit:

define('MAGENTO_ROOT', getcwd()); require_once MAGENTO_ROOT . '/app/Mage.php';

Gruss Holger

Marc am

Hallo Tobias,

erstmal vielen Dank für dein Script. Bei mir läuft es leider nicht (vielleicht mache ich auch was falsch?). Ich habe das Script im Stammordner abgelegt (Magento 1.7.0.2). Habe es auch mit der Änderung von Andreas Vogler versucht. Ergebnis ist identisch:

Warning: require_once(C:\xampp\htdocs....../../app/Mage.php): failed to open stram: No such file or directory in C:\xampp\htdocs....\script.php on line 2

Fatal error: require_once(): Failed opening required 'C:\xampp\htdocs....../../app/Mage.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs......\script.php on line 2

Freue mich auf jede hilfreiche Unterstützung.

Im Voraus herzlichen Dank für deine Hilfe. Marc

Andreas Vogler am

Hallo Tobias,

vielen Dank für dein tolles Skript. Es läuft bei mir problemlos unter Magento 1.7.0.2, lediglich die Zeile "require_once dirname(FILE).'/../app/Mage.php';" musste ich in "require_once '/../app/Mage.php';" (mein prg liegt in root) ändern (kennt 1.7.0.2 den Befehl dirname... nicht mehr?).

Nochmal vielen Dank für deine Hilfe, Andreas

Tobias Vogt am

Hey Haiko,

das Script ist schon etwas älter. Pass auf das es mit aktuellen Magento-Versionen noch einwandfrei läuft! remove=yes must du einfach an das eigentlich Script anhängen. Also deinScript.php?remove=yes

Tobi

Haiko am

Wirklich klasse Skript. Es werden sämtliche (in meinem Fall sagenhafte 721361108) unbenutzte Bilddateien mit Pfad angezeigt.

Leider bin ich noch nicht dahinter gekommen wo ich den Codeschnipsel "?remove=YES" genau anhängen muss. Vielen Dank!

Tobias Vogt am

Sorry, leider nicht..

gringo am

Haste sowas auch für Wordpress zur Hand? ;)

Tobias Vogt am

Danke schön, ich freue mich immer über Feedback :)

Josef am

Hallo, super Skript, vielen Dank! :)

Dein Kommentar