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

категория: , Дорабатываем, Должно быть, Полезности


Опубликовано: 17.11.2017 Обновлено: 30.04.2018 Просмотров: 928 Комментарии: 4


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

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


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

Вообще что бы не копились фото при удалении товара а сразу удалялись рекомендую использовать бесплатный модуль.


Комментарии:


Фото комментатора

Худ Фан 14.12.2017

Ерунда, т.е. что бы удалить фото которые уже не используются, мне надо их в отдельную папку перенести, а потом через скрипт удалить их? Бред, я могу просто эту папку удалить. Лучше же когда скрипт будет искать не закрепленные изображения за товарами (в какой папке они бы не были) и удалять их.
Администратор

Ответ for-opencart.com 14.12.2017

Так Вы же не поняли. Смотрите если удалить папку - то и все фото удаляться даже те которые закреплены. А вот скрипт как раз и смотрит в папку сканит все фото и если фото не за кем не закреплено то удаляет. Тут почему такая логика. Дело в том что если делать скан всех фото то можно просто удалить баннеры например которые понятно что не будут закреплены за товаров. Хотя если сделать доработку что бы скрипт проверял не только товары, а и баннеры, статьи и т.п. то да можно сканить все фото и чистить сервер от всех ненужных фото. То есть в статье описана логика работы такого скрипта, а доработать можно уже под свои нужны.
Фото комментатора

Павел 16.01.2018

сайт стоит на локальном компе пишет ошибка в строке $find_files = $this->scan_Dir(DIR_IMAGE . "data") data- указал свой путь к папке: W:/ospanel/domains/local.furam7.ru/image/catalog/data ocStore 2.3 Есть у Вас предположения?
Администратор

Ответ for-opencart.com 16.01.2018

Смотря что за ошибка - видимо что в пути к директории, я думаю что на это ругается, проверьте, а лучше на хостинге выполните скрипт будет точно работать, только бекапы не забывайте делать.
Фото комментатора

Павел 17.01.2018

вот такая ошибка Fatal error: Call to undefined method ControllerCommonHeader::scan_Dir() in W:\OSPanel\domains\local.furam7.ru\admin\controller\common\header.php on line 7 я так понимаю сервер не знает такой метод, или он не описан.
Администратор

Ответ for-opencart.com 17.01.2018

Да, посмотрите есть ли функция scan_Dir
Фото комментатора

павел 01.02.2018

В контроллере admin/controller/common/header.php ее нет, ведь там она должна быть, я правильно понимаю? Что вообще это за функция, по названию похожа на стандартную PHP. Дайте ее описание, чтобы добавить.
Администратор

Ответ for-opencart.com 01.02.2018

Как это нет?) Есть 100%. Функция index - в опенкарт есть в каждом контроллере

Быстрый поиск

Похожее

  • Изображения

    Изображения это дополнительные картинки на странице товара. Количество изображений не ограничено

  • Изображение товара

    Изображение это визитная карточка товара. На этот пункт хотелось бы заострить особое внимание, т.к. всем известно, что «встречают по одежке», это также относится и к товарам.

Новое на сайте