Удаление фото если они не закреплены за товаром - чистка сервера от лишних изображений


Делюсь скриптом простого удаления всех ненужных фото удаленных товаров


Когда в 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, если у вас другой (смотрите конфиг) поменяйте.