Attachment-страницы в WordPress часто остаются незаметными до тех пор, пока в Search Console не появляются URL с тонким или пустым содержимым. Это не всегда критичная проблема, но на небольших и средних сайтах такие страницы легко превращаются в источник дублей, лишних обходов и мусора в отчётах по индексации.
Ниже — рабочая схема: сначала проверяем, действительно ли attachment-страницы попали в индекс и откуда они берутся, затем отключаем их для поисковиков и убираем из XML sitemap. Без лишних изменений в медиа-библиотеке и без поломки ссылок на сами файлы.
Когда attachment-страницы становятся проблемой
В WordPress у каждого вложения может быть собственная страница-обёртка. Если тема или плагин не переопределяют поведение по умолчанию, поисковик видит отдельный URL для изображения, PDF или другого файла. На практике это выглядит так:
- в индексе появляются URL вида
/attachment/...или страницы вложений с другим слагом; - в sitemap попадают URL, которые не несут самостоятельной ценности;
- в отчётах по дублям и «страницам с альтернативным каноническим URL» растёт шум;
- часть обхода уходит на служебные страницы вместо полезного контента.
Если у вас медиа-страницы реально используются как посадочные — например, для фотогалерей с уникальным текстом — отключать их вслепую не стоит. Но для большинства контентных сайтов attachment-страницы не нужны в поиске.
Диагностика: как понять, что проблема именно в attachment-страницах
Начните с проверки нескольких признаков. Это занимает немного времени и помогает не лечить несуществующую проблему.
Что проверить в первую очередь
- Откройте несколько URL вложений из медиа-библиотеки и посмотрите, есть ли на них отдельная страница, а не просто файл.
- Проверьте исходный код: есть ли
noindex, какойcanonicalуказан, не ведёт ли он на саму attachment-страницу. - Посмотрите XML sitemap: встречаются ли там URL вложений.
- В Search Console поищите URL с путями к медиа-файлам или страницам вложений.
Если sitemap уже чистый, а в индексе всё равно есть attachment-страницы, значит, проблема чаще всего в старых ссылках, внутренних переходах или отсутствии явного запрета на индексацию.
Что лучше: плагин, код или оба варианта
Для этой задачи есть три рабочих подхода. Выбор зависит от того, насколько у вас управляемая установка WordPress.
| Подход | Плюсы | Минусы |
|---|---|---|
| Плагин для SEO/чистки | Быстро, без кода, удобно для редакторов | Зависимость от настроек и лишний функционал |
| Код в теме или mu-plugin | Точно контролируете поведение, минимум лишнего | Нужен доступ к коду и базовая дисциплина при обновлениях |
| Плагин + код | Можно закрыть и sitemap, и canonical, и редирект | Важно не задублировать логику |
Если у вас уже используется решение вроде Clearfy Pro, часть настроек можно закрыть через интерфейс. Но если нужна предсказуемость и переносимость между проектами, лучше зафиксировать поведение кодом.
Пошаговое решение через код
Ниже вариант, который делает три вещи: запрещает индексацию attachment-страниц, ставит canonical на родительскую запись или на главную, если родителя нет, и убирает вложения из XML sitemap.
Код можно добавить в functions.php дочерней темы, но для постоянного решения безопаснее вынести его в небольшой mu-plugin.
<?php
/**
* Disable attachment pages from indexing and sitemap.
*/
add_action( 'wp_head', function () {
if ( is_attachment() ) {
echo '<meta name="robots" content="noindex,follow" />' . "\n";
}
}, 1 );
add_filter( 'wp_get_attachment_link', function ( $html, $id, $size, $permalink, $icon, $text ) {
return $html;
}, 10, 6 );
add_filter( 'wpseo_canonical', function ( $canonical ) {
if ( is_attachment() ) {
$parent_id = wp_get_post_parent_id( get_queried_object_id() );
if ( $parent_id ) {
return get_permalink( $parent_id );
}
return home_url( '/' );
}
return $canonical;
} );
add_filter( 'wp_sitemaps_post_types', function ( $post_types ) {
if ( isset( $post_types['attachment'] ) ) {
unset( $post_types['attachment'] );
}
return $post_types;
} );
Здесь есть важный нюанс: фильтр wpseo_canonical работает только если у вас установлен Yoast SEO. Если его нет, этот кусок просто не даст эффекта. Для сайтов без Yoast лучше использовать отдельный canonical-фильтр вашей SEO-системы или ограничиться noindex и исключением из sitemap.
Если Yoast SEO не используется
Можно обойтись без привязки к конкретному SEO-плагину и задать canonical через wp_head. Это менее изящно, но работает предсказуемо.
<?php
add_action( 'wp_head', function () {
if ( is_attachment() ) {
$parent_id = wp_get_post_parent_id( get_queried_object_id() );
$canonical = $parent_id ? get_permalink( $parent_id ) : home_url( '/' );
echo '<link rel="canonical" href="' . esc_url( $canonical ) . '" />' . "\n";
echo '<meta name="robots" content="noindex,follow" />' . "\n";
}
}, 1 );
Такой вариант не требует внешних зависимостей. Но если у вас уже есть SEO-плагин, проверьте, не выводит ли он свой canonical параллельно. Два canonical на странице — типичная ошибка.
Как убрать attachment-страницы из sitemap без побочных эффектов
В WordPress 5.5+ есть встроенные XML sitemap. Если attachment-страницы туда попадают, их можно исключить через фильтр wp_sitemaps_post_types. Это безопаснее, чем править XML вручную или закрывать весь медиа-контент в robots.txt.
Почему не robots.txt? Потому что запрет в robots.txt не убирает URL из индекса, если на него уже есть ссылки. Для служебных страниц лучше использовать noindex и canonical, а не только блокировку обхода.
Проверка результата после внедрения
После изменений не ограничивайтесь визуальной проверкой страницы. Нужно убедиться, что поисковик видит именно то, что вы задумали.
- Откройте несколько attachment-URL в браузере и проверьте исходный код.
- Убедитесь, что на странице есть
meta name="robots" content="noindex,follow". - Проверьте, что canonical ведёт на родительскую запись или главную, если родителя нет.
- Откройте XML sitemap и убедитесь, что attachment-URL там отсутствуют.
- В Search Console отправьте проверку URL и посмотрите, как робот интерпретирует страницу после переобхода.
Если сайт использует кэш страницы или CDN, не забудьте очистить кэш после правок. Иначе вы будете проверять старую версию HTML и решите, что код не сработал.
Частые ошибки и как их исправить
Оставили только robots.txt
Это самая частая недоработка. Если URL уже известен поисковику, один лишь Disallow не гарантирует его исчезновение из индекса. Добавьте noindex на саму страницу и уберите URL из sitemap.
Поставили два canonical
Так бывает, когда SEO-плагин уже выводит canonical, а вы добавили ещё один вручную. В результате поисковик получает конфликтующие сигналы. Оставьте один источник canonical-логики.
Сломали ссылки на файлы
Иногда путают attachment-страницу и сам файл. Отключать индексацию страницы вложения можно, но URL самого изображения или PDF должен продолжать открываться, если он используется в контенте или для загрузки.
Закрыли всё через noindex, но не убрали из sitemap
Это не критично, но лишний шум остаётся. Sitemap должен содержать только те URL, которые вы реально хотите продвигать и индексировать.
Практические советы по безопасности и производительности
Если вы вносите код в тему, не правьте родительскую тему напрямую. После обновления изменения исчезнут. Для таких задач лучше использовать дочернюю тему или mu-plugin.
Ещё один полезный момент: не ставьте несколько SEO-плагинов одновременно «на всякий случай». Они часто конфликтуют именно на уровне canonical, robots и sitemap. Для чистки дублей и технической оптимизации удобнее держать один основной SEO-инструмент и точечные доработки кодом.
Если вам нужен более широкий набор инструментов для чистки дублей, скрытия служебных страниц и технической настройки сайта, посмотрите Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином всё равно стоит проверить итоговый HTML и sitemap вручную.
Когда лучше не отключать attachment-страницы
Есть сценарии, где медиа-страницы могут быть полезны: фотоблоги, каталоги изображений, архивы документов с отдельными описаниями. В таких проектах лучше не рубить всё под одну схему, а отдельно решить, какие типы вложений должны индексироваться, а какие — нет.
Если сомневаетесь, начните с выборочного отключения: сначала закройте изображения без уникального текста, потом проверьте статистику обхода и только после этого принимайте решение по остальным вложениям.