Unbenutzte Produktbilder löschen

07.04.2010   //   von Tobias Vogt   //   Entwicklung, Magento  //  11 Kommentare

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</p>";
				} else {

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

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

				}

			}

		}

	}

	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 :)

Der Autor

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Beschäftigt ist er bei der code-x GmbH, einer Agentur für Internet und Marketing aus Paderborn. 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.

11 Kommentare

  • Hallo,
    super Skript, vielen Dank! :)

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

  • Haste sowas auch für WordPress zur Hand? ;)

  • Sorry, leider nicht..

  • 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!

  • 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

  • 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

  • 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

  • Hallo Marc,

    probier es mal hiermit:

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

    Gruss Holger

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

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

Kommentar schreiben

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.