В процессе работы с WordPress медиатека часто наполняется большим количеством устаревших и неиспользуемых файлов. Это приводит к росту размера базы данных и увеличению занимаемого места на сервере, что может негативно сказаться на производительности сайта и усложнить бэкап. В этой статье разберём, как автоматически удалять старые файлы из медиатеки WordPress, используя как кодовые решения, так и готовые плагины.
Почему важно регулярно чистить медиатеку WordPress
Медиатека — это хранилище всех загруженных изображений, аудио, видео и других файлов. С течением времени накапливаются файлы, которые уже не используются в контенте, например, удалённые изображения из постов, временные файлы или дубликаты. Их наличие приводит к:
- Увеличению размера резервных копий и времени их создания.
- Перегрузке хранилища сервера, что может привести к дополнительным расходам.
- Замедлению работы сайта, особенно если используется медленная файловая система.
- Сложностям при управлении контентом и поиске нужных файлов.
Регулярная очистка медиатеки помогает снизить нагрузку и поддерживать порядок в файловой системе.
Как определить старые и неиспользуемые файлы в медиатеке
Для автоматического удаления нужно точно определить, какие файлы считаются "старыми" или "неиспользуемыми". Чаще всего критериям соответствуют файлы:
- Которые не прикреплены к записям, страницам или другим типам записей.
- Которые не используются в содержимом (например, в тексте постов или виджетах).
- Старше определённого срока (например, 6 месяцев или 1 год).
Для анализа можно использовать SQL-запросы, функции WordPress и специальные плагины.
Определение неиспользуемых файлов через WP_Query и поиск в контенте
Чтобы найти файлы, не привязанные к записям, можно использовать следующий код:
function wpstandart_get_unused_attachments($older_than_days = 180) {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime("-{$older_than_days} days"));
$query = $wpdb->prepare(
"SELECT ID, guid FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_date < %s",
$date_limit
);
$attachments = $wpdb->get_results($query);
$unused = [];
foreach ($attachments as $attachment) {
$used_in_posts = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
'%'.basename($attachment->guid).'%'
));
if ($used_in_posts == 0) {
$unused[] = $attachment;
}
}
return $unused;
}Этот код возвращает список вложений старше 180 дней, которые не используются в содержимом сайта.
Автоматическое удаление старых файлов: пример функции
После определения неиспользуемых файлов можно удалить их программно. Ниже пример функции, которая удаляет такие файлы и их метаданные:
function wpstandart_delete_old_unused_attachments() {
$unused_attachments = wpstandart_get_unused_attachments(180);
foreach ($unused_attachments as $attachment) {
wp_delete_attachment($attachment->ID, true);
}
}
// Запускаем очистку через WP-Cron раз в неделю
if (!wp_next_scheduled('wpstandart_weekly_clean_media')) {
wp_schedule_event(time(), 'weekly', 'wpstandart_weekly_clean_media');
}
add_action('wpstandart_weekly_clean_media', 'wpstandart_delete_old_unused_attachments');Эта функция удаляет все медиафайлы, которые не используются и старше 180 дней, а расписание WP-Cron запускает её автоматически каждую неделю.
Плагины для автоматической очистки медиатеки WordPress
Если вы не хотите писать код, можно использовать готовые плагины, в том числе из коллекции WPShop, или сторонние решения:
- Media Cleaner (https://wpshop.ru/plugins/media-cleaner/?utm_source=wpstandart.ru&utm_medium=article&utm_campaign=avtomaticheskoe-udaleniye-starogo-mediateki-wordpress) — проверяет медиатеку на неиспользуемые файлы и позволяет удалять их безопасно.
- WP-Optimize — Clean, Compress, Cache — плагин с функцией оптимизации базы данных и очистки медиа.
- Force Regenerate Thumbnails — помогает восстанавливать миниатюры, а также удалять старые версии изображений.
При использовании плагинов стоит тестировать их на тестовом сайте, чтобы избежать случайного удаления нужных файлов.
Интеграция с WP-Cron и безопасность
Автоматизация с помощью WP-Cron позволяет запускать очистку в фоновом режиме. Однако важно:
- Ограничить запуск функции только для администраторов или через безопасный Cron-запрос.
- Делать резервные копии перед удалением.
- Проверять, что удаляемые файлы действительно не используются.
Расширенное решение: очистка временных и кешированных файлов
Помимо медиафайлов, в WordPress могут накапливаться временные изображения и кешированные данные, которые можно очищать аналогично:
- Файлы миниатюр, созданные плагинами визуальных редакторов.
- Временные файлы от плагинов загрузки и оптимизации изображений.
- Старые версии изображений, созданные плагинами типа Imagify или Smush.
Для очистки временных файлов можно использовать WP-CLI команды или плагины, например, Clearfy Pro с расширенными функциями очистки.
Пример удаления временных файлов миниатюр через код
function wpstandart_delete_old_thumbnails() {
$upload_dir = wp_upload_dir();
$dir = $upload_dir['basedir'];
$files = glob($dir . '/**/*-150x150.*', GLOB_BRACE);
$now = time();
foreach ($files as $file) {
if (is_file($file)) {
$file_time = filemtime($file);
if ($now - $file_time > 60*60*24*30) { // старше 30 дней
unlink($file);
}
}
}
}Эта функция удалит все миниатюры размера 150x150 пикселей, которые не обновлялись более 30 дней.
Выводы и рекомендации
Регулярное автоматическое удаление старых и неиспользуемых файлов медиатеки — важная задача для поддержания чистоты и производительности WordPress-сайта. Обязательно тестируйте кодовые решения и плагины на тестовом окружении, создавайте резервные копии и тщательно проверяйте, что удаляется только действительно ненужный контент. Использование WP-Cron позволяет полностью автоматизировать процесс и экономить время.