Attachment-страницы в WordPress часто остаются незаметными до тех пор, пока в индексе не начинают копиться тонкие URL с одним изображением и почти без текста. Для сайта это обычно лишний шум: такие страницы редко дают трафик, но могут создавать дубли, размывать внутреннюю перелинковку и мешать SEO-аудиту.
Задача здесь не в том, чтобы удалить сами медиафайлы, а в том, чтобы отключить отдельные страницы вложений, если они не нужны как самостоятельные посадочные. Ниже — рабочие способы: от настройки через код до проверки результата в индексе и типичных ошибок, из-за которых редирект не срабатывает.
Когда attachment-страницы становятся проблемой
В WordPress каждое загруженное изображение может иметь собственную страницу вложения. Если тема или плагин не переопределяют поведение, такие URL начинают жить отдельно от записи. На небольшом сайте это может быть незаметно, но на контентных проектах и блогах с большим количеством изображений они быстро превращаются в технический мусор.
Типичные признаки
- в отчётах Search Console появляются URL вида
/attachment/или страницы с названием файла; - в индексе есть страницы без полезного текста, только изображение и стандартная оболочка темы;
- при клике на картинку пользователь попадает не в статью, а на отдельную страницу вложения;
- внутренние ссылки и хлебные крошки начинают вести на бесполезные URL.
Что важно не перепутать
Отключение attachment-страниц не удаляет файлы из uploads и не ломает вставку изображений в записи. Речь только о том, чтобы перестать отдавать отдельную HTML-страницу для вложения и перенаправлять её на исходную запись или на сам файл, если это действительно нужно.
Диагностика: как понять, что у вас есть attachment-URL
Сначала проверьте, как именно сайт сейчас отдаёт страницы вложений. Откройте несколько изображений в медиатеке и посмотрите, какой URL формируется при переходе на attachment-страницу. Если в адресе есть отдельный permalink, значит WordPress их публикует.
Быстрый способ проверки через код — вывести тип записи и permalink для вложения в тестовой среде:
<?php
$attachment_id = 123;
$post = get_post( $attachment_id );
if ( $post && 'attachment' === $post->post_type ) {
echo 'URL: ' . esc_url( get_permalink( $attachment_id ) );
echo '<br>';
echo 'MIME: ' . esc_html( $post->post_mime_type );
}
Если permalink возвращает отдельную страницу, а не прямую ссылку на файл или родительскую запись, значит есть смысл отключать attachment-архитектуру на уровне шаблона или редиректа.
Рабочие варианты решения
Есть три нормальных подхода: редирект через template_redirect, отключение attachment-страниц через attachment_link и настройка SEO-плагина, если он умеет закрывать такие URL от индексации. Для большинства сайтов самый надёжный вариант — редирект на родительскую запись или на главную, если родителя нет.
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код в теме/плагине | Полный контроль, без лишних зависимостей | Нужно аккуратно тестировать | Если нужен предсказуемый редирект |
| SEO-плагин | Быстро включается | Не всегда закрывает именно attachment-URL | Если плагин уже используется для индексации |
| Ничего не делать | Нет затрат на внедрение | Тонкие страницы остаются в индексе | Только если attachment-страницы реально нужны |
Вариант 1: редирект attachment-страниц на родительскую запись
Этот способ подходит, если изображения загружаются в записи и отдельные страницы вложений вам не нужны. Код можно добавить в мини-плагин или в functions.php дочерней темы. Лучше именно в мини-плагин, чтобы не потерять логику при смене темы.
<?php
add_action( 'template_redirect', function () {
if ( ! is_attachment() ) {
return;
}
$attachment_id = get_queried_object_id();
$parent_id = wp_get_post_parent_id( $attachment_id );
if ( $parent_id ) {
wp_safe_redirect( get_permalink( $parent_id ), 301 );
exit;
}
wp_safe_redirect( home_url( '/' ), 301 );
exit;
} );
Логика простая: если у вложения есть родительская запись, отправляем пользователя туда. Если родителя нет, уводим на главную или на другой логичный URL. Это лучше, чем оставлять страницу 404, потому что поисковик и пользователь получают понятный переход.
Вариант 2: отключить ссылки на attachment в шаблонах
Если проблема не только в индексации, но и в том, что тема выводит ссылки на attachment-страницы в галереях или списках медиа, можно переопределить URL вложения и вести сразу на файл. Это не всегда нужно, но для некоторых проектов упрощает поведение интерфейса.
<?php
add_filter( 'attachment_link', function ( $link, $post_id ) {
$file = wp_get_attachment_url( $post_id );
if ( $file ) {
return $file;
}
return $link;
}, 10, 2 );
Этот вариант меняет именно ссылку, которую WordPress генерирует для вложения. Но он не решает вопрос индексации сам по себе, поэтому его обычно используют вместе с редиректом или SEO-настройкой.
Вариант 3: закрыть attachment-страницы в SEO-плагине
Если у вас уже стоит SEO-плагин, проверьте, есть ли в нём настройка для медиа-страниц или attachment URL. В некоторых конфигурациях можно задать noindex для архивов вложений или отключить их индексацию на уровне шаблонов мета-тегов. Это полезно, но не всегда достаточно: если URL уже в индексе, один noindex не уберёт их быстро без редиректа или удаления ссылки.
Пошаговое внедрение без поломки сайта
- Сделайте бэкап файлов и базы, особенно если правите
functions.php. - Проверьте, есть ли attachment-страницы в индексе и в логах переходов.
- Выберите целевой сценарий: редирект на родителя, на файл или на главную.
- Добавьте код в мини-плагин или дочернюю тему.
- Очистите кэш страницы, объектный кэш и CDN, если он есть.
- Пройдитесь по нескольким attachment-URL вручную и проверьте код ответа.
- После этого отправьте на переобход важные URL через Search Console, если они уже были в индексе.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Откройте attachment-URL в браузере и посмотрите, куда он ведёт. Ещё лучше — проверить HTTP-ответ через curl или любой HTTP-клиент.
curl -I https://example.com/sample-image/В нормальном сценарии вы должны увидеть 301 Moved Permanently и новый Location. Если остаётся 200 OK, значит редирект не сработал. Если получаете 404, проверьте, не конфликтует ли код с темой, кэшем или другим плагином.
Дополнительно проверьте:
- нет ли в HTML страницы мета-тега
noindex, если вы рассчитывали именно на редирект; - не остались ли внутренние ссылки на attachment-URL в контенте;
- не кэширует ли сервер старый ответ;
- не генерирует ли галерея темы отдельные ссылки на вложения.
Частые ошибки и как их исправить
Редирект добавили, но URL всё равно открывается
Чаще всего причина в кэше. Сначала очистите плагин кэширования, потом серверный кэш и CDN. Если после этого проблема остаётся, проверьте, не подключён ли другой плагин, который перехватывает attachment-страницы раньше вашего кода.
Появились циклические редиректы
Это бывает, если родительская запись тоже ведёт на тот же URL через кастомную логику. Проверьте, не переписан ли get_permalink() фильтрами темы или плагина. Для диагностики временно отключите сторонние фильтры и посмотрите чистое поведение WordPress.
Изображения перестали открываться
Такое случается, если вы случайно редиректите не attachment-страницы, а сами медиафайлы. Не путайте permalink вложения и прямой URL файла из wp_get_attachment_url(). Файл в uploads должен оставаться доступным.
SEO-плагин ставит noindex, но страницы не исчезают из индекса
Это нормальная ситуация: noindex не удаляет URL мгновенно. Если страницы уже проиндексированы, обычно нужен редирект или возврат 404/410 в зависимости от сценария. Для вложений редирект на родительскую запись обычно безопаснее.
Практические советы по безопасности и производительности
Если вы вносите код вручную, не правьте основной файл темы на живом сайте. Используйте дочернюю тему или отдельный мини-плагин. Так вы не потеряете изменения при обновлении и не сломаете сайт из-за случайной ошибки в шаблоне.
Для сайтов с большим количеством медиа полезно ещё и сократить количество бесполезных URL на уровне генерации ссылок. Чем меньше внутренних ссылок ведёт на attachment-страницы, тем меньше мусора попадает в логи, отчёты и индекс.
- не ставьте редирект на все вложения без проверки родителя;
- не закрывайте сами файлы изображений, если они используются в контенте или CDN;
- после внедрения обязательно проверьте мобильную версию и страницы с галереями;
- если сайт многоязычный, проверьте, не генерируются ли attachment-URL в каждой локали отдельно.
Если нужен более широкий технический аудит дублей и мусорных URL, иногда удобнее сначала пройтись по сайту инструментом вроде Clearfy Pro, а уже потом точечно добивать attachment-страницы кодом. Но даже в этом случае редирект на уровне WordPress остаётся самым предсказуемым вариантом для контроля поведения.