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

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

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

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

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

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

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

Битые изображения — это файлы, на которые ссылаются записи, но которые не существуют на сервере (удалены вручную или повреждены).

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

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

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

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

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

Ниже представлен пример функции с префиксом wpmy_, которая сканирует все изображения в медиатеке и проверяет, используются ли они в записях и страницах:

function wpmy_find_unused_images() {
    global $wpdb;
    $unused_images = [];

    // Получаем все вложения типа image
    $images = $wpdb->get_results("SELECT ID, guid FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'");

    foreach ($images as $image) {
        $id = $image->ID;
        $url = $image->guid;

        // Ищем ссылки на изображение в контенте всех постов
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
            '%' . $wpdb->esc_like($url) . '%'
        ));

        // Если в контенте нет ссылок, добавляем в список неиспользуемых
        if (intval($count) === 0) {
            $unused_images[] = [
                'ID' => $id,
                'url' => $url
            ];
        }
    }

    return $unused_images;
}

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

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

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

function wpmy_delete_unused_images() {
    $unused_images = wpmy_find_unused_images();

    foreach ($unused_images as $image) {
        wp_delete_attachment($image['ID'], true); // true — удаляет физический файл
    }
}

// Регистрируем крон задачу при активации темы или плагина
function wpmy_schedule_image_cleanup() {
    if (!wp_next_scheduled('wpmy_image_cleanup_event')) {
        wp_schedule_event(time(), 'daily', 'wpmy_image_cleanup_event');
    }
}
add_action('wp', 'wpmy_schedule_image_cleanup');

// Хук для выполнения удаления
add_action('wpmy_image_cleanup_event', 'wpmy_delete_unused_images');

Этот код можно добавить в файл functions.php вашей темы или создать отдельный плагин. Он будет ежедневно проверять и удалять неиспользуемые изображения.

Проверка битых ссылок на изображения

Битые изображения — это когда ссылка на файл есть, а файл на сервере отсутствует. Чтобы выявить такие случаи, можно проверить существование файла по пути, хранящемуся в базе данных.

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

function wpmy_find_broken_images() {
    global $wpdb;
    $broken_images = [];

    // Получаем все вложения типа image
    $images = $wpdb->get_results("SELECT ID, guid FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'");

    foreach ($images as $image) {
        $file_path = str_replace(site_url('/'), ABSPATH, $image->guid);

        if (!file_exists($file_path)) {
            $broken_images[] = [
                'ID' => $image->ID,
                'url' => $image->guid
            ];
        }
    }

    return $broken_images;
}

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

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

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

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

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

Как оценивать и управлять загрузкой сервера WordPress
04.01.2026
Как установить лимит на количество сообщений в формах WordPress
31.03.2026
Как создать динамическую навигацию в WordPress с помощью AJAX
03.03.2026
Добавление поддержки WebP в WordPress без плагинов: практическое руководство
07.04.2026
Как установить и настроить WooCommerce для интернет-магазина на WordPress
03.12.2025