Löschen Sie nicht verwendete Katalogproduktbilder

7

Ich habe einen Magento-Shop übernommen, der über 3 Jahre eine große Anzahl von Produktbildern erstellt hat, die nicht mehr verwendet werden, aber nie gelöscht wurden.

Gibt es eine Möglichkeit, alle nicht mehr verwendeten Bilder zu löschen und gleichzeitig alle verwendeten Bilder beizubehalten? Ich habe nach einem Modul / einer Erweiterung gesucht, aber keines gefunden, das mit der Magento 1.9-Community funktioniert.

komische Ente
quelle
Magento führt keine Bildfenster aus, manchmal ist auch eine andere Verwaltung optional, z. B. alte Anführungszeichen ... Dies führt zu einem Aufblähen des Dateisystems und der Datenbank. Was das Image Clean-Modul zum ersten Mal auf Connect hervorgebracht hat, verschiedene Skripte für die Bereinigung von Zitaten, die davon abhängen, dass Innodb auf Kaskade gelöscht wird, um sie durch vergangene Daten zu beseitigen
Fiasco Labs

Antworten:

7

Sie können das folgende Shell-Skript ausprobieren: https://gist.github.com/aleron75/07ab2a950b2e3429a820

Ich habe es nicht auf Version 1.9.x getestet. noch

Hinweis: Erstellen Sie ein Backup, bevor Sie es in einer Produktionsumgebung verwenden, und testen Sie es möglicherweise zuvor in einer Staging-Umgebung.

Ich hoffe es hilft.

Herzliche Grüße, Alessandro

Alessandro Ronchi
quelle
Ich habe keinen Zugriff auf die Shell. Gibt es eine Möglichkeit, dies in PHP zu tun?
odd_duck
Wenn Sie die zugrunde liegende Logik verstehen, können Sie versuchen, das Skript in eine Controller-Aktionsmethode zu portieren.
Alessandro Ronchi
4

Sie können dieses Skript in das Stammverzeichnis Ihrer Magento-Installation hochladen und es sogar über Ihren Browser ausführen.

https://gist.github.com/JeroenBoersma/60a4acb8e56498bce41c

Überprüfen Sie, ob Ihre Attribute für Medien diese IDs haben.

Wenn Sie dies vergessen, könnten Sie möglicherweise Dinge zerbrechen

cpv.attribute_id in(85, 86, 87)

Es werden Prüfsummen erstellt, um doppelte Dateien pro Produkt zu erkennen und diese vom Dateisystem und der Datenbank zu trennen.

Der zweite Schritt ist das Erkennen von Dateien, die sich im Dateisystem und nicht mehr in der Datenbank befinden.

Verwendet es ab 1.7, also sollte es funktionieren.

Wenn Sie schlau sind, empfehle ich immer, zuerst ein Backup zu erstellen.

Jeroen
quelle
2

Sie können dieses PHP-Skript in den Magento- Stammpfad einfügen und es vom Browser aus aufrufen:

Skript-Webkonsole

Das Skript wird standardmäßig dry-modefür einen sicheren Test ausgeführt, mit dem Sie Waisenkinder tatsächlich löschen können, wenn alles überzeugend klingt.

Eddie C.
quelle
Dieses Skript zeigt nur unbenutzte Bilder an, löscht jedoch keine Bilder aus der Datenbank ...
Sarfaraj Sipai
1

Ich würde empfehlen, zu gehen

System -> Cache-Verwaltung -> Katalog-Image-Cache leeren.

Dadurch werden alle generierten Bilder entfernt und neu generiert, wenn ein Benutzer die Site besucht.

Digitalyst
quelle
0

Platzieren Sie das folgende Skript in Magento Root und führen Sie es aus

  <?php

  require_once("app/Mage.php");
  umask(0);
  Mage::app();
  $ob = new Clean();
  $ob->removemedia();

  Class Clean {

  function removemedia() {
    $read = Mage::getSingleton('core/resource')->getConnection('core_read');
    $select = $read->select()
            ->from('catalog_product_entity_media_gallery', '*')
            ->group(array('value_id'));

    $flushImages = $read->fetchAll($select);
    echo count($flushImages);
    $array = array();
    foreach ($flushImages as $item1) {
        $array[] = $item1['value'];
    }

    $valores = $array;

    $pepe = 'media' . DS . 'catalog' . DS . 'product';

    $leer = $this->listDirectories($pepe);

    foreach ($leer as $item) {
        try {
            $item = strtr($item, '\\', '/');
            if (!in_array($item, $valores)) {
                $valdir[]['filename'] = $item;
                unlink('media/catalog/product' . $item);
            }
        } catch (Zend_Db_Exception $e) {

        } catch (Exception $e) {
            //Mage::log($e->getMessage());
        }
    }
}

function listDirectories($path) {
    if (is_dir($path)) {
        if ($dir = opendir($path)) {
            while (($entry = readdir($dir)) !== false) {
                if (preg_match('/^\./', $entry) != 1) {
                    if (is_dir($path . DS . $entry) && !in_array($entry, array('cache', 'watermark'))) {
                        $this->listDirectories($path . DS . $entry);
                    } elseif (!in_array($entry, array('cache', 'watermark')) && (strpos($entry, '.') != 0)) {
                        $this->result[] = substr($path . DS . $entry, 21);
                    }
                }
            }
            closedir($dir);
        }
    }
    return $this->result;
  }

 }
Bharani K.
quelle
0

Ich empfehle die Verwendung dieses n98-magerun-Moduls namens EAVCleaner

Führen Sie nach der Installation den folgenden Befehl aus, um nicht verwendete Produktabbilder zu entfernen

n98-magerun eav:media:remove-unused

Ein Vorteil der Verwendung dieses Moduls gegenüber den anderen Skripten besteht darin, dass eine größere Anzahl von Bildern gelöscht werden kann. Die meisten anderen oben verlinkten Skripte erstellen eine Reihe von Bildern und löschen sie dann. Dadurch wird das Medienverzeichnis durchlaufen und das nicht verwendete Bild entfernt, wenn es gefunden wird

Wir haben ein Problem festgestellt, bei dem das Produktinformationsmanagementsystem eines Kunden jeden Tag neue Produktbilder hochlud und das Medienverzeichnis auf fast 400 GB vergrößert wurde. Jedes andere Skript, das wir gefunden haben, hat versucht, die Hunderte von Bilddateipfaden in den Speicher zu stellen, und es kam zu Fehlern. Dieses Skript hat es geschafft


quelle
0

Dieser Weg hat bei mir sehr gut funktioniert:

Github-Repository

Wie benutzt man:

Schritt 1: Überprüfen Sie die Verzeichnisgröße vor der Ausführung

du -s

Schritt 2: Kopieren Sie den Mr. Dajve-Code und erstellen Sie eine Datei in

vi shell/shell_delete_unused_images.php

Schritt 3: Datei ausführen

php shell/shell_delete_unused_images.php

Schritt 4: Überprüfen Sie die Verzeichnisgröße nach der Ausführung

du -s
Davi Reinoldo
quelle