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

Дубли изображений в WordPress обычно появляются незаметно: один и тот же файл загружают повторно, тема или плагин создают несколько размеров, а в медиатеке накапливаются копии с разными именами. В результате растёт объём uploads, усложняется поиск нужного файла и появляются лишние записи вложений в базе.

Если задача не в «почистить всё подряд», а в том, чтобы убрать именно дубли и не сломать уже опубликованные записи, нужен аккуратный порядок действий: сначала найти источник повторов, потом проверить, где файл используется, и только после этого удалять.

Когда дубли изображений действительно мешают

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

Что проверить перед удалением

  • есть ли резервная копия базы и каталога wp-content/uploads;
  • используются ли изображения в записях, виджетах, ACF-полях, блоках Gutenberg и в настройках темы;
  • не является ли «дубль» единственным файлом нужного размера;
  • не хранит ли CDN или кэш старую версию файла;
  • есть ли на сайте импорт из внешних источников, который может снова создать копии.

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

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

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

cd /path/to/wordpress/wp-content/uploads
find . -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' -o -iname '*.gif' \) -exec md5sum {} \; | sort | awk 'BEGIN{prev=""} {if ($1==prev) print "DUPLICATE:", $2; prev=$1}'

Команда выше не удаляет ничего, а только помогает увидеть повторяющиеся файлы по одинаковой контрольной сумме. Если на хостинге нет доступа к shell, можно использовать плагин для медиа-очистки, но проверять результаты всё равно придётся вручную.

Где искать причину повторов

Если дубли появляются регулярно, важно понять источник. Чаще всего это:

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

Пошаговое удаление дублей без поломки ссылок

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

Шаг 1. Сверьте вложения с файлами на диске

В базе WordPress каждое изображение обычно представлено как запись типа attachment. Но наличие записи ещё не гарантирует, что файл нужен. Иногда в базе остаётся «пустое» вложение после неудачной миграции, а сам файл лежит в uploads без привязки к записи.

Для точечной проверки можно получить URL вложения и сравнить его с реальным файлом на сервере:

// functions.php или временный mu-plugin
add_action('admin_init', function () {
    if (!current_user_can('manage_options')) {
        return;
    }

    $attachment_id = 123;
    $path = get_attached_file($attachment_id);
    $url  = wp_get_attachment_url($attachment_id);

    error_log('Attachment path: ' . $path);
    error_log('Attachment url: ' . $url);
});

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

Шаг 2. Найдите, где файл используется

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

global $wpdb;
$needle = '2024/08/example-image.jpg';

$posts = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_content LIKE %s",
        '%' . $wpdb->esc_like($needle) . '%'
    )
);

foreach ($posts as $post) {
    echo $post->ID . ' — ' . $post->post_title . PHP_EOL;
}

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

Шаг 3. Удалите лишние копии, а не оригинал

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

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

$attachment_id = 456;
if (wp_attachment_is_image($attachment_id)) {
    $deleted = wp_delete_attachment($attachment_id, true);
    if ($deleted) {
        error_log('Attachment deleted: ' . $attachment_id);
    }
}

Параметр true удаляет файл физически, а не только переводит запись в корзину. Это удобно для чистки, но опасно без предварительной проверки.

Плагин, код или ручная чистка: что выбрать

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

ПодходКогда подходитКомпромисс
Ручная чисткаНебольшой сайт, десятки файловМедленно, легко пропустить скрытые ссылки
Плагин для медиа-очисткиБольшая медиатека, нужен интерфейсНужно проверять, что плагин не удаляет используемые файлы
Код/скриптНужна точная логика под проектТребует доступа к серверу и аккуратного тестирования

Если на сайте уже используется Clearfy Pro, его инструменты для чистки и удаления дублей могут помочь с частью рутинных задач, но перед удалением всё равно стоит проверить реальные ссылки и зависимости. Ссылка на продукт: https://wpshop.ru/plugins/clearfy.

Как проверить, что очистка сработала

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

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

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

Частые ошибки при удалении дублей

Удаляют похожие, но не одинаковые файлы

Самая типичная ошибка — ориентироваться только на имя файла. image-1.jpg и image-2.jpg могут быть разными версиями, а photo.jpg и photo-copy.jpg — одинаковыми. Сравнивать нужно либо по хэшу, либо по фактическому использованию в контенте.

Чистят медиатеку без проверки ссылок

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

Не учитывают размеры, созданные темой

Иногда кажется, что в uploads лежат дубли, хотя это просто разные размеры одного изображения. Удалять их вручную не стоит, если тема или плагин реально используют эти файлы. Лучше сначала проверить, какие размеры зарегистрированы через add_image_size() и какие из них нужны на сайте.

Забывают про резервную копию

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

Практические советы по безопасности и производительности

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

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

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

Как устранить ошибку 502 Bad Gateway в WordPress: практические решения
09.01.2026
Как добавить динамические параметры в шорткод WordPress
11.12.2025
Как отключить автосохранение в WordPress без потери данных
24.07.2026
Как добавить автоматическое обновление тем в WordPress
14.04.2026
Как создать автоматические сообщения в WordPress с помощью хуков и пингов
04.03.2026