Как закрыть attachment-страницы из XML Sitemap в WordPress и убрать лишние URL из индексации

Если в Search Console всплывают лишние URL вида /attachment/ или медиа-страницы попадают в sitemap, проблема обычно не в самом изображении, а в том, что WordPress и SEO-плагин по-разному трактуют attachment-страницы. В итоге поисковик видит отдельные страницы без полезного контента, а сайт получает дубли и мусор в индексе.

Ниже — рабочий сценарий: сначала быстро диагностируем источник URL, затем отключаем их из sitemap и, если нужно, дополнительно закрываем сами attachment-страницы от индексации. Это разные задачи, и смешивать их не стоит.

Что именно ломается и как это увидеть

Attachment-страница в WordPress — это отдельный объект записи с собственным URL. Когда к записи прикреплено изображение, WordPress может отдавать для него отдельную страницу вложения. Если SEO-плагин включает такие URL в XML Sitemap, поисковик получает сигнал, что это полноценные страницы сайта.

Проверка занимает пару минут:

  • откройте XML Sitemap и найдите раздел с изображениями или вложениями;
  • проверьте, есть ли в sitemap URL, похожие на /attachment/ или страницы медиафайлов;
  • в Search Console откройте отчёт по индексированию и посмотрите, не индексируются ли attachment-URL;
  • сравните канонический URL на attachment-странице: часто он указывает либо на саму attachment-страницу, либо на вложение без пользы для пользователя.

Если сайт уже давно живёт с этой настройкой, в индексе могут быть десятки или сотни таких страниц. В этом случае важно не только убрать их из sitemap, но и корректно отдать noindex или редирект, чтобы поисковик постепенно вычистил старые URL.

Сначала выберите подход: плагин, код или редирект

Для большинства сайтов достаточно настроек SEO-плагина. Код нужен, если вы хотите жёстко контролировать поведение независимо от темы и плагинов. Редирект полезен, когда attachment-страницы уже попали в индекс и вы хотите перевести их на родительскую запись или медиафайл.

ПодходКогда использоватьПлюсыМинусы
Настройки SEO-плагинаЕсли sitemap генерирует Yoast, Rank Math или аналогБыстро, без кодаЗависит от конкретного плагина
Код в теме или mu-pluginЕсли нужен контроль на уровне проектаПредсказуемо, переносимоНужно тестировать после обновлений
Редирект attachment URLЕсли страницы уже индексировалисьСнижает мусор в индексеНужно аккуратно выбрать целевой URL

Пошаговое решение без лишних рисков

1. Уберите attachment из sitemap

Если у вас Yoast SEO, проверьте настройки медиа и XML Sitemap. В некоторых конфигурациях attachment-страницы можно отключить через сам плагин. Если такой опции нет или она не закрывает задачу полностью, проще добавить фильтр.

Для Yoast SEO можно исключить attachment-тип из sitemap через фильтр wpseo_sitemap_exclude_post_type:

<?php
add_filter( 'wpseo_sitemap_exclude_post_type', function( $exclude, $post_type ) {
    if ( 'attachment' === $post_type ) {
        return true;
    }

    return $exclude;
}, 10, 2 );

Этот код лучше размещать в небольшом mu-plugin, а не в functions.php активной темы. Так вы не потеряете настройку при смене темы.

Если используется не Yoast, а другой SEO-плагин, логика та же: ищите его фильтр или опцию отключения attachment-URL из sitemap. Важно не выдумывать универсальный хук — у каждого плагина он свой.

2. Закройте attachment-страницы от индексации

Исключение из sitemap не всегда достаточно. Если URL уже известны поисковику, они могут оставаться в индексе до следующего обхода. Поэтому полезно дополнительно поставить noindex для attachment-страниц.

Для WordPress это можно сделать через wp_robots:

<?php
add_filter( 'wp_robots', function( array $robots ) {
    if ( is_attachment() ) {
        $robots['noindex']  = true;
        $robots['nofollow'] = true;
    }

    return $robots;
} );

Это не ломает загрузку изображений в контенте: файл по-прежнему доступен, но сама attachment-страница получает сигнал не индексироваться.

3. Если нужно, сделайте редирект на родительскую запись

Когда attachment-страницы уже засорили индекс, часто удобнее отправлять пользователя и робота на родительский пост. Это особенно полезно для сайтов, где медиа-страницы не несут самостоятельной ценности.

<?php
add_action( 'template_redirect', function() {
    if ( ! is_attachment() ) {
        return;
    }

    $parent_id = wp_get_post_parent_id( get_queried_object_id() );

    if ( $parent_id ) {
        wp_safe_redirect( get_permalink( $parent_id ), 301 );
        exit;
    }

    wp_safe_redirect( home_url( '/' ), 301 );
    exit;
} );

Здесь есть важная оговорка: если attachment-страницы у вас используются как отдельные посадочные страницы, редирект делать нельзя. Тогда ограничьтесь noindex и исключением из sitemap.

Как проверить, что всё сработало

После внедрения не полагайтесь на визуальную проверку в админке. Нужны три конкретных теста:

  1. Откройте sitemap и убедитесь, что attachment-URL больше не присутствуют.
  2. Проверьте исходный код attachment-страницы: в <meta name="robots"> или в HTTP-ответе должен быть noindex, если вы его добавляли.
  3. Попробуйте открыть старый attachment-URL напрямую: если настроен редирект, он должен вести на родительскую запись или на главную.

Если у вас есть доступ к Search Console, отправьте sitemap на повторную обработку и посмотрите, как меняется статус URL через несколько обходов. Мгновенного эффекта не будет, и это нормально.

Частые ошибки и как их исправить

Отключили sitemap, но страницы всё равно индексируются

Это типичная ситуация. Sitemap — только подсказка для робота, а не запрет. Если attachment-страницы уже где-то найдены, они могут остаться в индексе. Решение: добавить noindex и, при необходимости, редирект.

Сделали 301 на главную для всех attachment-URL

Такой редирект выглядит просто, но часто ухудшает качество перехода. Если у вложения есть родительская запись, логичнее вести туда. На главную отправляйте только те attachment-страницы, у которых нет нормального родителя.

Поставили редирект и забыли про медиа в письмах, соцсетях и старых ссылках

Если attachment-URL уже использовались вне сайта, массовый редирект может быть оправдан. Но сначала проверьте логи и трафик: иногда на медиа-страницы реально заходят пользователи из старых публикаций. В таком случае лучше закрыть их от индексации, но не ломать доступ.

Добавили код в тему и потеряли его после обновления

Это не ошибка логики, а ошибка размещения. Для таких задач удобнее использовать mu-plugin или отдельный мини-плагин. Тогда настройка не исчезнет при смене темы и не зависит от редактора файлов в админке.

Чек-лист перед публикацией изменений

  • Проверен источник attachment-URL в sitemap.
  • Добавлен фильтр на исключение attachment из sitemap.
  • Настроен noindex для attachment-страниц, если они уже были в индексе.
  • Редирект включён только там, где он действительно нужен.
  • Проверены старые URL вручную и через Search Console.
  • Код вынесен в mu-plugin или отдельный плагин, а не в активную тему.

Практические замечания по безопасности и производительности

Сам по себе запрет attachment-страниц не ускоряет сайт заметно, но он уменьшает количество лишних URL, которые поисковик должен обходить. Это полезно для крупных сайтов с большим количеством изображений и вложений.

Если вы правите код вручную, не используйте редактор файлов в админке на боевом сайте. Лучше загрузить изменения через Git, SFTP или отдельный deployment-процесс. И обязательно проверьте, что фильтр не конфликтует с SEO-плагином: иногда один плагин ставит noindex, а другой переопределяет robots-теги.

Если нужен более широкий контроль над дублями, каноникалами и технической чисткой сайта, в экосистеме WPShop есть Clearfy Pro: https://wpshop.ru/plugins/clearfy?utm_source=wpfind.ru&utm_medium=article&utm_campaign=zakryt-xml-sitemap-attachment-v-wordpress. Но даже с плагином полезно понимать, какие именно URL вы закрываете и почему.

В итоге рабочая схема обычно выглядит так: убрать attachment из sitemap, закрыть их от индексации и только потом решать, нужен ли редирект. Такой порядок безопаснее, чем сразу массово перенаправлять всё подряд.

Сайт в разработке, скоро здесь будет портал о WordPress.