Диагностика проблемы: когда нужно удалять старые изображения
В процессе эксплуатации сайта на WordPress в медиабиблиотеке накапливаются неиспользуемые или устаревшие изображения. Они занимают дисковое пространство, замедляют резервное копирование и могут влиять на производительность сайта. Особенно актуальна эта задача для магазинов на WooCommerce и новостных порталов с большим количеством медиа.
Чтобы проверить наличие неиспользуемых изображений, можно использовать SQL-запрос для поиска вложений, которые не связаны ни с одной записью:
SELECT ID, post_title FROM wp_posts WHERE post_type = 'attachment' AND post_parent = 0;Если таких записей много, значит в медиабиблиотеке скопились ненужные файлы, которые можно удалить автоматически по дате загрузки или другим критериям.
Пошаговое решение: автоматическое удаление старых изображений через WP-Cron
1. Создание функции для удаления старых изображений
Добавьте следующий код в файл functions.php вашей темы или в плагин-сниппет:
function wpacademy_delete_old_images() {
global $wpdb;
$days = 180; // Удалять изображения старше 180 дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID вложений, которые загружены до $date_threshold и не прикреплены к записям
$attachments = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_date < %s AND post_parent = 0",
$date_threshold
));
if (empty($attachments)) {
return;
}
foreach ($attachments as $attachment) {
wp_delete_attachment($attachment->ID, true); // true - удалять физически
}
}2. Настройка WP-Cron для регулярного запуска
Добавьте следующий хук в functions.php для запуска функции один раз в сутки:
if (!wp_next_scheduled('wpacademy_daily_delete_old_images')) {
wp_schedule_event(time(), 'daily', 'wpacademy_daily_delete_old_images');
}
add_action('wpacademy_daily_delete_old_images', 'wpacademy_delete_old_images');Это обеспечит автоматическую очистку медиабиблиотеки от старых неиспользуемых изображений.
Проверка результата после внедрения
Чтобы убедиться, что функция работает корректно:
- Посмотрите количество вложений с
post_parent = 0и датой создания старше 180 дней до и после активации кода. - Проверьте папку
wp-content/uploadsна сервере — файлы должны быть физически удалены. - Для тестирования временно измените период на 1 день и загрузите тестовое изображение без привязки к записям, затем дождитесь запуска WP-Cron (можно вызвать вручную через плагин WP Crontrol).
Частые ошибки и как их исправить
- Не запускается WP-Cron: Убедитесь, что на сайте есть трафик, необходимый для активации WP-Cron, или настройте системный cron на сервере для вызова
wp-cron.php. - Удаляются нужные изображения: Проверьте, что условие
post_parent = 0корректно. Некоторые темы/плагины могут использовать собственные методы привязки вложений, тогда понадобится дополнительная проверка. - Функция не удаляет файлы физически: Параметр
wp_delete_attachmentдолжен быть сtrueдля полного удаления, иначе останутся файлы на сервере.
Практические советы по безопасности и производительности
- Перед удалением рекомендуем создать резервную копию сайта и базы данных.
- Запускать функцию удаления лучше в ночное время, чтобы не нагружать сервер в пиковые часы.
- Для больших сайтов с тысячами вложений оптимизируйте запросы, разбивая удаление на партии, например по 50 записей за раз.
- Можно интегрировать логи — записывать в отдельный файл ID удалённых вложений для восстановления в случае ошибки.
Сравнение вариантов удаления старых изображений
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Ручное удаление через админку | Простота, визуальный контроль | Затратно по времени, риск пропуска | Малые сайты с редкими обновлениями |
| Плагин (например, Media Cleaner) | Автоматизация, удобный интерфейс | Дополнительная нагрузка, возможны ошибки определения использованных файлов | Средние и крупные сайты без собственного кода |
| Код с WP-Cron (предложенный способ) | Гибкость, контроль, отсутствие лишних плагинов | Требует навыков, возможны ошибки при неправильной настройке | Профессиональные разработчики и сайты с уникальными требованиями |