В процессе работы с WordPress накапливается множество медиафайлов — особенно изображений, которые со временем перестают быть актуальными. Это ведёт к увеличению размера базы данных и занимает место на сервере, замедляя сайт и усложняя управление файлами. В этой статье разберём, как автоматически удалять старые изображения в WordPress, используя как готовые плагины, так и собственный код.
Почему важно удалять старые изображения в WordPress
Со временем многие изображения перестают использоваться, например, фотографии товаров, которые удалены из магазина, или картинки из устаревших записей. Хранение неиспользуемых файлов приводит к:
- Росту занимаемого места на хостинге;
- Замедлению процессов бэкапа и загрузки;
- Увеличению времени сканирования и анализа базы данных;
- Потере контроля над медиафайлами.
Удаление старых изображений помогает поддерживать порядок и оптимизировать работу сайта.
Как определить, какие изображения считать «старыми» и ненужными
Для автоматизации процесса нужно задать критерии «старости» изображений. Обычно это может быть:
- Возраст файла — например, изображения, которые не использовались в записях или страницах более 6–12 месяцев.
- Отсутствие привязки к каким-либо постам или продуктам (неиспользуемые медиафайлы).
В WordPress не всегда просто определить, используется ли конкретное изображение, потому что оно может быть вставлено вручную в HTML или через кастомные поля. Однако для большинства случаев автоматическая проверка по базе — эффективный способ.
Использование плагинов для удаления старых изображений
Среди популярных решений можно выделить плагины, которые помогают находить и удалять неиспользуемые или старые медиафайлы:
- Media Cleaner — анализирует библиотеку медиа и находит файлы, которые не используются в записях, страницах, виджетах и даже в метаданных. Позволяет безопасно удалять их. Имеет бесплатную и PRO-версию.
- WP-Optimize — кроме очистки базы данных, умеет удалять неиспользуемые изображения и другие медиафайлы.
- Image Cleanup — более узконаправленный плагин, который помогает удалять медиафайлы старше заданного срока.
Пример использования Media Cleaner:
- Установите и активируйте плагин.
- Перейдите в раздел Media Cleaner в админке WordPress.
- Запустите сканирование для поиска неиспользуемых файлов.
- Просмотрите список и подтвердите удаление.
Автоматизация удаления с помощью WP-Cron и собственного кода
Если нужна более тонкая настройка и интеграция в специфические процессы сайта, можно реализовать автоматическое удаление старых изображений с помощью кода и планировщика WP-Cron.
Пример функции для удаления изображений, не использующихся в постах и старше 180 дней
function wprobot_delete_old_unused_images() {
global $wpdb;
$days_old = 180; // Возраст изображения в днях
$date_threshold = date('Y-m-d H:i:s', strtotime('-'. $days_old .' days'));
// Получаем ID вложений изображений старше порога
$attachments = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'attachment'
AND post_mime_type LIKE 'image/%'
AND post_date < %s",
$date_threshold
));
foreach ($attachments as $attachment_id) {
// Проверяем, используется ли изображение где-либо
$is_used = false;
// Поиск в контенте всех постов
$search = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type IN ('post', 'page', 'custom_post_type')
AND post_status = 'publish'
AND post_content LIKE %s
LIMIT 1",
'%' . $attachment_id . '%'
));
if ($search) {
$is_used = true;
}
// Если не используется, удаляем
if (! $is_used) {
wp_delete_attachment($attachment_id, true); // true — удалить физический файл
}
}
}
// Регистрируем задачу в WP-Cron
if (! wp_next_scheduled('wprobot_delete_images_cron')) {
wp_schedule_event(time(), 'daily', 'wprobot_delete_images_cron');
}
add_action('wprobot_delete_images_cron', 'wprobot_delete_old_unused_images');
Этот код:
- Каждый день запускает функцию удаления;
- Ищет вложения-изображения старше 180 дней;
- Проверяет, используются ли они в опубликованных постах и страницах;
- Удаляет неиспользуемые изображения вместе с физическими файлами.
Важно: перед применением на рабочем сайте сделайте бэкап, чтобы избежать потери нужных файлов.
Как учитывать изображения, используемые в плагинах и кастомных полях
Некоторые плагины и темы хранят ссылки на изображения в своих таблицах или метаданных, которые не проверяются простым поиском в post_content. Для таких случаев:
- Добавьте дополнительные проверки в функцию, например, поиск по postmeta.
- Используйте хуки и фильтры плагинов, если они предоставляют API для проверки использования файлов.
- Пример расширения поиска по метаданным:
$meta_search = $wpdb->get_var($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta}
WHERE meta_value LIKE %s
LIMIT 1",
'%' . $attachment_id . '%'
));
if ($meta_search) {
$is_used = true;
}
Советы по безопасности и оптимизации
Перед автоматическим удалением изображений обязательно:
- Сделайте полный бэкап файлов и базы данных;
- Тестируйте функцию на тестовом сайте с копией данных;
- Добавьте логирование удалённых файлов для возможности восстановления;
- Регулярно проверяйте работу WP-Cron, чтобы задача выполнялась корректно.
Выводы
Автоматическое удаление старых изображений в WordPress помогает поддерживать сайт в чистоте, уменьшать нагрузку на сервер и упрощать администрирование. Выбор между плагинами и собственным кодом зависит от задач и специфики сайта. Если нужна гибкость и интеграция, лучше писать собственные решения с WP-Cron, если хочется быстро и без кода — подойдёт Media Cleaner или похожие плагины.
Для удобства вы можете изучить Media Cleaner от WPSHOP — это проверенный инструмент для очистки медиа-библиотеки.