Управление медиафайлами в WordPress со временем становится сложной задачей, особенно если на сайте много загруженных изображений, видео и других файлов. Старые неиспользуемые медиафайлы занимают место на сервере, замедляют бэкапы и усложняют администрирование. В этой статье подробно разберём, как автоматически находить и удалять старые медиафайлы, которые не используются в записях и страницах, а также как автоматизировать этот процесс с помощью кода и плагинов.
Почему важно удалять старые медиафайлы в WordPress
Медиафайлы занимают значительную часть дискового пространства сайта. Особенно это актуально для крупных проектов и магазинов, где постоянное добавление новых изображений и видео со временем приводит к накоплению «мусора». Удаление неиспользуемых и устаревших файлов помогает:
- Освободить дисковое пространство на сервере;
- Ускорить процесс бэкапа и восстановления;
- Повысить общую производительность сайта;
- Облегчить управление библиотекой медиа;
- Уменьшить риски утечек данных и ошибок безопасности.
Однако ручная очистка занимает много времени и связана с риском удаления нужных файлов. Поэтому оптимальным решением станет автоматизация процесса.
Как определить старые и неиспользуемые медиафайлы
Для начала нужно понять, что считать «старыми» и «неиспользуемыми» файлами. Обычно это медиа, которые:
- Не прикреплены к записям или страницам сайта;
- Не используются в контенте (в редакторе, виджетах, настройках темы);
- Были загружены давно и не изменялись;
- Не используются в миниатюрах или галереях.
Для выявления таких файлов можно использовать SQL-запросы к базе данных, анализ ссылок в контенте, а также специальные функции WordPress.
Пример SQL-запроса для поиска неиспользуемых медиафайлов
SELECT ID, post_title, post_date FROM wp_posts
WHERE post_type = 'attachment'
AND ID NOT IN (
SELECT meta_value FROM wp_postmeta WHERE meta_key = '_thumbnail_id'
UNION
SELECT ID FROM wp_posts WHERE post_content LIKE CONCAT('%', guid, '%')
);Этот запрос пытается найти вложения, которые не связаны с миниатюрами и не упоминаются в содержимом записей. Однако такой запрос не всегда точен, поэтому лучше использовать комплексный подход.
Автоматизация удаления старых медиафайлов с помощью кода
Ниже приведён пример функции для WordPress, которая удаляет вложения старше заданного количества дней и не используемые в контенте. Функция wpdetect_delete_old_unused_media() проверяет дату загрузки и наличие вложения в постах.
function wpdetect_delete_old_unused_media($days = 90) {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days'));
$attachments = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_date < %s",
$date_limit
));
foreach ($attachments as $attachment) {
$id = $attachment->ID;
// Проверяем использование в миниатюрах
$thumbnail_used = $wpdb->get_var($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id' AND meta_value = %d",
$id
));
// Проверяем использование в контенте
$content_used = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE %s LIMIT 1",
'%' . $wpdb->esc_like(wp_get_attachment_url($id)) . '%'
));
if (!$thumbnail_used && !$content_used) {
wp_delete_attachment($id, true);
}
}
}Эту функцию можно вызвать из wp-cron для регулярной очистки. Например, добавить в functions.php или подключить как часть собственного плагина.
Использование плагинов для автоматической очистки медиа
Если вы не хотите писать код, есть несколько плагинов, которые могут помочь с этой задачей:
- Media Cleaner — сканирует медиа и удаляет неиспользуемые файлы;
- Clearfy Pro — оптимизирует сайт и включает функции очистки;
- WPDetect — может быть настроен для мониторинга и автоматизации задач.
Плагин Media Cleaner особенно полезен, так как он визуально показывает файлы, которые не используются, и позволяет безопасно их удалить.
Как настроить автоматическую очистку с помощью WP-Cron
Чтобы процесс удаления старых медиафайлов происходил автоматически, используйте планировщик задач WordPress — WP-Cron. Добавьте следующий код в functions.php вашей темы или в плагин:
function wpdetect_schedule_media_cleanup() {
if (!wp_next_scheduled('wpdetect_daily_media_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpdetect_daily_media_cleanup');
}
}
add_action('wp', 'wpdetect_schedule_media_cleanup');
add_action('wpdetect_daily_media_cleanup', function() {
wpdetect_delete_old_unused_media(90); // удалять файлы старше 90 дней
});Этот код создаст ежедневное событие, вызывающее функцию очистки. Таким образом, вы не забудете регулярно освобождать место и поддерживать сайт в порядке.
Рекомендации по безопасности и резервному копированию
Перед автоматическим удалением файлов настоятельно рекомендуется создавать резервные копии сайта и базы данных. Также стоит тестировать функцию на тестовом сайте, чтобы избежать случайного удаления нужных медиа.
Используйте плагины резервного копирования, например, WPDetect с функцией автоматического создания снимков базы данных и файлов перед очисткой.
Итоги и советы по применению
Автоматическое удаление старых и неиспользуемых медиафайлов — важная задача для поддержания производительности и стабильности WordPress-сайта. Используйте комбинированный подход: SQL-запросы, функции PHP, WP-Cron и проверенные плагины. Обязательно делайте резервные копии и тестируйте изменения.
Такой подход поможет существенно сократить размер библиотеки медиа, ускорить сайт и облегчить его дальнейшее сопровождение.