Папка uploads в WordPress со временем может переполниться устаревшими и неиспользуемыми файлами. Это негативно влияет на производительность сайта и увеличивает размер бэкапов. В этой статье рассмотрим, как настроить автоматическое удаление файлов из папки uploads по сроку хранения с помощью кода и плагинов.
Почему важно удалять устаревшие файлы из uploads
Со временем в wp-content/uploads накапливаются файлы, которые больше не используются в публикациях, темах или плагинах. Это могут быть старые изображения, временные файлы или резервные копии. Если их не удалять, то:
- Увеличивается нагрузка на сервер из-за большого объема данных.
- Резервное копирование занимает больше времени и места.
- Сложнее управлять медиабиблиотекой и искать нужные файлы.
Автоматизация удаления позволяет держать папку uploads чистой и оптимизированной.
Способы автоматического удаления файлов из uploads
Существует несколько подходов к решению задачи:
- Использование cron-задач и собственного кода.
- Плагины для очистки медиабиблиотеки и папки uploads.
- Комбинирование кода и плагинов для гибкости.
Как реализовать автоматическое удаление с помощью WP Cron
WP Cron – встроенный механизм планировщика задач в WordPress. Мы можем создать собственное событие, которое будет запускаться, например, раз в сутки и удалять файлы, которым больше заданного срока.
Пример кода для удаления файлов старше 30 дней
function wpupload_schedule_cleanup() {
if (!wp_next_scheduled('wpupload_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wpupload_cleanup_event');
}
}
add_action('wp', 'wpupload_schedule_cleanup');
function wpupload_handle_cleanup() {
$upload_dir = wp_upload_dir();
$path = $upload_dir['basedir'];
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$now = time();
$days_to_keep = 30;
foreach ($files as $file) {
if ($file->isFile()) {
$file_path = $file->getRealPath();
$file_mtime = $file->getMTime();
if (($now - $file_mtime) > ($days_to_keep * DAY_IN_SECONDS)) {
@unlink($file_path); // удаляем файл
}
}
}
}
add_action('wpupload_cleanup_event', 'wpupload_handle_cleanup');
В этом коде мы ставим ежедневное задание wpupload_cleanup_event, которое проходит по папке uploads и удаляет файлы старше 30 дней. Обратите внимание, что @unlink используется для подавления ошибок удаления.
Как учитывать только неиспользуемые файлы
Чтобы не удалять файлы, которые используются в записях, можно дополнительно проверить наличие ссылок на них в базе данных. Для этого:
- Получаем URL файла.
- Проверяем таблицу
wp_postsна наличие ссылок на этот файл. - Удаляем только если ссылки нет.
Это значительно снижает риск удаления нужных файлов.
Пример функции проверки использования файла
function wpupload_is_file_used($file_url) {
global $wpdb;
$like = '%' . $wpdb->esc_like($file_url) . '%';
$query = $wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
$like
);
$count = $wpdb->get_var($query);
return $count > 0;
}
В основной функции удаления нужно вызывать эту проверку и удалять файлы только при отрицательном результате.
Плагины для автоматической очистки папки uploads
Если не хочется писать код, можно использовать плагины. Вот несколько рекомендуемых:
- Clearfy Pro — в том числе умеет оптимизировать и чистить медиабиблиотеку.
- Media Cleaner — находит и удаляет неиспользуемые файлы.
- Force Delete — удаляет файлы и записи без ограничений.
Для настройки автоматического удаления старых файлов в плагинах обычно есть расписание или интеграция с WP Cron.
Советы по безопасности и резервному копированию
При автоматическом удалении важно:
- Создавать резервные копии сайта и базы данных перед настройкой автоматической очистки.
- Тестировать код на тестовом сервере или в локальной среде.
- Логировать действия удаления для возможности восстановления при ошибках.
- Не удалять файлы без проверки их использования, чтобы не сломать сайт.
Пример добавления логирования удаления
function wpupload_handle_cleanup_logged() {
$upload_dir = wp_upload_dir();
$path = $upload_dir['basedir'];
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$now = time();
$days_to_keep = 30;
$log = [];
foreach ($files as $file) {
if ($file->isFile()) {
$file_path = $file->getRealPath();
$file_mtime = $file->getMTime();
if (($now - $file_mtime) > ($days_to_keep * DAY_IN_SECONDS)) {
if (wpupload_is_file_used(str_replace(site_url('/'), '', $file_path))) {
continue;
}
if (@unlink($file_path)) {
$log[] = "Deleted: $file_path";
} else {
$log[] = "Failed to delete: $file_path";
}
}
}
}
if (!empty($log)) {
error_log("[WPUpload Cleanup] " . implode(", ", $log));
}
}
add_action('wpupload_cleanup_event', 'wpupload_handle_cleanup_logged');
Такой подход поможет отследить, что именно удалялось.
Заключение
Автоматическое удаление устаревших файлов из папки uploads – важная задача для оптимизации WordPress-сайта. Выбор решения зависит от навыков и требований: можно написать собственный WP Cron-скрипт, который учитывает использование файлов, или воспользоваться готовыми плагинами, например, Clearfy Pro. Обязательно делайте резервные копии и тестируйте на нерабочем сайте.