Большинство сайтов на WordPress со временем накапливают огромное количество медиафайлов — изображений, видео и других вложений. Многие из них перестают использоваться в контенте, но продолжают занимать место на сервере и замедлять работу сайта. В этой статье подробно разберём, как автоматизировать очистку библиотеки медиа от неиспользуемых файлов, чтобы оптимизировать дисковое пространство и повысить производительность WordPress.
Почему важно удалять неиспользуемые медиафайлы
Медиафайлы занимают значительную часть дискового пространства на хостинге. Если их не контролировать, они могут привести к следующим проблемам:
- Увеличение времени резервного копирования из-за большого объёма данных.
- Замедление работы сайта и админ-панели из-за нагрузки на базу данных и файловую систему.
- Рост затрат на хостинг, если у вас тариф с ограниченным дисковым пространством.
- Риск путаницы и ошибок при работе с медиа внутри сайта.
Автоматическая очистка помогает своевременно удалять неиспользуемые файлы без риска случайного удаления нужного контента.
Как определить неиспользуемые медиафайлы в WordPress
Неиспользуемыми считаются те медиафайлы, которые:
- Не вставлены в записи, страницы или другие типы контента (Custom Post Types).
- Не используются в виджетах, меню или настройках темы.
- Не связаны с какими-либо записями через метаданные.
Определение таких файлов вручную практически невозможно, особенно на больших сайтах. Для этого существуют специальные плагины и способы с использованием кода.
Плагины для поиска и удаления неиспользуемых медиафайлов
Рассмотрим несколько популярных и проверенных плагинов:
- Media Cleaner — анализирует библиотеку и выявляет файлы, не используемые в базе данных. Позволяет автоматически или вручную удалять их.
Плюсы: подробный отчёт, безопасное удаление, поддержка сторонних плагинов.
Минусы: в бесплатной версии ограниченный функционал. - WPS Cleaner — универсальный плагин для очистки базы данных и медиа. Есть возможность удалять неиспользуемые файлы с расписанием.
Плюсы: многофункциональность, простота использования.
Минусы: нет поддержки продвинутых кастомных типов. - DNUI (Delete Not Used Image) — бесплатный и простой плагин, который проверяет, какие изображения не используются, и позволяет их удалить.
Плюсы: бесплатный, лёгкий.
Минусы: не обновляется давно, может не учитывать все случаи.
Как использовать Media Cleaner для автоматической очистки
Пример настройки автоматической очистки с Media Cleaner:
- Установите и активируйте Media Cleaner.
- Перейдите в раздел «Media Cleaner» в админке.
- Запустите сканирование. Плагин просканирует все медиафайлы и покажет неиспользуемые.
- Перейдите в настройки плагина и включите автоматическое удаление файлов по расписанию (например, раз в неделю).
Так вы будете регулярно очищать библиотеку от «мусорных» медиафайлов без ручного контроля.
Программный способ — пример функции для обнаружения неиспользуемых изображений
Если хотите реализовать автоматическую очистку через код, можно использовать пример функции, которая проверяет, используются ли изображения в записях. Ниже — пример с префиксом wp1_ для функций из домена wp-1.ru:
function wp1_get_unused_attachments() {
global $wpdb;
// Получаем ID всех вложений (медиафайлов)
$attachments = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment'");
$unused = [];
foreach ($attachments as $attachment_id) {
// Проверяем, используется ли вложение в содержимом других постов
$guid = $wpdb->get_var($wpdb->prepare("SELECT guid FROM {$wpdb->posts} WHERE ID = %d", $attachment_id));
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
'%' . $wpdb->esc_like($guid) . '%'
));
// Проверяем наличие связи через post_parent
$post_parent = $wpdb->get_var($wpdb->prepare(
"SELECT post_parent FROM {$wpdb->posts} WHERE ID = %d",
$attachment_id
));
if ($count == 0 && intval($post_parent) === 0) {
$unused[] = $attachment_id;
}
}
return $unused;
}Эта функция возвращает массив ID неиспользуемых вложений. Дальше можно написать функцию для их удаления, например:
function wp1_delete_unused_attachments() {
$unused_attachments = wp1_get_unused_attachments();
foreach ($unused_attachments as $attachment_id) {
wp_delete_attachment($attachment_id, true); // true — удалить физически
}
}Вы можете запускать такую функцию по расписанию через WP-Cron, чтобы автоматизировать процесс.
Как интегрировать очистку в WP-Cron для автоматизации
Чтобы запускать очистку автоматически, добавим событие в WP-Cron:
add_action('wp1_auto_clean_unused_media', 'wp1_delete_unused_attachments');
function wp1_schedule_media_cleanup() {
if (!wp_next_scheduled('wp1_auto_clean_unused_media')) {
wp_schedule_event(time(), 'weekly', 'wp1_auto_clean_unused_media');
}
}
add_action('wp', 'wp1_schedule_media_cleanup');Теперь раз в неделю будет запускаться функция очистки. При необходимости период можно изменить на daily или monthly.
Советы по безопасному удалению медиа
Перед удалением всегда делайте резервную копию сайта и базы данных. Особенно если используете программные методы.
При использовании плагинов рекомендуем сначала запускать режим только для просмотра, чтобы убедиться, что не удаляются нужные файлы.
Учтите, что некоторые медиа могут использоваться в нестандартных местах, например, в метаполях, настройках плагинов, кастомных шаблонах. Проверьте документацию и протестируйте на тестовом сайте.
Поддержка плагинов WPSHOP для управления медиа
Если вы используете плагины из экосистемы WPSHOP, такие как My Popup или WPRemark, убедитесь, что медиафайлы, используемые ими, не попадают под очистку. Для этого можно добавить исключения в код или настройки плагинов.