Как создать автоматическую систему удаления старых медиа файлов в WordPress

В процессе работы с WordPress накапливается большое количество медиа файлов: изображения, видео, аудио и другие вложения. Со временем многие из них становятся неактуальными — например, прикрепленные к удаленным постам или неиспользуемые в контенте. Это негативно влияет на размер хранилища и производительность сайта. В этой статье мы подробно рассмотрим, как создать автоматическую систему удаления старых и неиспользуемых медиа файлов в WordPress с помощью WP-Cron и собственного кода.

Почему важно удалять старые медиа файлы в WordPress

Медиа файлы занимают значительный объем дискового пространства, особенно на сайтах с большим количеством публикаций и загрузок. Если не контролировать их количество, это может привести к следующим проблемам:

  • Переполнение хранилища хостинга и дополнительные расходы.
  • Замедление работы сайта из-за большого количества файлов и роста базы данных.
  • Сложности с резервным копированием и восстановлением.
  • Повышенная нагрузка при генерации миниатюр и обработке изображений.

Автоматизация удаления старых или неиспользуемых файлов позволяет поддерживать порядок и оптимизировать ресурсы сайта.

Обзор подхода: как удалить старые медиа файлы программно

Прежде чем приступить к коду, важно определить критерии удаления:

  • Возраст файла (например, медиа, которые не использовались и которым больше 6 месяцев).
  • Отсутствие привязки к постам — медиа, которые не прикреплены к каким-либо записям.
  • Отсутствие использования в контенте сайта.

Мы будем использовать WP_Query и функции WordPress для поиска таких файлов, а затем удалять их с помощью wp_delete_attachment(). Для автоматизации применим WP-Cron, чтобы задача выполнялась регулярно.

Создаем функцию удаления старых медиа файлов

Добавим в файл functions.php вашей темы или в отдельный плагин следующий код:

function wpcommunity_delete_old_unused_attachments() {
    $days = 180; // Возраст файла в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime('-'. $days .' days'));

    // Получаем вложения старше указанного срока
    $args = array(
        'post_type'      => 'attachment',
        'post_status'    => 'inherit',
        'date_query'     => array(
            array(
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $attachments = get_posts($args);
    $deleted_count = 0;

    foreach ($attachments as $attachment_id) {
        // Проверяем, прикреплен ли файл к посту
        $parent_id = wp_get_post_parent_id($attachment_id);
        if ($parent_id) {
            continue; // Файл используется
        }

        // Проверяем, используется ли файл внутри постов (в контенте)
        $file_url = wp_get_attachment_url($attachment_id);
        global $wpdb;
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s AND post_status = 'publish'",
            '%' . $wpdb->esc_like($file_url) . '%'
        ));

        if ($count == 0) {
            // Удаляем вложение и его файлы
            wp_delete_attachment($attachment_id, true);
            $deleted_count++;
        }
    }

    return $deleted_count;
}

Эта функция ищет все медиа файлы старше 180 дней, которые не имеют родительского поста и не используются в опубликованном контенте, и удаляет их безвозвратно.

Автоматизация с помощью WP-Cron

Чтобы задача выполнялась регулярно, например, раз в неделю, добавим расписание в WP-Cron.

function wpcommunity_schedule_delete_old_attachments() {
    if (!wp_next_scheduled('wpcommunity_delete_old_attachments_hook')) {
        wp_schedule_event(time(), 'weekly', 'wpcommunity_delete_old_attachments_hook');
    }
}
add_action('wp', 'wpcommunity_schedule_delete_old_attachments');

add_action('wpcommunity_delete_old_attachments_hook', function() {
    $deleted = wpcommunity_delete_old_unused_attachments();
    if ($deleted > 0) {
        error_log('WPCommunity: удалено старых медиа файлов - ' . $deleted);
    }
});

Сначала мы регистрируем событие, которое запускается еженедельно и вызывает нашу функцию удаления. Логирование помогает отслеживать работу скрипта в файле журнала ошибок PHP.

Дополнительные советы и плагины для работы с медиа файлами

Если вы предпочитаете готовые решения или хотите расширить возможности:

  • Media Cleaner — плагин для поиска и удаления неиспользуемых медиа файлов с удобным интерфейсом.
  • WP Optimize — комплексный плагин для оптимизации базы данных и удаления мусора, включая медиа.
  • Clearfy Pro — плагин для оптимизации и безопасности WordPress, который помогает управлять медиа и другими ресурсами сайта.

Используйте эти инструменты в дополнение к автоматизации, чтобы поддерживать сайт в порядке.

Обработка исключений и безопасность

Удаление медиа файлов — операция необратимая, поэтому важно предусмотреть меры безопасности:

  • Обязательно делайте резервные копии сайта и базы данных перед настройкой автоматического удаления.
  • Можно добавить фильтры, чтобы исключать из удаления важные файлы по MIME типу или по определенным папкам.
  • Реализуйте журналирование удалений для аудита и контроля.

Для примера, добавим фильтр исключения изображений определенного типа:

function wpcommunity_exclude_certain_mime_types($attachment_id) {
    $mime = get_post_mime_type($attachment_id);
    $exclude = array('image/svg+xml'); // Исключаем SVG
    return in_array($mime, $exclude);
}

// Вставьте проверку в основную функцию перед удалением:
if (wpcommunity_exclude_certain_mime_types($attachment_id)) {
    continue; // Пропускаем файл
}

Итоги

Автоматизация удаления старых и неиспользуемых медиа файлов в WordPress позволяет поддерживать чистоту и оптимальный размер сайта без лишних усилий. Использование WP-Cron и собственных функций дает гибкость и контроль. Комбинируйте программные решения с проверенными плагинами, такими как Clearfy Pro, чтобы сделать процесс максимально удобным и безопасным.

Как удалить неиспользуемые метаданные в базе данных WordPress
06.12.2025
Как автоматизировать очистку базы данных WordPress от пустых метаданных
23.03.2026
Как использовать WordPress REST API для создания кастомных эндпоинтов
19.01.2026
Оптимизация запросов для постов в WordPress: практические советы и примеры
22.02.2026
Как удалить пустые категории в WordPress: удобный способ и автоматизация
19.02.2026

Задать вопрос о вордпресс, получить ответ - это все можно сделать в нашем сообществе WP. Сайт в данный момент в разработке, изучите ссылки ниже: