Когда в Opencart удаляется товар, фото физически остается на сервере а удаляется лишь в базе сам товар и привязка к файлу.
Чем это плохо?
Первое - это накопление ненужных файлов. Как следствие, для магазина требуется еще больше памяти на сервере, а это дополнительные затраты. Второе - при наличии большого количества файлов сайт может подтормаживать.
По-этому хочу поделится с вами скриптом, который сможет удалить все неиспользуемые фото товара. Скрипт достаточно простой и по желанию можно доработать под свои потребности.
Сразу хочу сказать, что фото должны быть в отдельной папке от всех остальных изображений, баннеров, картинок шаблона и т.п. То есть фото полностью отделено от магазина.
Код скрипта можно вставить например в admin/controller/common/header.php в функцию index
echo '';';
$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 . '
'; //можно раскомментировать строку - отображение файла который удаляется
unlink($file);
$net++;
}
}
}
}
echo 'Всего фото: ' . count($find_files) . '
';
echo 'Удалено: ' . $net . '
';
echo '
И перед функцией 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, если у вас другой (смотрите конфиг) поменяйте.
Вообще что бы не копились фото при удалении товара а сразу удалялись рекомендую использовать бесплатный модуль.