Как найти и удалить дубли из-за attachment-страниц в WordPress

Attachment-страницы в WordPress часто остаются незаметными до тех пор, пока в индексе не появляются десятки или сотни URL с вложениями. На небольшом сайте это выглядит как мелкая техническая проблема, но на проектах с активной загрузкой изображений такие страницы быстро превращаются в источник дублей, пустых страниц и лишней нагрузки на обход поисковыми роботами.

Проблема обычно не в самих файлах изображений, а в том, что WordPress создаёт отдельную страницу вложения для каждого медиафайла. Если тема или плагин выводят на неё контент, а canonical и редиректы не настроены, поисковик начинает воспринимать attachment URL как самостоятельные страницы.

Как понять, что проблема именно в attachment-страницах

Сначала стоит проверить, есть ли у вас в индексе URL вида /attachment/, ?attachment_id= или страницы вложений с заголовками, похожими на названия изображений. В Search Console это обычно видно в отчётах по страницам, а в логах обхода — по частым заходам на медиа-URL без полезного контента.

Ещё один признак — когда в выдаче появляются страницы с тонким содержимым: одна картинка, короткая подпись и ссылка назад на запись. Такие страницы редко нужны сами по себе, но WordPress создаёт их по умолчанию.

Быстрая диагностика в админке и через поиск по сайту

  • Откройте несколько изображений в медиатеке и проверьте, ведёт ли кнопка просмотра на отдельную страницу вложения.
  • Посмотрите исходный код страницы вложения: есть ли там rel="canonical" и куда он указывает.
  • Проверьте, не индексируются ли attachment URL через site:example.com attachment в поиске.
  • Если используете SEO-плагин, проверьте его настройки для медиа-страниц и редиректов вложений.

Что делать: отключить attachment-страницы и перенаправить их на файл или родительскую запись

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

Если у вас уже есть SEO-плагин, сначала проверьте его возможности. Например, в некоторых конфигурациях Clearfy Pro можно закрывать технические дубли и управлять лишними страницами без ручного кода. Но если нужен точечный контроль, лучше сделать это в теме или небольшом mu-plugin.

Вариант 1: редирект attachment-страниц на родительскую запись

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

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

    $parent_id = wp_get_post_parent_id(get_the_ID());

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

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

Логика простая: если у вложения есть родительская запись, отправляем пользователя туда. Если родителя нет, уводим на главную или на другой релевантный раздел. Главное — не оставлять attachment-страницу открытой для индексации без смысла.

Вариант 2: редирект attachment-страниц прямо на файл

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

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

    $url = wp_get_attachment_url(get_the_ID());

    if ($url) {
        wp_safe_redirect($url, 301);
        exit;
    }

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

Здесь есть важный нюанс: если файл удалён или URL пустой, нужен запасной маршрут. Иначе пользователь и робот могут попасть на ошибку или зацикленный редирект.

Когда лучше не редиректить, а закрыть от индексации

Иногда attachment-страницы нужны для внутренней навигации, но вы не хотите видеть их в поиске. В этом случае можно оставить страницу доступной пользователю, но убрать её из индексации через meta robots. Это слабее, чем редирект, но подходит для проектов, где нельзя ломать старые ссылки сразу.

Однако важно понимать разницу: noindex не убирает дубль как URL, он только просит поисковик не включать страницу в выдачу. Если attachment-страниц много, редирект обычно практичнее.

Добавить noindex для attachment-страниц

add_filter('wp_robots', function ($robots) {
    if (is_attachment()) {
        $robots['noindex'] = true;
        $robots['follow'] = true;
    }

    return $robots;
});

Этот вариант полезен как временная мера или как часть более мягкой миграции. Но если цель — именно убрать дубли, лучше всё же настроить 301-редирект.

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

  1. Сделайте резервную копию базы и файлов.
  2. Проверьте, сколько attachment-URL уже есть в индексе и в логах обхода.
  3. Выберите стратегию: редирект на родителя, редирект на файл или noindex.
  4. Добавьте код в дочернюю тему или mu-plugin, а не в основной плагин, который может отключаться.
  5. Очистите кеш сайта и CDN, если они используются.
  6. Проверьте несколько attachment-страниц вручную и через HTTP-ответ.

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

Проверка должна быть не только визуальной. Важно убедиться, что сервер отдаёт правильный статус и что поисковик не видит старую структуру как отдельные страницы.

  • Откройте attachment URL в браузере и убедитесь, что происходит 301-редирект.
  • Проверьте заголовки ответа через curl -I https://example.com/attachment-page/.
  • Убедитесь, что конечный URL не создаёт новый дубль.
  • Посмотрите, исчезли ли attachment-страницы из отчётов Search Console после переобхода.
  • Проверьте, не осталось ли внутренних ссылок на старые attachment URL в шаблонах и контенте.
curl -I https://example.com/sample-attachment/

Если всё настроено правильно, вы увидите 301 Moved Permanently и новый адрес в заголовке Location. Если вместо этого остаётся 200 OK, значит редирект не сработал или код подключён не в том месте.

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

Редирект зацикливается

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

После отключения attachment-страниц ломаются старые ссылки

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

Появляется много 404 на изображения

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

SEO-плагин и код делают одно и то же

Если плагин уже ставит canonical или редиректит вложения, ваш код может конфликтовать с ним. Оставьте только один механизм управления, иначе получите непредсказуемое поведение.

Что учесть по безопасности и производительности

Attachment-страницы сами по себе не опасны, но их массовое наличие увеличивает число URL, которые нужно обходить, кешировать и анализировать. На больших сайтах это лишняя нагрузка без пользы. Чем раньше вы уберёте такие дубли, тем чище будет структура сайта.

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

ПодходКогда подходитМинус
301 на родительскую записьЕсть связанный контент и важна логика навигацииНе подходит для медиа без родителя
301 на файлНужен только сам ресурс изображенияСтраница вложения полностью исчезает
noindexНужна мягкая миграция без резкого удаленияДубль остаётся доступным по URL

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

⭐⭐⭐⭐⭐