Если в XML sitemap WordPress попадают attachment-страницы, поисковик получает лишние URL без самостоятельной ценности: отдельные страницы вложений, дубли изображений и пустые архивы. На небольшом сайте это выглядит как мелочь, но на контентном проекте такие URL быстро разрастаются и мешают нормальной индексации.
Сценарий типичный: вы включили SEO-плагин, загрузили много изображений, а в карте сайта появились URL вида /image-name/ или ?attachment_id=. Иногда они уже в индексе, иногда только в sitemap. Ниже — как понять, что именно у вас сломано, и как убрать дубли без побочных эффектов.
Что именно считать проблемой
Не каждая attachment-страница — ошибка сама по себе. Проблема начинается, когда:
- attachment URL попадает в XML sitemap и индексируется отдельно от основной записи;
- страница вложения не содержит полезного контента, а только изображение и заголовок;
- в sitemap есть десятки или сотни URL, которые не должны конкурировать с основными страницами;
- SEO-плагин и тема одновременно по-разному обрабатывают вложения, из-за чего появляются дубли.
Как быстро диагностировать
Проверка занимает несколько минут. Сначала откройте sitemap и найдите раздел с вложениями. Затем проверьте несколько URL вручную: что отдаёт страница, есть ли canonical, и не закрыта ли она от индексации.
- Откройте XML sitemap, который генерирует ваш SEO-плагин.
- Найдите ссылки на attachment-страницы или медиа-архивы.
- Откройте одну из таких страниц в браузере.
- Посмотрите исходный код: есть ли
noindex, canonical на вложение или на родительскую запись. - Проверьте в Search Console, не растёт ли число проиндексированных медиа-URL.
Если attachment-страницы уже в индексе, сначала исправляйте генерацию sitemap и мета-теги, а уже потом занимайтесь удалением из индекса через переобход. Иначе поисковик просто снова увидит те же URL.
Как убрать attachment-страницы из sitemap
Самый надёжный путь — исключить вложения на уровне SEO-плагина или кода, если плагин не даёт нужной настройки. Важно не путать отключение из sitemap с удалением медиафайлов из библиотеки WordPress. Файлы остаются на месте, меняется только участие их страниц в индексации.
Вариант 1: настройка в SEO-плагине
У большинства SEO-плагинов есть отдельная настройка для медиа-страниц или attachment URL. Если она есть, это предпочтительный вариант: меньше кода, меньше конфликтов после обновлений.
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройка в SEO-плагине | Если плагин умеет отключать attachment-страницы | Зависит от интерфейса и версии плагина |
| Код в теме или mu-plugin | Если нужна точечная и стабильная логика | Нужно следить за обновлениями и тестировать |
| Редирект attachment на родительскую запись | Если страницы уже в индексе и их надо убрать | Нужно аккуратно обработать вложения без родителя |
Вариант 2: исключение через код
Если вы хотите убрать attachment-страницы из sitemap независимо от SEO-плагина, можно использовать фильтр wp_sitemaps_posts_query_args. Он позволяет исключить тип записей attachment из генерации карты сайта WordPress.
<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'attachment' === $post_type ) {
$args['post__in'] = array( 0 );
}
return $args;
}, 10, 2 );Этот вариант работает только для встроенного sitemap WordPress. Если у вас sitemap генерирует SEO-плагин, нужно использовать его собственные настройки или фильтры. Не стоит смешивать два механизма без необходимости: потом сложно понять, кто именно исключил URL.
Вариант 3: редирект attachment-страниц на родительский контент
Если attachment-страницы уже доступны по отдельным URL, их обычно лучше перенаправить на родительскую запись или на сам файл изображения, если это оправдано. Для этого можно использовать шаблонный редирект в template_redirect.
<?php
add_action( 'template_redirect', function() {
if ( ! is_attachment() ) {
return;
}
global $post;
if ( $post && ! empty( $post->post_parent ) ) {
wp_safe_redirect( get_permalink( $post->post_parent ), 301 );
exit;
}
wp_safe_redirect( home_url( '/' ), 301 );
exit;
} );Это не заменяет настройку sitemap, но помогает убрать уже существующие дубли из индекса и не оставлять пустые страницы вложений доступными для обхода.
Пошаговое решение без лишнего риска
Если нужен рабочий порядок действий, я бы делал так:
- Проверил, какой именно sitemap используется: встроенный WordPress или SEO-плагин.
- Отключил attachment-страницы в настройках плагина, если такая опция есть.
- Если опции нет — исключил attachment из sitemap кодом или фильтром плагина.
- Настроил 301-редирект с attachment-страниц на родительский пост.
- Проверил canonical и robots meta на страницах вложений.
- Отправил sitemap на переобход в Search Console.
Если сайт большой, изменения лучше вносить сначала на staging-копии. Это особенно важно, если у вас есть кастомная тема, которая выводит attachment-страницы как отдельные карточки или галереи.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Нужны три уровня контроля: sitemap, HTTP-ответ и индексация.
- Откройте sitemap и убедитесь, что attachment-URL больше не присутствуют.
- Проверьте несколько старых attachment-страниц: они должны отдавать 301 на родительскую запись или другой целевой URL.
- Посмотрите исходный код: на attachment-странице не должно быть самоканоникализации на пустую медиа-страницу, если вы её убираете из индекса.
- В Search Console проверьте отчёт по страницам и убедитесь, что число медиа-URL не растёт.
Для быстрой проверки редиректа удобно использовать curl:
curl -I https://example.com/sample-image/В ответе ожидайте 301 и заголовок Location с целевым URL. Если видите 200, значит редирект не сработал или его перебивает другой плагин.
Частые ошибки и как их исправить
Отключили attachment в sitemap, но URL всё равно индексируются
Это значит, что страницы уже были в индексе и поисковик ещё не переобошёл сайт. Нужен редирект или noindex на самих attachment-страницах, а затем повторная отправка sitemap.
Редирект ведёт на главную
Так часто делают «на всякий случай», но это плохой вариант для вложений, у которых есть родительская запись. Лучше вести на родительский пост, иначе теряется контекст и растёт вероятность мягких 404 в логике сайта.
Сломались галереи или превью изображений
Обычно причина в том, что редирект поставили слишком агрессивно: он срабатывает даже там, где attachment-страница нужна для встроенной логики темы. Проверьте, не использует ли тема отдельные шаблоны для медиа-архивов.
SEO-плагин снова добавил вложения после обновления
Это бывает, если вы правили только шаблон sitemap вручную, а не настройки плагина. После обновления плагин пересобрал карту сайта по своим правилам. В таких случаях лучше использовать штатный фильтр или настройку, а не правку файлов плагина.
Практические советы по безопасности и производительности
Если у вас много медиафайлов, attachment-страницы могут создавать лишнюю нагрузку на обход и индексацию. Это не критично для маленького блога, но на контентных проектах и affiliate-сайтах лишние URL быстро засоряют карту сайта.
- Не редактируйте файлы SEO-плагина напрямую: обновление всё перетрёт.
- Если добавляете код, лучше вынести его в
mu-pluginили в дочернюю тему. - Проверяйте, не создаёт ли тема собственные архивы вложений или отдельные шаблоны для медиа.
- После изменений очистите кеш страницы, объектный кеш и CDN, если он есть.
Если вам нужно одновременно убрать дубли, технические архивы и мусорные URL из индекса, имеет смысл посмотреть на инструменты вроде Clearfy Pro: у него есть практичные настройки для чистки WordPress и отключения лишних сущностей. Ссылка без слеша: Clearfy Pro.
Когда лучше не трогать attachment-страницы кодом
Если на сайте attachment-страницы уже используются как полноценные посадочные страницы, например в нестандартной теме или в медиа-каталоге, простое отключение и редирект могут сломать логику. В такой ситуации сначала проверьте, кто именно ссылается на эти URL, есть ли на них трафик и не используются ли они в навигации.
Для обычного контентного сайта attachment-страницы почти всегда лишние. Для специализированного проекта с медиа-архивом решение может быть другим: иногда достаточно закрыть их от индексации, но оставить доступными для пользователей.