Как убрать дубли страниц WordPress из-за attachment-URL изображений

Если в поиске начали появляться отдельные страницы изображений вида /image-name/ или ?attachment_id=123, это почти всегда страницы вложений WordPress. Они создаются автоматически для каждого загруженного файла и часто дублируют основной контент: на них нет полезного текста, а в индексе они только раздувают количество страниц и мешают нормальной оценке сайта поисковиками.

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

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

У WordPress у каждого загруженного изображения может быть отдельная страница вложения. Она открывается по своему адресу и часто выглядит как тонкая страница с одним изображением, без полезного текста и без нормальной навигации. Если тема или плагин не отключают такие страницы, поисковик может их индексировать.

Проверить это можно несколькими способами:

  • в поиске по сайту или через оператор site:ваш-домен.ru найти URL с названием изображения;
  • в Google Search Console посмотреть, какие страницы попали в индекс и имеют типичные признаки вложений;
  • открыть изображение в медиатеке WordPress и проверить ссылку на страницу вложения;
  • посмотреть структуру URL: часто это короткий адрес с названием файла или параметром attachment_id.

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

Что лучше: закрыть от индексации или сделать редирект

Для большинства сайтов правильнее не оставлять attachment-страницы доступными как отдельные страницы. Но способ зависит от ситуации.

СценарийЧто делатьКогда подходит
Страницы вложений не нужны вообщеСделать 301-редиректПочти всегда, если на них нет трафика и ссылок
Нужно сохранить URL, но не индексироватьДобавить noindexЕсли по каким-то причинам редирект нежелателен
Есть старые ссылки и уже накоплен трафикСначала проверить статистику, затем редиректЕсли attachment-страницы уже живут в поиске

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

Самый надёжный способ: перенаправить страницы вложений

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

В WordPress это можно сделать кодом в functions.php дочерней темы или через небольшой mu-plugin. Перед изменениями сделайте резервную копию: ошибка в коде может временно сломать сайт или вызвать белый экран.

Ниже рабочий вариант, который отправляет посетителя со страницы вложения на URL самого файла:

add_action( 'template_redirect', function () {
    if ( is_attachment() ) {
        $url = wp_get_attachment_url( get_queried_object_id() );

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

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

Что здесь важно:

  • is_attachment() срабатывает только на страницах вложений;
  • wp_get_attachment_url() получает прямую ссылку на файл;
  • wp_redirect(..., 301) делает постоянный редирект, который поисковики понимают как замену старого URL новым;
  • exit нужен, чтобы WordPress не продолжал рендерить страницу после редиректа.

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

add_action( 'template_redirect', function () {
    if ( is_attachment() ) {
        $parent_id = wp_get_post_parent_id( get_queried_object_id() );

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

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

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

Когда достаточно закрыть attachment-страницы от индексации

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

Самый простой путь — добавить noindex для attachment-страниц через SEO-плагин, если он это умеет. Важно, чтобы тег noindex стоял именно на страницах вложений, а не на всех медиафайлах подряд.

Если вы настраиваете это вручную, можно вывести мета-тег в <head> для attachment-страниц:

add_action( 'wp_head', function () {
    if ( is_attachment() ) {
        echo '<meta name="robots" content="noindex,follow">' . "\n";
    }
} );

Здесь follow оставляет поисковику возможность переходить по ссылкам на странице, но сама страница не должна попадать в индекс. Для attachment-URL это обычно достаточно, если редирект по каким-то причинам не подходит.

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

Как найти все такие URL на сайте

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

Практически это делается так:

  1. Откройте Google Search Console и посмотрите отчёт по страницам, которые проиндексированы или исключены.
  2. Ищите URL с признаками вложений: название файла изображения, короткий адрес без полноценного текста, параметры attachment_id.
  3. Проверьте внутренний поиск по сайту и результаты site:домен в поисковике.
  4. Если у вас есть доступ к серверным логам или аналитике, посмотрите, есть ли переходы на такие адреса из поиска.

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

Что проверить после настройки

После редиректа или noindex важно убедиться, что всё работает именно так, как задумано.

  • Откройте несколько attachment-URL в браузере и проверьте, куда они ведут.
  • Убедитесь, что код ответа действительно 301, а не 302 или ошибка сервера.
  • Если вы поставили noindex, посмотрите исходный код страницы и проверьте наличие мета-тега robots.
  • В Search Console отправьте URL на повторную проверку, если они уже были в индексе.

Для быстрой проверки редиректа удобно использовать инструменты разработчика браузера или любой HTTP-проверщик. Важно увидеть не только переход, но и именно постоянный редирект, иначе поисковик может продолжить считать старый URL отдельной страницей.

Ошибки, из-за которых дубли остаются

Частая причина, почему проблема не уходит, — редирект настроен только для части URL. Например, страницы вложений перенаправляются, а прямые ссылки на файлы или старые адреса с параметрами продолжают открываться отдельно. Ещё одна типичная ошибка — ставить noindex, но оставлять страницу доступной без редиректа и без очистки внутренних ссылок.

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

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

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

⭐⭐⭐⭐⭐