На многих сайтах WordPress медиафайлы живут своей жизнью: у каждого изображения появляется отдельная attachment-страница с собственным URL. Для пользователя это почти всегда бесполезная страница, а для сайта — лишние адреса, которые могут попасть в индекс, плодить дубли и размывать качество внутренней структуры.
Проблема особенно заметна после миграций, массовой загрузки изображений и активной публикации контента. Если в отчётах поисковиков всплывают URL вида /attachment/, ?attachment_id= или отдельные страницы вложений с тонким содержимым, их лучше убрать из обхода и из индекса.
Когда attachment-страницы становятся проблемой
WordPress по умолчанию создаёт для вложения отдельную запись типа attachment. Если тема или плагин выводит ссылку не на сам файл, а на страницу вложения, пользователь попадает на почти пустую страницу с одной картинкой, без нормального контекста и навигации. Для поисковика это слабая страница, которая редко несёт самостоятельную ценность.
Сценарии, где это особенно мешает:
- на сайте много изображений и галерей;
- в шаблоне медиафайлы ссылаются на attachment page по умолчанию;
- после импорта контента остались старые URL вложений;
- в индексе уже есть сотни или тысячи страниц вложений;
- в отчётах появляются дубли с одинаковыми изображениями, но разными URL.
Диагностика: как понять, что у вас именно эта проблема
Сначала проверьте, существуют ли attachment-страницы и отдают ли они код 200. Откройте несколько URL вложений вручную или через краулер. Если страница открывается как отдельный HTML-документ, а не редиректит на файл или на родительскую запись, значит она реально доступна для индексации.
Что смотреть в админке и в поисковой выдаче
- в поиске по сайту попробуйте запросы вида
site:example.ru attachmentилиsite:example.ru inurl:attachment; - в Google Search Console проверьте отчёт по страницам, которые обнаружены, но не нужны для индексации;
- в логах краулера или Screaming Frog посмотрите, есть ли URL вложений с кодом ответа 200;
- в теме проверьте, куда ведут ссылки у изображений: на файл, на attachment page или на медиафайл.
Если attachment-страницы уже попали в индекс, просто закрыть их robots.txt обычно недостаточно. Поисковик может продолжать держать их в базе как известные URL. Надёжнее убрать саму страницу из генерации или сделать редирект на более полезный адрес.
Пошаговое решение: что делать на практике
Есть три рабочих подхода: отключить attachment-страницы на уровне кода, настроить редирект на файл или родительскую запись, либо использовать SEO-плагин, который умеет закрывать такие URL. Для большинства проектов самый чистый вариант — редиректить attachment page на родительскую запись, а если её нет — на сам файл или на главную страницу медиа.
| Подход | Плюсы | Минусы |
|---|---|---|
| Код в теме или mu-plugin | Контроль, минимум лишней логики | Нужно аккуратно тестировать после обновлений |
| SEO-плагин | Быстрее внедрить, меньше ручной работы | Не всегда даёт нужную точность |
| robots.txt | Просто добавить | Не убирает уже известные URL из индекса |
Вариант 1: редирект attachment-страниц через код
Этот способ подходит, если вы хотите убрать проблему без лишних плагинов. Добавьте код в functions.php дочерней темы или, лучше, в отдельный mu-plugin.
<?php
add_action('template_redirect', function () {
if (!is_attachment()) {
return;
}
$parent_id = wp_get_post_parent_id(get_the_ID());
if ($parent_id) {
wp_safe_redirect(get_permalink($parent_id), 301);
exit;
}
$file = wp_get_attachment_url(get_the_ID());
if ($file) {
wp_safe_redirect($file, 301);
exit;
}
wp_safe_redirect(home_url('/'), 301);
exit;
});Логика простая: если у вложения есть родительская запись, отправляем пользователя туда. Если родителя нет, ведём на сам файл. Это лучше, чем оставлять пустую attachment page с кодом 200.
Вариант 2: отключить attachment page через фильтр permalink
Если вам не нужны отдельные страницы вложений вообще, можно сразу убрать их как точку входа. Но тут важно понимать: WordPress всё равно хранит attachment как тип записи, просто вы перестаёте использовать его как публичную страницу.
<?php
add_filter('attachment_link', function ($link, $post_id) {
$file = wp_get_attachment_url($post_id);
return $file ? $file : $link;
}, 10, 2);Этот вариант полезен, если тема или редактор часто вставляют ссылки на attachment page. Тогда хотя бы новые ссылки будут вести на файл, а не на отдельную HTML-страницу.
Вариант 3: закрыть вложения через SEO-плагин
Если на сайте уже стоит SEO-плагин, проверьте, умеет ли он переводить attachment URL в noindex или редирект. Это удобно, когда не хочется трогать код, но важно не перепутать закрытие от индексации с удалением страницы из обхода. Если страница остаётся доступной по 200, а только мета-тег меняется, проблема не исчезает полностью.
Для сайтов, где нужна более широкая чистка дублей и технического мусора, иногда проще использовать отдельный набор настроек в SEO-плагине или инструменте вроде Clearfy Pro: он помогает закрывать лишние типы страниц и уменьшать количество технических дублей. Но даже в этом случае attachment-страницы лучше проверить вручную, а не полагаться на галочку в интерфейсе.
Как проверить, что решение сработало
После внедрения откройте несколько URL вложений в браузере и через curl. Вам нужно убедиться, что старый адрес больше не отдаёт 200 и не остаётся полноценной страницей.
curl -I https://example.ru/2024/05/photo-name/Ожидаемый результат — 301 на родительскую запись или на файл. Если вы выбрали редирект на файл, проверьте, что URL действительно ведёт на изображение, а не на промежуточную HTML-страницу.
Дальше проверьте индексацию:
- в Search Console отправьте проверку URL и посмотрите, как робот видит страницу;
- запустите повторный краул сайта и убедитесь, что attachment-страницы больше не отдают 200;
- посмотрите, не остались ли внутренние ссылки на старые URL вложений в контенте и меню;
- если есть sitemap, убедитесь, что туда не попадают attachment-страницы.
Частые ошибки и как их исправить
Оставили 200 OK и только добавили noindex
Это частая полумера. Страница всё ещё существует, её можно обходить, и поисковик продолжает тратить на неё ресурсы. Если attachment-страницы не нужны, лучше редиректить их или убрать из генерации ссылок.
Сделали редирект на главную для всех вложений
Такой вариант работает, но он грубый. Если у изображения есть родительская запись, логичнее отправлять пользователя туда. Иначе вы теряете контекст, а часть старых ссылок выглядит как массово сломанная навигация.
Закрыли URL в robots.txt
Это не удаляет уже известные адреса из индекса и не решает проблему внутренних ссылок. Robots.txt полезен как дополнительная мера, но не как единственный способ.
Не проверили, как тема вставляет изображения
Некоторые темы и конструкторы могут генерировать ссылки на attachment page автоматически. После правки кода проверьте посты, галереи, блоки изображений и слайдеры. Иначе старые ссылки останутся внутри контента.
Чек-лист перед публикацией изменений
- проверили, что attachment-страницы реально существуют и отдают 200;
- выбрали один способ: редирект, фильтр ссылок или SEO-плагин;
- протестировали несколько URL с родителем и без родителя;
- убедились, что внутренние ссылки больше не ведут на attachment page;
- проверили sitemap и отчёты Search Console;
- сделали бэкап перед изменениями в теме или mu-plugin.
Безопасность и производительность
Если вы вносите код, не правьте напрямую основной файл темы. Используйте дочернюю тему или mu-plugin, чтобы не потерять изменения после обновления. Для сайтов с высокой нагрузкой редирект через template_redirect обычно не создаёт заметной проблемы, но лишние проверки в каждом запросе лучше держать минимальными и понятными.
Если на сайте много медиа и старых публикаций, сначала прогоните изменения на staging-копии. Это особенно важно, если attachment-страницы уже участвуют во внутренней перелинковке или на них завязаны старые внешние ссылки.
В итоге задача не в том, чтобы просто «спрятать» вложения, а в том, чтобы убрать бесполезные URL из архитектуры сайта. Тогда поисковик тратит обход на реальные страницы, а не на пустые медиа-оболочки.