Удаление фото если они не закреплены за товаром - чистка сервера от лишних изображений
Делюсь скриптом простого удаления всех ненужных фото удаленных товаров
Когда в Opencart удаляется товар, фото физически остается на сервере а удаляется лишь в базе сам товар и привязка к файлу.
Чем это плохо?
Первое - это накопление ненужных файлов. Как следствие, для магазина требуется еще больше памяти на сервере, а это дополнительные затраты. Второе - при наличии большого количества файлов сайт может подтормаживать.
По-этому хочу поделится с вами скриптом, который сможет удалить все неиспользуемые фото товара. Скрипт достаточно простой и по желанию можно доработать под свои потребности.
Сразу хочу сказать, что фото должны быть в отдельной папке от всех остальных изображений, баннеров, картинок шаблона и т.п. То есть фото полностью отделено от магазина.
Код скрипта можно вставить например в admin/controller/common/header.php в функцию index
echo "<pre>"; $net = 0; $find_files = $this->scan_Dir(DIR_IMAGE . "data"); // здесь указываем директория где есть только фото товаров if($find_files){ foreach($find_files as $file){ $image = explode("www/image/", $file); $query = $this->db->query("SELECT product_id FROM oc_product WHERE image = '".$image[1]."'"); //главное фото if(!$query->rows){ $query_dop = $this->db->query("SELECT * FROM oc_product_image WHERE image = '".$image[1]."'"); //доп фото if(!$query_dop->rows){ //echo $file . "<br>"; //можно раскомментировать строку - отображение файла который удаляется unlink($file); $net++; } } } } echo "Всего фото: " . count($find_files) . "<br>"; echo "Удалено: " . $net . "<br>"; echo "</pre>";
И перед функцией index вставляем функцию сканирования папки:
public function scan_Dir($dir) {
$dir = str_replace("//", "/", $dir);
$arrfiles = array();
if (is_dir($dir)) {
if ($handle = opendir($dir)) {
chdir($dir);
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if (is_dir($file)) {
$arr = $this->scan_Dir($file);
foreach ($arr as $value) {
$arrfiles[] = $dir."/".$value;
}
} else {
$arrfiles[] = $dir."/".$file;
}
}
}
chdir("../");
}
closedir($handle);
}
return $arrfiles;
}
После сохранения - заходим в админку и смотрим на статистику сколько есть файлов и сколько удалено лишних.
В примере поставлен стандартный префикс oc_ для таблиц в Opencart, если у вас другой (смотрите конфиг) поменяйте.