未使用のカタログ製品画像を削除


7

3年以上かけて、使用されなくなったが削除されなかった製品イメージが大量に蓄積されたmagentoストアを引き継ぎました。

使用されているすべての画像を保持しながら、使用されなくなったすべての画像を削除する方法はありますか?モジュール/拡張機能を検索しましたが、magento 1.9コミュニティで動作するものは見つかりませんでした。


Magentoは画像ウィンドウを実行せず、古い引用などのその他のハウスキーピングがオプションの場合もあります...これにより、ファイルシステムとデータベースが肥大化します。Connectで最初にImage Cleanモジュールを生成したのは、カスケードのinnodb削除に依存する過去の日付で削除するための見積もりの​​クリーニング用のさまざまなスクリプト
Fiasco Labs

回答:


7

次のシェルスクリプトを試すことができます:https : //gist.github.com/aleron75/07ab2a950b2e3429a820

v 1.9.xではテストしていません。まだ

注:本番環境で使用する前にバックアップを実行し、ステージング環境でテストしてください。

それが役に立てば幸い。

よろしく、アレッサンドロ


シェルにアクセスできません。PHPでこれを行う方法はありますか?
odd_duck 2015年

基本的なロジックを理解していれば、スクリプトをコントローラーアクションメソッドに移植することができます。
アレッサンドロロンキ2015年

4

このスクリプトをMagentoインストールのルートにアップロードして、ブラウザーからでも実行できます。

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

メディアの属性にこれらのIDがあるかどうかを確認してください。

これを忘れると、物事が壊れる可能性があります

cpv.attribute_id in(85, 86, 87)

製品ごとに重複ファイルを検出するチェックサムを作成し、ファイルシステムとデータベースからこれらのリンクを解除します。

2番目のステップは、ファイルシステム上にあり、データベースに存在しないファイルを検出することです。

1.7以降で使用したため、動作するはずです。

あなたが賢いなら、私はいつも最初にバックアップを作成することを常に勧めます。


2

このPHPスクリプトをMagentoのルートパスに入れて、ブラウザーから呼び出すことができます。

スクリプトWebコンソール

スクリプトはdry-mode、安全なテストのためにデフォルトで実行され、すべてが説得力があるように聞こえた場合に実際に孤児を削除できます。


このスクリプトは、未使用の画像のみを表示しますが、データベースから画像は削除しません...
Sarfaraj Sipai

1

に行くことをお勧めします

システム->キャッシュ管理->カタログ画像キャッシュのフラッシュ。

これにより、生成されたすべての画像が削除され、ユーザーがサイトにアクセスしたときに画像が再生成されます。


0

以下のスクリプトをmagentoルートに配置して実行します

  <?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;
  }

 }

0

私はこのN98-magerunモジュールを使用することをお勧め呼ばれるEAVCleanerを

インストール後、次のコマンドを実行して、未使用の製品イメージを削除します

n98-magerun eav:media:remove-unused

他のスクリプトよりもこのモジュールを使用する利点は、大量の画像を削除できることです。上記にリンクされている他のスクリプトのほとんどは、画像の配列を作成してから削除します。これにより、メディアディレクトリが走査され、未使用のイメージが見つかると削除されます。

クライアントの製品情報管理システムが毎日新しい製品の画像をアップロードしていて、メディアディレクトリのサイズが約400 GBに膨れ上がるという問題が発生しました。私たちが見つけた他のすべてのスクリプトは、何百もの画像ファイルパスをメモリに配置しようとし、エラーになります。このスクリプトはトリックをしました


0

この方法は私にとって非常にうまくいきました:

githubリポジトリ

使い方:

手順1:実行前にディレクトリサイズを確認する

du -s

ステップ2:dajve氏のコードをコピーしてファイルを作成する

vi shell/shell_delete_unused_images.php

ステップ3:ファイルを実行する

php shell/shell_delete_unused_images.php

手順4:実行後にディレクトリサイズを確認する

du -s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.