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

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


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


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

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


Когда в 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 - в опенкарт есть в каждом контроллере
Фото комментатора

Оганнес 01.06.2018

Спасибо! Скрипт хороший. Но можно написать скрипт для запуска с помощью CRON? Просто в папке 50000 фото, и когда страница долго грузится, вырубается. Заранее спасибо!
Администратор

Ответ for-opencart.com 01.06.2018

Да, на CRON все это дело можно повесить. Только надо скрипт модернизировать что бы брал либо кусками, либо убрать ограничение сервера по времени работы скрипта
Фото комментатора

Crack 08.06.2018

Здравствуйте. Почему-то удалил скрипт все изображения абсолютно
Администратор

Ответ for-opencart.com 08.06.2018

Смотрите почему, значит либо указали не ту папку, либо фото в указанной папке не привязаны к товарам.
Фото комментатора

Crack 08.06.2018

У меня опенкарт 2.3. очень много файлов в основном каталоге изображений ( /image ). Указал его в этой строке (DIR_IMAGE . "image"); На что мне писало всё по 0 . И в итоге я убрал вовсе то что в кавычках, и скрипт начал удалять.
Фото комментатора

Дмитрий 14.09.2018

Доброго времени суток! Подскажите, этот метод будет работать на 3.0.2? Если нет, то может подскажите правильное решение? Заранее благодарен)
Администратор

Ответ for-opencart.com 14.09.2018

Почему же не будет. Там структура та же, будет конечно. Только не забывайте о бекапах!

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

Похожее

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

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

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

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

  • Как правильно называть файлы и папки на сайте (сервере)

    На сайте нельзя использовать название папок и файлов как вам удобно. Запрещены пробелы, спецсимволы и кириллические символы. Да, кажется что все работает. Но это до поры до времени

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