3年以上かけて、使用されなくなったが削除されなかった製品イメージが大量に蓄積されたmagentoストアを引き継ぎました。
使用されているすべての画像を保持しながら、使用されなくなったすべての画像を削除する方法はありますか?モジュール/拡張機能を検索しましたが、magento 1.9コミュニティで動作するものは見つかりませんでした。
3年以上かけて、使用されなくなったが削除されなかった製品イメージが大量に蓄積されたmagentoストアを引き継ぎました。
使用されているすべての画像を保持しながら、使用されなくなったすべての画像を削除する方法はありますか?モジュール/拡張機能を検索しましたが、magento 1.9コミュニティで動作するものは見つかりませんでした。
回答:
次のシェルスクリプトを試すことができます:https : //gist.github.com/aleron75/07ab2a950b2e3429a820
v 1.9.xではテストしていません。まだ
注:本番環境で使用する前にバックアップを実行し、ステージング環境でテストしてください。
それが役に立てば幸い。
よろしく、アレッサンドロ
このスクリプトをMagentoインストールのルートにアップロードして、ブラウザーからでも実行できます。
https://gist.github.com/JeroenBoersma/60a4acb8e56498bce41c
これを忘れると、物事が壊れる可能性があります
cpv.attribute_id in(85, 86, 87)
製品ごとに重複ファイルを検出するチェックサムを作成し、ファイルシステムとデータベースからこれらのリンクを解除します。
2番目のステップは、ファイルシステム上にあり、データベースに存在しないファイルを検出することです。
1.7以降で使用したため、動作するはずです。
あなたが賢いなら、私はいつも最初にバックアップを作成することを常に勧めます。
このPHPスクリプトをMagentoのルートパスに入れて、ブラウザーから呼び出すことができます。
スクリプトはdry-mode
、安全なテストのためにデフォルトで実行され、すべてが説得力があるように聞こえた場合に実際に孤児を削除できます。
に行くことをお勧めします
システム->キャッシュ管理->カタログ画像キャッシュのフラッシュ。
これにより、生成されたすべての画像が削除され、ユーザーがサイトにアクセスしたときに画像が再生成されます。
以下のスクリプトを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;
}
}
私はこのN98-magerunモジュールを使用することをお勧め呼ばれるEAVCleanerを
インストール後、次のコマンドを実行して、未使用の製品イメージを削除します
n98-magerun eav:media:remove-unused
他のスクリプトよりもこのモジュールを使用する利点は、大量の画像を削除できることです。上記にリンクされている他のスクリプトのほとんどは、画像の配列を作成してから削除します。これにより、メディアディレクトリが走査され、未使用のイメージが見つかると削除されます。
クライアントの製品情報管理システムが毎日新しい製品の画像をアップロードしていて、メディアディレクトリのサイズが約400 GBに膨れ上がるという問題が発生しました。私たちが見つけた他のすべてのスクリプトは、何百もの画像ファイルパスをメモリに配置しようとし、エラーになります。このスクリプトはトリックをしました
この方法は私にとって非常にうまくいきました:
使い方:
手順1:実行前にディレクトリサイズを確認する
du -s
ステップ2:dajve氏のコードをコピーしてファイルを作成する
vi shell/shell_delete_unused_images.php
ステップ3:ファイルを実行する
php shell/shell_delete_unused_images.php
手順4:実行後にディレクトリサイズを確認する
du -s