Attachment-страницы — частая причина мусора в индексе: у изображения есть отдельный URL, но саму страницу с вложением обычно никто не читает. Проблема не в файлах медиа, а в том, что WordPress по умолчанию может отдавать отдельные страницы вложений с тонким контентом или вовсе без полезного текста. Если у сайта много изображений, такие URL быстро превращаются в источник дублей и лишних обходов поисковыми роботами.
Ниже разберём рабочий сценарий: как отключить attachment-страницы, куда перенаправлять старые URL и как проверить, что редирект не ломает медиа и не создаёт цепочки.
Когда attachment-страницы становятся проблемой
Сама по себе страница вложения не всегда вредна. Но на практике она мешает, если:
- в индексе уже есть сотни или тысячи URL вида
/image-name/; - на attachment-страницах нет уникального текста, только картинка и заголовок;
- в поиске всплывают страницы вложений вместо нормальных записей;
- плагин SEO или тема создают canonical не туда, куда нужно;
- после миграции сайта остались старые attachment-URL со статусом 200.
Диагностика простая: откройте несколько URL вложений вручную и посмотрите, что отдаёт сервер. Если это отдельная страница с изображением и минимальной обвязкой, а не редирект, значит проблема есть. Дополнительно проверьте отчёты в Search Console по страницам с низкой ценностью и поисковый оператор site:example.com inurl:attachment — он быстро показывает масштаб.
Что лучше: редирект, noindex или удаление шаблона
Для attachment-страниц есть три основных подхода. У каждого свой компромисс.
| Подход | Когда подходит | Плюс | Минус |
|---|---|---|---|
| Редирект на файл или родительскую запись | Почти всегда | Убирает мусорный URL из обхода и индекса | Нужно аккуратно выбрать цель редиректа |
noindex | Если URL должен открываться, но не индексироваться | Мягкий вариант без изменения поведения страницы | URL остаётся доступным и может обходиться роботами |
| Удаление шаблона attachment | Если вы точно не используете отдельные страницы вложений | Чистый результат | Можно сломать старые ссылки и навигацию по медиа |
На практике чаще всего выбирают редирект. Он понятнее для поисковиков и не оставляет в индексе пустую страницу. Если у вас есть старые ссылки на attachment-URL, редирект ещё и спасает пользователей от 404.
Пошаговое решение через код
1. Перенаправить attachment-страницы на файл или родительскую запись
Самый безопасный вариант — отправлять attachment-страницу либо на сам файл изображения, либо на родительский пост, если он есть. Для этого можно использовать хук template_redirect.
<?php
add_action( 'template_redirect', function () {
if ( ! is_attachment() ) {
return;
}
global $post;
if ( ! $post ) {
wp_safe_redirect( home_url( '/' ), 301 );
exit;
}
$parent_id = $post->post_parent;
if ( $parent_id ) {
$parent_url = get_permalink( $parent_id );
if ( $parent_url ) {
wp_safe_redirect( $parent_url, 301 );
exit;
}
}
$file_url = wp_get_attachment_url( $post->ID );
if ( $file_url ) {
wp_safe_redirect( $file_url, 301 );
exit;
}
wp_safe_redirect( home_url( '/' ), 301 );
exit;
} );Логика здесь простая: сначала пробуем родительскую запись, потом сам файл, потом главную страницу как запасной вариант. Это лучше, чем отправлять все attachment-URL в одну точку без разбора.
2. Отключить индексирование через wp_robots
Если по какой-то причине вы не хотите делать редирект, можно хотя бы закрыть attachment-страницы от индексации. Это не убирает URL из обхода, но снижает риск появления страницы в поиске.
<?php
add_filter( 'wp_robots', function( array $robots ) {
if ( is_attachment() ) {
$robots['noindex'] = true;
$robots['nofollow'] = true;
}
return $robots;
} );Этот вариант полезен как временная мера, но не как финальное решение для большого сайта. Если attachment-страницы уже в индексе, редирект обычно работает лучше.
3. Убрать ссылку на attachment-страницу из медиа-вставок
Иногда проблема создаётся не только самим URL, но и тем, что WordPress в медиабиблиотеке отдаёт ссылку на attachment-страницу вместо файла. Это можно поправить фильтром attachment_link.
<?php
add_filter( 'attachment_link', function( $link, $post_id ) {
$file_url = wp_get_attachment_url( $post_id );
return $file_url ? $file_url : $link;
}, 10, 2 );Так вы снижаете шанс, что тема или старый контент продолжат вести пользователей на отдельные страницы вложений.
Если нужен плагин, а не код
Если вы не хотите держать это в теме или mu-plugin, можно использовать SEO-плагин с настройками редиректов и индексации. Но важно смотреть не на название функции в интерфейсе, а на фактическое поведение: создаёт ли плагин 301-редирект, ставит ли noindex и не оставляет ли цепочку через промежуточный URL.
Из практики удобнее всего сначала проверить, умеет ли плагин:
- редиректить attachment-страницы на родительскую запись;
- не трогать сами файлы в
/uploads/; - не создавать 302 вместо 301;
- не ломать Open Graph и превью изображений.
Если плагин делает только noindex, это не всегда достаточно. Для уже проиндексированных страниц лучше именно редирект.
Как проверить, что решение сработало
Проверка должна быть не визуальной, а технической. Смотрите три вещи: код ответа, целевой URL и наличие индексации.
- Откройте старый attachment-URL в браузере или через
curl -I. - Убедитесь, что сервер отдаёт
301 Moved Permanently, а не200 OKили302 Found. - Проверьте, что редирект ведёт на нужную запись или файл, а не на главную без причины.
- Посмотрите исходный код целевой страницы: не должно быть лишнего
noindexна нормальных записях. - Через несколько дней проверьте Search Console: старые attachment-URL должны уходить из отчётов по страницам с проблемами.
Пример быстрой проверки из консоли:
curl -I https://example.com/sample-image/Если вместо редиректа вы видите 200, значит код не сработал или его перебивает другой плагин/тема.
Частые ошибки и как их исправить
Редирект сделан на главную для всех вложений
Такой вариант кажется простым, но он часто ухудшает качество сигнала. Пользователь и робот попадают не туда, куда ожидали. Лучше отправлять на родительскую запись, а если её нет — на сам файл изображения.
Используется 302 вместо 301
Временный редирект не подходит для постоянной чистки индекса. Если URL больше не должен жить как отдельная страница, нужен 301.
Путают attachment-страницу и файл в /uploads/
Удалять или закрывать нужно именно страницу вложения, а не сам медиафайл. Иначе изображения перестанут открываться в контенте, галереях и соцсетях.
Редирект конфликтует с SEO-плагином
Если SEO-плагин уже ставит canonical или noindex на attachment-страницы, ваш код может работать частично. В таком случае оставьте один источник логики: либо плагин, либо собственный код. Два механизма одновременно часто создают путаницу.
Ставят noindex и ждут, что URL исчезнет сразу
noindex не удаляет страницу из индекса мгновенно. Если URL уже в поиске, быстрее помогает 301-редирект и последующая переобходка.
Практические советы по безопасности и производительности
Если вы вносите код, не правьте functions.php на живой теме без бэкапа. Для таких задач удобнее использовать небольшой mu-plugin или собственный мини-плагин: код не потеряется при обновлении темы и проще отключается при конфликте.
Ещё два момента, которые часто забывают:
- не делайте редирект через PHP без проверки
is_attachment(), иначе можно случайно затронуть другие типы страниц; - не используйте внешние URL для редиректа, если это не осознанная миграция: так проще получить открытый редирект и проблемы с безопасностью.
Если на сайте много технических дублей, имеет смысл смотреть на чистку в комплексе: attachment-страницы, архивы, параметры URL, страницы поиска и служебные шаблоны. Для этого иногда удобнее подключать инструменты вроде Clearfy Pro, если нужен именно набор точечных SEO- и cleanup-настроек без ручного кода. Но даже с плагином полезно понимать, какой именно URL он меняет и какой код ответа получает робот.
Что делать после внедрения
Когда редирект уже работает, не останавливайтесь на одном URL. Возьмите 10–20 старых attachment-страниц из логов, Search Console или карты сайта и проверьте их вручную. Если часть из них отдаёт 404, значит в базе есть старые ссылки, которые не покрываются текущей логикой. Если часть ведёт на неправильные записи, значит у вложений сломан post_parent или тема подменяет ссылку.
В нормальной схеме после внедрения у вас остаётся только файл изображения в /uploads/, а отдельная attachment-страница либо редиректит, либо закрыта от индексации. Это и есть тот случай, когда техническая чистка реально упрощает жизнь и вам, и поисковику.