wplearn.ru wordpress WP Learn

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

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

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

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

  • Замедлению резервного копирования и восстановления;
  • Увеличению размера базы данных из-за метаданных;
  • Росту затрат на хостинг;
  • Снижению удобства работы с медиа-библиотекой.

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

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

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

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

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

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

function wplearn_delete_unused_images() {
    global $wpdb;

    // Получаем все ID вложений (изображений)
    $attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'");

    foreach ($attachments as $attachment_id) {
        // Проверяем, есть ли ссылка на вложение в постах
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
            '%'.wp_get_attachment_url($attachment_id).'%'
        ));

        // Проверяем, прикреплено ли к посту
        $parent_id = wp_get_post_parent_id($attachment_id);

        if ($count == 0 && $parent_id == 0) {
            // Удаляем вложение без возможности восстановления
            wp_delete_attachment($attachment_id, true);
        }
    }
}

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

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

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

function wplearn_get_unused_images() {
    global $wpdb;
    $unused = [];
    $attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'");

    foreach ($attachments as $attachment_id) {
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
            '%'.wp_get_attachment_url($attachment_id).'%'
        ));
        $parent_id = wp_get_post_parent_id($attachment_id);
        if ($count == 0 && $parent_id == 0) {
            $unused[] = $attachment_id;
        }
    }
    return $unused;
}

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

Плагины для автоматизации очистки медиа-библиотеки

Помимо Media Cleaner, рассмотрим ещё несколько полезных плагинов:

  • WP-Optimize — помимо очистки базы данных, умеет удалять неиспользуемые медиафайлы;
  • Image Cleanup — простой инструмент для поиска и удаления неиспользуемых изображений;
  • Clearfy Pro — в числе функций есть оптимизация медиа и управление ненужными файлами.

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

Как настроить автоматическую очистку с помощью WP Cron

В приведённом выше коде мы использовали планировщик задач WordPress — WP Cron, чтобы запускать очистку еженедельно. Это удобно, чтобы не выполнять тяжелые операции вручную.

Если хотите, можно изменить частоту или отключить автоматический запуск и запускать функцию вручную из админки или через WP-CLI.

Пример запуска очистки вручную через WP-CLI:

wp eval 'wplearn_delete_unused_images();'

Рекомендации по безопасности и резервному копированию

Удаление медиафайлов — необратимая операция при использовании wp_delete_attachment с параметром true. Поэтому:

  • Всегда делайте резервные копии сайта и базы данных перед автоматической очисткой;
  • Рекомендуется сначала получать список неиспользуемых файлов и проверять их;
  • Если боитесь ошибок, используйте плагин Media Cleaner в режиме сканирования без удаления;
  • Тестируйте скрипты на копии сайта перед запуском на боевом ресурсе.

Заключение

Автоматизация удаления старых и неиспользуемых изображений в WordPress поможет поддерживать сайт в оптимальном состоянии, экономить место на диске и уменьшать нагрузку на бэкапы. В статье мы рассмотрели, как сделать это с помощью собственного кода и популярных плагинов. Внедряйте эти методы аккуратно, всегда делайте резервные копии и проверяйте результаты. Если хотите расширить функционал, обратите внимание на плагины из WPShop, например Clearfy Pro для более удобного управления медиа.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше