<?php
// Прописываем константы, чтобы скрипты DLE завелись
define('DATALIFEENGINE', true);
define('ROOT', __DIR__);
// Подключаем классы и данные к бд
include_once ROOT . '/engine/classes/mysql.php';
include_once ROOT . '/engine/data/dbconfig.php';
// Делаем выборку, выбираем только доп. поля
$sql_select = 'SELECT xfields FROM dle_post ORDER by id ASC;';
$db->query($sql_select);
// Подсчитываем файлы
$files = 0;
// Создаём массив с удалёнными файлами
$pictures = [];
// Название доп. поля
$xf_name = 'НАЗВАНИЕ ПОЛЯ';
// Выбираем тип доп. поля:
// - gallery - если поле тип поля поддерживает загрузку изображений
// - lines - если ссылки в поле прописаны как http://site.ru/uploads/posts/2022-01/изображение.jpg
// - formated_lines - форматированые ссылки, которые вставляются как [thumb]http://site.ru/uploads/posts/2022-01/изображение.jpg[/thumb]
$xf_type = 'gallery';
/**
* Форматируем размер файла
*
* @param int $size
* @return string
*/
function format_bytes(int $size){
$base = log($size, 1024);
$suffixes = array('', 'KB', 'MB', 'GB', 'TB', 'PB');
return round(1024 ** ($base - floor($base)), 2) . ' ' . $suffixes[floor($base)];
}
/**
* Функция по удалению изображений
*
* @param $image
* @return bool
*/
function deleteImage($image) {
global $files, $pictures;
// Разбираем изображение на пути
$path_info = pathinfo($image);
// Смотрим в какой папке лежит изображения и сохраняем путь в новую переменную
$img_dir = dirname($image);
// Если у файла нет типа, то возвращаем отризательный ответ
if (!isset($path_info['extension'])) return false;
// Путь до уменьшенной копии
$thumb_path = $img_dir . '/thumb/' . $path_info['basename'];
// Путь до средней копии
$medium_path = $img_dir . '/medium/' . $path_info['basename'];
// Проверяем, есть ли уменьшенная копия
if (file_exists($thumb_path)) {
// Если есть, то вносим в массив данных по удалённым изображений
$pictures[$thumb_path] = format_bytes(filesize($thumb_path));
// Пытаемся удалить файл с сервера
@unlink($thumb_path);
// Увеличиваем счётчик удалённых файлов
$files++;
}
// Проверяем, есть ли средняя копия
if (file_exists($medium_path)) {
// Если есть, то вносим в массив данных по удалённым изображений
$pictures[$medium_path] = format_bytes(filesize($medium_path));
// Пытаемся удалить файл с сервера
@unlink($medium_path);
// Увеличиваем счётчик удалённых файлов
$files++;
}
// Проверяем, есть ли сомо изображение
if (file_exists($image)) {
// Если есть, то вносим в массив данных по удалённым изображений
$pictures[$image] = format_bytes(filesize($image));
// Пытаемся удалить файл с сервера
@unlink($image);
// Увеличиваем счётчик удалённых файлов
$files++;
}
return true;
}
// Проверяем каждую новость
while($row = $db->get_row()) {
// Распиливаем поля
$xfs = explode('||', $row['xfields']);
// Проверяем каждое поле
foreach($xfs as $x) {
// Снова распил
$xf = explode('|', $x);
// Проверям на нужное поле, название поля вписываем на латинице
if($xf[0] === $xf_name) {
switch($xf_type) {
case 'gallery':
// Пилим массив данных о изображениях и создаём новый, если в поле несколько изображений
$image_data = explode(',', $xf[1]);
// Разбираем каждое изображение в массиве изображений
foreach ($image_data as $img) {
// Пилим данные об изображении в новый массив
$i_data = explode('|', $img);
// Создаём путь до картинки
$img_path = ROOT . '/uploads/posts/' . $i_data[0];
// Проверяем, есть ли такой файл на сервере. Если нет, то берём следующий элемент из массива и передаём функции
if(!deleteImage($img_path)) deleteImage(ROOT . '/uploads/posts/' . $i_data[1]);
}
break;
case 'lines':
// Вытаскиваем все изображения из поля
preg_match_all('/\S+\/uploads\/posts\/(\d{4}-\d{2})\/(.*?\.jpg|jepg|png|webp|gif|bmp)/', $xf[1], $links);
// Перебераем массив с ссылками
for ($i = 0, $max = count($links[0]); $i < $max; $i++) {
// Передаём ссылку функции
deleteImage(realpath(ROOT . "/uploads/posts/{$links[1][$i]}/{$links[2][$i]}"));
}
break;
case 'formated_lines':
// Вытаскиваем все изображения из поля
preg_match_all('/<a\s+(?:[^>]*?\s+)?href=(["\'])(.*?)\1/', $xf[1], $links);
// Перебераем массив с ссылками
foreach ($links[2] as $link) {
// Вытаскиваем нужные данные из ссылки и передаём её в функцию
preg_match('/\S+\/uploads\/posts\/(\d{4}-\d{2})\/(.*?\.jpg|jepg|png|webp|gif|bmp)/', $link, $link_array);
deleteImage(realpath(ROOT . "/uploads/posts/{$link_array[1]}/{$link_array[2]}" ));
}
break;
}
}
}
}
// Прощаемся с подключением бд
$db->free();
// Выводим статистику, сколько файлов удалено и каждое изображение на новой строке с размеров файла
echo "Удалено <b>{$files}</b> файлов.<br><b>Файлы</b>:<br><br>";
foreach ($pictures as $pic => $size) echo "Изображение {$pic} ({$size}) удалено!<br>";