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

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

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

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

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

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

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

Для этого анализируют базу данных и контент сайта на наличие ссылок на URL файлов из wp-content/uploads. Некоторые плагины умеют выполнять такие проверки автоматически.

Пример использования плагина Media Cleaner

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

Основные возможности Media Cleaner:

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

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

Автоматическое удаление неиспользуемых медиафайлов с помощью кода

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

function wptool_ru_delete_unattached_media() {
    $args = [
        'post_type'      => 'attachment',
        'post_status'    => 'inherit',
        'posts_per_page' => -1,
        'post_parent'    => 0, // Файлы без родителя
    ];
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        foreach ($query->posts as $attachment) {
            wp_delete_attachment($attachment->ID, true); // Удаляем без возможности в корзину
        }
    }
}

// Запускаем очистку раз в неделю
if (!wp_next_scheduled('wptool_ru_weekly_media_cleanup')) {
    wp_schedule_event(time(), 'weekly', 'wptool_ru_weekly_media_cleanup');
}
add_action('wptool_ru_weekly_media_cleanup', 'wptool_ru_delete_unattached_media');

Обратите внимание, что этот код удаляет только медиафайлы, которые не связаны ни с одним постом. Для более сложного анализа, учитывающего файлы, вставленные вручную через URL, потребуется дополнительный анализ контента.

Улучшение скрипта: проверка ссылок в контенте

Чтобы расширить проверку, можно просканировать все записи и проверить наличие ссылок на медиафайлы. Вот упрощённый пример функции, которая собирает все URL вложений и сравнивает их с теми, что используются в контенте:

function wptool_ru_get_used_media_ids() {
    global $wpdb;
    $used_ids = [];
    $attachments = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type='attachment'");
    $posts = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_status='publish' AND post_type IN ('post','page')");

    foreach ($posts as $post) {
        foreach ($attachments as $attachment_id) {
            $url = wp_get_attachment_url($attachment_id);
            if (strpos($post->post_content, $url) !== false) {
                $used_ids[] = $attachment_id;
            }
        }
    }
    return array_unique($used_ids);
}

Дальше можно получить все вложения и удалить те, которых нет в списке $used_ids.

Плагины для автоматизации и расширенных возможностей

Кроме Media Cleaner, есть и другие решения с полезными функциями:

  • WP-Optimize — позволяет оптимизировать базу данных и удалять неиспользуемые медиафайлы, а также кэш и ревизии.
  • Attachment Control — ограничивает загрузку и управление медиа, что снижает накопление неиспользуемого контента.
  • Clearfy Pro (ссылка) — содержит модули для уборки базы и оптимизации медиа, что помогает поддерживать порядок и производительность.

Практические рекомендации по внедрению автоматической очистки

1. Всегда делайте резервную копию сайта и базы данных перед запуском автоматического удаления.

2. Тестируйте скрипты и плагины на копии сайта, чтобы избежать потери нужных файлов.

3. Настраивайте периодичность очистки исходя из объема загрузок и частоты обновления контента.

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

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

Заключение: как сделать автоматическое удаление безболезненным

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

Для более детального контроля и интеграции с другими процессами управления WordPress рекомендую обратить внимание на WPShop — здесь собраны полезные инструменты и плагины для комплексной оптимизации и автоматизации.

Как автоматизировать управление пользовательскими метаданными в WordPress с примерами кода
06.04.2026
Автоматический импорт продуктов WooCommerce из CSV с примерами кода
04.02.2026
Как создать динамическую отображающуюся таблицу в WordPress с помощью shortcode
12.02.2026
WooCommerce: автоматическое изменение цен при изменении атрибутов товара
13.06.2026
Как создать собственный тип записей (Custom Post Type) в WordPress с примером кода
27.03.2026