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

Управление медиафайлами — важная часть поддержки производительности и чистоты сайта на WordPress. Со временем на сервере накапливается множество неиспользуемых или устаревших изображений и других файлов, которые занимают место и могут замедлять работу сайта. В этой статье разберём, как автоматически удалять старые медиафайлы в WordPress, чтобы поддерживать порядок и экономить ресурсы.

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

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

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

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

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

  • Старые по дате загрузки (например, старше 1 года)
  • Не прикреплённые к постам (attachment без parent post)
  • Неиспользуемые в контенте (в редакторе, виджетах, настройках)
  • Может быть, с определёнными типами файлов (например, только изображения)

Также желательно предусмотреть создание резервной копии и логи действий для контроля.

Плагины для автоматического удаления медиафайлов

Несколько полезных плагинов, которые помогут в решении задачи:

  • Media Cleaner — анализирует базу данных и файловую систему, находит неиспользуемые файлы и предлагает их удалить. Есть платная версия с расширенными функциями.
  • DNUI (Delete Not Used Image) — простой плагин для поиска и удаления неиспользуемых изображений.
  • WPOptimize — комплексный плагин для оптимизации базы данных и медиафайлов, умеет удалять неиспользуемые медиа.

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

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

Если хочется более гибкого и лёгкого решения, можно написать собственный плагин или добавить код в functions.php темы. Рассмотрим пример функции, которая удаляет все медиафайлы, которые не прикреплены к постам и старше 180 дней.

function wpaddons_delete_old_unattached_media() {
    $args = array(
        'post_type'      => 'attachment',
        'posts_per_page' => -1,
        'post_status'    => 'inherit',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '180 days ago',
            ),
        ),
        'meta_query'     => array(
            array(
                'key'     => '_wp_attachment_context',
                'compare' => 'NOT EXISTS',
            ),
        ),
        'post_parent'    => 0,
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $attachment_id = get_the_ID();
            wp_delete_attachment($attachment_id, true); // true — удалить физический файл
        }
        wp_reset_postdata();
    }
}

// Запускаем функцию раз в неделю через WP-Cron
if (!wp_next_scheduled('wpaddons_weekly_media_cleanup')) {
    wp_schedule_event(time(), 'weekly', 'wpaddons_weekly_media_cleanup');
}
add_action('wpaddons_weekly_media_cleanup', 'wpaddons_delete_old_unattached_media');

В этом примере мы используем WP_Query для поиска вложений (attachments) с post_parent = 0 — то есть не прикреплённых к постам, и дату создания старше 180 дней. Затем функция удаляет такие вложения вместе с физическими файлами.

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

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

Для безопасности можно сначала выводить список ID и имен файлов, которые будут удалены, вместо реального удаления. Например, заменить вызов wp_delete_attachment на error_log('Удаляется файл ID: ' . $attachment_id); чтобы проверить работу кода.

Расширение функционала: удаление неиспользуемых медиа по содержимому

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

Это более сложная задача, которая требует обхода всех постов и проверки вхождений URL файлов. Ниже базовый пример, как получить список всех вложений и проверить ссылки:

function wpaddons_find_unused_media() {
    global $wpdb;
    $attachments = get_posts(array(
        'post_type' => 'attachment',
        'numberposts' => -1,
    ));

    $unused = array();

    foreach ($attachments as $attachment) {
        $url = wp_get_attachment_url($attachment->ID);

        // Поиск URL в содержимом сайта
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
            '%' . $wpdb->esc_like($url) . '%'
        ));

        if ($count == 0) {
            $unused[] = $attachment->ID;
        }
    }
    return $unused;
}

Дальше можно удалить полученные ID, но будьте осторожны с производительностью и сделайте проверку.

Рекомендации по работе с медиафайлами в WordPress

Чтобы минимизировать появление «мусорных» файлов, придерживайтесь следующих правил:

  • Регулярно используйте плагины типа Media Cleaner для поиска неиспользуемых файлов.
  • Не загружайте лишние файлы без необходимости.
  • Перед удалением медиа создавайте резервные копии.
  • Автоматизируйте очистку с помощью WP-Cron или серверных cron задач.
  • Оптимизируйте изображения — используйте плагины сжатия и lazy loading.

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

Итог

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

Как автоматически удалять неиспользуемые CSS и JS в WordPress
08.03.2026
Автоматическое изменение титлов и метаданных в WordPress по шаблону
19.01.2026
Автоматическое изменение стоимости товаров в WooCommerce при определённых условиях
21.04.2026
Автоматическое удаление старых постов в WordPress: практическое руководство
05.01.2026
Как создать собственный виджет в WordPress с примером кода
15.11.2025