Дубли во вложениях — это не только повторяющиеся картинки. В WordPress под «дублями» часто скрываются одинаковые файлы, загруженные несколько раз, записи вложений с разными ID, но одним и тем же физическим файлом, а также «осиротевшие» медиа-элементы, которые больше нигде не используются. На живом сайте это быстро превращается в лишний вес в uploads, путаницу в медиабиблиотеке и проблемы при миграциях.
Ниже — рабочий сценарий: как сначала диагностировать, что именно у вас дублируется, затем безопасно очистить лишнее и проверить, что сайт не потерял нужные изображения и ссылки.
Что именно считать дублем во вложениях
Перед чисткой важно не смешивать разные случаи. Для WordPress это разные задачи и разные риски.
Одинаковый файл, загруженный несколько раз
Например, один и тот же logo.png оказался в медиатеке три раза. Физически это могут быть три копии в wp-content/uploads, а могут быть три записи вложений, которые ссылаются на один и тот же файл после ручных переносов.
Одна картинка, но несколько размеров и производных файлов
Это не дубли в плохом смысле. WordPress сам создаёт миниатюры и промежуточные размеры. Удалять их вручную без понимания, где они используются, не стоит.
Одинаковый контент, но разные имена файлов
Такое бывает после повторной загрузки из редактора, импорта из старого сайта или при работе нескольких редакторов. Визуально это один и тот же баннер, но в базе — разные attachment ID.
Диагностика: где искать проблему
Начните не с удаления, а с проверки масштаба. Если сайт небольшой, можно обойтись медиатекой и SQL-запросами. Если медиафайлов много, лучше сначала собрать список кандидатов на удаление.
Проверка через админку
В медиатеке отсортируйте файлы по дате и вручную проверьте повторяющиеся названия. Это не идеальный метод, но он быстро показывает очевидные дубли после импорта или массовой загрузки.
- одинаковые имена файлов;
- одинаковый размер;
- одинаковая дата загрузки;
- пустое или одинаковое поле «Alt»;
- файлы, которые не используются в записях и страницах.
Проверка через базу данных
Если есть доступ к базе, можно найти вложения с одинаковым guid или одинаковым мета-значением пути к файлу. Это не абсолютный критерий, но хороший старт для ручной проверки.
SELECT meta_value, COUNT(*) AS cnt
FROM wp_postmeta
WHERE meta_key = '_wp_attached_file'
GROUP BY meta_value
HAVING cnt > 1
ORDER BY cnt DESC;Этот запрос показывает случаи, когда несколько attachment-записей указывают на один и тот же путь к файлу. Перед удалением обязательно проверьте, не используются ли эти вложения в контенте, в ACF-полях, в галереях темы или в кастомных блоках.
Пошаговое решение: как удалить дубли безопасно
Лучший порядок действий — сначала резервная копия, потом инвентаризация, затем удаление. Не наоборот.
Шаг 1. Сделайте бэкап базы и uploads
Если удалите не тот attachment, восстановление из одной базы не поможет: файл мог уже исчезнуть с диска. Нужны и база, и каталог wp-content/uploads.
Шаг 2. Составьте список кандидатов
Для ручной чистки удобно выгрузить вложения с путём к файлу и датой. Ниже пример небольшого скрипта, который можно временно запустить в админском контексте или через mu-plugin для диагностики.
<?php
// Временный диагностический код. Удалите после проверки.
$attachments = get_posts([
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => -1,
'fields' => 'ids',
]);
$seen = [];
foreach ($attachments as $attachment_id) {
$file = get_attached_file($attachment_id);
if (!$file || !file_exists($file)) {
continue;
}
$hash = md5_file($file);
if (isset($seen[$hash])) {
echo 'Дубль: ' . $attachment_id . ' <-> ' . $seen[$hash] . '<br>';
} else {
$seen[$hash] = $attachment_id;
}
}Такой подход ищет именно одинаковые файлы по содержимому, а не по имени. Это полезнее, чем сравнивать только post_title или _wp_attached_file.
Шаг 3. Удаляйте только после проверки использования
Перед удалением проверьте, не вставлен ли attachment в:
- контент записей и страниц;
- изображения записей и миниатюры;
- галереи в блоках Gutenberg;
- ACF- или мета-поля;
- настройки темы, где хранится ID изображения;
- виджеты и конструкторы страниц.
Если файл используется хотя бы в одном месте, его удаление может сломать верстку или оставить битые ссылки.
Шаг 4. Удаляйте через штатный API WordPress
Не удаляйте файлы напрямую через FTP, если речь идёт о вложениях, которые есть в базе. Используйте wp_delete_attachment(): так WordPress уберёт запись, файл и связанные метаданные.
<?php
$attachment_id = 123;
if (get_post_type($attachment_id) === 'attachment') {
wp_delete_attachment($attachment_id, true);
}Второй аргумент true означает полное удаление без отправки в корзину. Для боевого сайта это безопасно только после ручной проверки.
Когда лучше использовать плагин, а когда код
Если дубликатов немного, код и ручная проверка обычно надёжнее. Если медиа-библиотека большая и есть регулярные импорты, удобнее использовать инструмент, который умеет находить одинаковые файлы по хэшу и показывать, где они используются.
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Ручная проверка в админке | Небольшой сайт, мало файлов | Безопасно, ничего лишнего не удаляет | Долго и не масштабируется |
| Скрипт на PHP | Есть доступ к коду и базе | Можно точно искать по содержимому файла | Нужна аккуратность и тестирование |
| Плагин для медиа-очистки | Много вложений, регулярные дубли | Удобный интерфейс, отчёты | Нужно проверять, как он определяет «неиспользуемые» файлы |
Если используете плагин, смотрите не на обещание «очистить всё», а на то, умеет ли он учитывать реальные связи WordPress: записи, метаполя, блоки и настройки темы.
Проверка результата после удаления
После чистки важно не ограничиваться тем, что медиатека стала короче. Нужно проверить, что сайт не потерял нужные файлы и не начал отдавать 404.
Что проверить вручную
- главную страницу и несколько типовых шаблонов;
- страницы с галереями и слайдерами;
- карточки записей с featured image;
- страницы, где изображения берутся из ACF или кастомных полей;
- мобильную версию, если тема подгружает отдельные размеры.
Что проверить технически
Откройте несколько удалённых и не удалённых URL изображений напрямую. Если файл удалён корректно, он должен исчезнуть и из базы, и с диска. Если остались битые ссылки, значит где-то хранится старый attachment ID или прямой путь к файлу.
Полезно также пройтись по базе на предмет старых ссылок на медиа:
SELECT ID, post_title
FROM wp_posts
WHERE post_type = 'attachment'
AND post_status = 'inherit';Сверьте количество вложений до и после чистки. Если число уменьшилось, но в контенте не появилось ошибок, значит удаление прошло корректно.
Частые ошибки и как их исправить
Удаляют по имени файла, а не по содержимому
Одинаковое имя не гарантирует одинаковый файл. После повторной загрузки banner.jpg может содержать уже другой баннер. Сравнивайте хэш файла или хотя бы размер и дату вместе с ручной проверкой.
Чистят uploads напрямую через FTP
Файл исчезает с диска, но запись attachment остаётся в базе. В медиатеке появляются «битые» вложения, а в шаблонах — пустые изображения. Если уже так сделали, удалите или обновите attachment-запись через админку или код.
Не проверяют ACF и настройки темы
Многие сайты хранят ID изображения не в контенте, а в опциях темы или пользовательских полях. Визуально файл может казаться неиспользуемым, но он нужен в шапке, футере или на странице контактов.
Путают дубли с миниатюрами WordPress
Миниатюры и промежуточные размеры — нормальная часть работы WordPress. Их не нужно удалять как «дубли», если они используются шаблоном или responsive images.
Практические советы по безопасности и производительности
Если медиа-библиотека разрастается регулярно, проблема обычно не в одном старом файле, а в процессе загрузки контента. Полезно ограничить повторные импорты, настроить единый источник изображений и периодически проверять неиспользуемые вложения перед крупными обновлениями сайта.
Для сайтов с большим количеством контента имеет смысл:
- делать проверку дублей перед миграцией на новый хостинг;
- хранить резервную копию uploads отдельно от базы;
- не удалять вложения пакетно без отчёта о том, где они используются;
- проверять, не создаёт ли тема или плагин лишние копии одного и того же изображения;
- после чистки сбрасывать кэш страниц и CDN, если он есть.
Если вам нужен более широкий аудит дублей и мусора на сайте, в том числе лишних мета-данных и технических хвостов, можно посмотреть в сторону инструментов класса Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином логика остаётся прежней: сначала диагностика, потом удаление, потом проверка.