Как автоматически удалять старые изображения в медиабиблиотеке WordPress

Диагностика проблемы: когда нужно удалять старые изображения

В процессе эксплуатации сайта на 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 (предложенный способ) Гибкость, контроль, отсутствие лишних плагинов Требует навыков, возможны ошибки при неправильной настройке Профессиональные разработчики и сайты с уникальными требованиями
Как создать автопостинг в WordPress с использованием WPRemark
30.01.2026
Как автоматически удалять неактивных пользователей WordPress
03.05.2026
Как создать автоматический импорт данных из Google Sheets в WordPress
09.02.2026
Как правильно удалить незаконченые заказы WooCommerce через PHP
16.06.2026
Как удалить или скрыть свойства товара WooCommerce в админке WordPress
20.04.2026