Удаление старых файлов из медиабиблиотеки WordPress по расписанию

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

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

Со временем в медиабиблиотеке накапливаются:

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

Удаление таких файлов освобождает место на сервере и улучшает производительность сайта. Кроме того, регулярная чистка медиабиблиотеки снижает риск ошибок при бэкапах и миграциях.

Основные этапы автоматического удаления файлов по расписанию

Для реализации автоматического удаления нам понадобятся следующие шаги:

  1. Определить критерии для удаления — например, файлы, не используемые в постах и старше определённого времени.
  2. Создать функцию, которая будет находить и удалять такие файлы.
  3. Запланировать выполнение этой функции по расписанию с помощью WP-Cron.

Рассмотрим каждый шаг подробнее.

Определение критериев для удаления

Самый надёжный способ — проверить, какие медиафайлы не прикреплены к записям (posts) или страницам и не используются нигде на сайте. Также можно ограничиться удалением файлов, загруженных раньше определённого времени (например, старше 6 месяцев).

Для проверки использования файлов можно анализировать содержимое постов и метаданные. Это сложно и ресурсоёмко, поэтому в большинстве случаев достаточно проверять, есть ли у файла связь с постом (post_parent) и дату загрузки.

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

function wpall_delete_old_unused_media() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

    $args = array(
        'post_type'      => 'attachment',
        'posts_per_page' => -1,
        'post_status'    => 'inherit',
        'date_query'     => array(
            array('before' => $date_threshold),
        ),
        'meta_query'     => array(
            array(
                'key'     => '_wp_attached_file',
                'compare' => 'EXISTS',
            ),
        ),
    );

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

    foreach ($attachments as $attachment) {
        // Проверяем, прикреплён ли файл к посту
        if (empty($attachment->post_parent)) {
            // Проверяем, используется ли файл в содержимом сайта
            $file_url = wp_get_attachment_url($attachment->ID);
            global $wpdb;
            $usage_count = $wpdb->get_var($wpdb->prepare(
                "SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
                '%' . $wpdb->esc_like($file_url) . '%'
            ));

            if ($usage_count == 0) {
                // Удаляем файл и запись из базы
                wp_delete_attachment($attachment->ID, true);
                $deleted_count++;
            }
        }
    }

    return $deleted_count;
}

Данная функция ищет все вложения старше 6 месяцев, не прикреплённые к постам, и проверяет, есть ли ссылка на них в содержимом. Если нет — удаляет.

Настройка WP-Cron для автоматического запуска

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

Добавление собственного расписания

function wpall_custom_cron_schedules($schedules) {
    if(!isset($schedules['weekly'])) {
        $schedules['weekly'] = array(
            'interval' => 604800, // 7 дней в секундах
            'display'  => __('Раз в неделю')
        );
    }
    return $schedules;
}
add_filter('cron_schedules', 'wpall_custom_cron_schedules');

Запланировать событие

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

Подключение функции к событию

add_action('wpall_daily_media_cleanup', 'wpall_delete_old_unused_media');

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

Плагины для упрощения очистки медиабиблиотеки

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

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

Советы и предупреждения при удалении файлов

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

  • Обязательно делать бэкап сайта перед автоматической очисткой.
  • Тестировать функцию на тестовом сайте или на небольшой выборке.
  • Проверять логи, чтобы убедиться, что удаляются только неиспользуемые файлы.
  • Использовать безопасный режим удаления — например, сначала помечать файлы для удаления, а потом удалять вручную.

Выводы

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

WPAll Автообновления WordPress: как настроить безопасное обновление плагинов и тем
04.11.2025
Как сделать автоматическое удаление спама в комментариях WordPress
23.01.2026
Использование WooCommerce REST API для автоматизации управления заказами
13.06.2026
Как удалить заблокированных пользователей в WordPress
14.04.2026
Как создать автоматические резервные копии базы данных WordPress с помощью PHP
03.01.2026