Дубли title и description в WordPress — как найти и убрать
Как понять, что дубли есть
Откройте Яндекс Вебмастер → Индексирование → Заголовки и описания. Там видны количество одинаковых title и description и группы страниц с одинаковыми значениями. При большом количестве дублей предупреждение также появляется в разделе Диагностика. В нашем кейсе было 970 дублей title в 60 группах и 936 дублей description в 50 группах. Самая большая группа — 614 URL с метками tag, order и code в адресе: это служебный мусор, а не контент.
Параллельно проверьте Google Search Console → Индексирование → Страницы: дубли часто совпадают с мусором, который Google просканировал и не взял в индекс. Само по себе количество дублей ничего не говорит о критичности: важно, какие URL дублируются, попадают ли они в поиск и создают ли лишнюю нагрузку на обход.
Не начинайте с удаления страниц. Сначала определите тип дубля: фильтр, пагинация, тег или мусор в sitemap. Удаление без переобхода и редиректов оставляет битые URL в индексе на месяцы.
4 причины дублей
1. Фасетные фильтры плодят сотни адресов
Фильтры по цене, цвету, размеру и производителю генерируют адреса вида ?filter=price-1000-5000 или /filter/color-red/. Каждый такой адрес отдает тот же листинг с тем же title — поисковик фиксирует дубль. На магазине фильтров было 136 адресов плюс сортировки и поиск — все с одинаковыми мета-тегами.
В WordPress то же самое делают фильтры WooCommerce и плагины faceted search: параметры ?filter_, ?min_price, ?orderby создают дубли карточек категорий. Отдельная беда — AJAX-фильтры, которые при прямом заходе отдают полную страницу.
2. Пагинация без self-canonical
Классика: страницы пагинации (/category/page/2/, /category/page/3/) либо вообще без canonical, либо с canonical на первую страницу. Если страницы пагинации не имеют корректного canonical, поисковику сложнее определить их назначение и взаимосвязь. Во втором — поисковик, скорее всего, исключит страницы 2+ из индекса как неосновные. Если ваша тема или плагин делает пагинацию через GET-параметр (например ?page=2), применяйте те же принципы к этим URL.
Рабочая схема: self-canonical для страниц 2, 3 и далее (rel="canonical" указывает на собственный URL страницы), а первая страница пагинации отдает 301 на чистый URL категории. Это заметно лучше, чем canonical всех страниц на первую, если страницы пагинации должны оставаться в поиске. В нашем кейсе пагинация шла через GET-параметр ?page=N (OpenCart): правка шаблонов категорий сделала 16 страниц снова доступными обходу.
3. Теги, поиск и служебные URL в индексе
Голые адреса вида ?tag=xxx без маршрута отдавали главную с кодом 200 — классический soft-404: страница вроде есть, а контента нет. Поисковик индексирует сотни таких «страниц» с одинаковым title главной. Сюда же — внутренний поиск ?s=, страницы сортировок и трекинговые параметры ?utm_.
4. Мусор в sitemap.xml
Sitemap содержал 825 URL вместо 270: каждый товар был прописан трижды (прямая ссылка, через категорию, через производителя), плюс категории с устаревшим префиксом. Поисковик получал подсказку индексировать дубли: sitemap помогает обнаруживать URL, но не гарантирует ни обход, ни индексацию. После чистки — один URL на товар и категории без лишнего префикса.
В WordPress за sitemap обычно отвечают Yoast SEO или Rank Math: проверьте, не включены ли там таксономии-пустышки, архивы авторов и типы записей, которых нет в меню. Лишний URL в sitemap сообщает поисковику, что вы считаете страницу основной, — это может способствовать дополнительному обходу таких URL.
Пошаговая чистка дублей
Порядок важен: сначала закрываем генерацию новых дублей, потом чистим sitemap, в конце — переобход в Вебмастере.
Шаг 1. Пагинация: self-canonical + 301 для /page/1/. Проверьте исходный код страниц /category/page/2/ и /category/page/3/: canonical должен указывать на саму страницу. В WordPress это настраивается в SEO-плагине, в кастомных темах — правится шаблон архива. URL первой страницы пагинации (/category/page/1/) должен отдавать 301 на чистый URL категории (/category/).
Шаг 2. Фильтры: noindex,follow — без Disallow для этих URL. Разделите стратегии: хотите noindex — URL доступен роботу, robots.txt его не блокирует. Если URL закрыт в robots.txt, робот не сможет зайти на страницу и прочитать ее noindex, поэтому такая директива не сработает. Хотите полностью запретить обход технического мусора — используйте Disallow, но тогда noindex там не сработает. Для фильтров нужен мета-тег robots на самих страницах. Рабочий вариант — условие в header.php темы:
<?php if (isset($_GET['filter']) || isset($_GET['orderby'])
|| isset($_GET['min_price'])) : ?>
<meta name="robots" content="noindex,follow">
<?php endif; ?>
В кейсе весь фильтр (136 адресов) закрыли именно через условие в шаблоне шапки — минус 161 дубль за один шаг. Проверьте исключения заранее: корзина и checkout тоже отдают динамические URL, их трогать не надо. Про механику кэша динамических страниц я писал в статье про ускорение WooCommerce.
Шаг 3. Теги и поиск: 404 для невалидных, noindex для остальных. Если ?tag=... не является валидным URL страницы тега, а сервер вместо этого отдает главную с кодом 200, такой URL нужно исправить: несуществующий адрес должен отдавать 404, а не копию главной. Проверяется curl:
curl -s -o /dev/null -w "%{http_code}" "https://example.ru/?tag=test123"
# должно быть 404, а не 200
Если внутренний поиск не должен индексироваться, его можно закрыть от обхода через robots.txt или использовать noindex на доступных роботу страницах — выбор зависит от задачи. Не тратить обход на внутренний поиск — логичная цель для Disallow.
Шаг 4. Clean-param для незначащих GET-параметров. Для значащих параметров задавайте обработку явно. Многие стандартные трекинговые параметры Яндекс умеет исключать из поиска автоматически, но при необходимости укажите их через Clean-param. Построчная запись ниже — вопрос читаемости, а не требование: несколько параметров можно перечислить одной директивой через &. Не используйте слишком широкие маски: они могут зацепить функциональные параметры и изменить обработку нужных URL:
User-agent: Yandex
Disallow: /*?s=
Clean-param: utm_source&utm_medium&utm_campaign&_openstat /
Clean-param: s /
Файл robots.txt на Beget и Timeweb правится через файл-менеджер панели или по FTP — файл изменяется сразу, перезапуск сервера для этого не требуется. Когда поисковый робот перечитает обновленный robots.txt — зависит от частоты его обхода.
Шаг 5. Почистите sitemap. Один URL на страницу: уберите дубли через категории/производителей, отключите пустые таксономии, приведите адреса к виду из меню (без устаревших префиксов). В кейсе чистка дала 825 → 270 URL. Про редиректы при смене адресов читайте в статье про перенос без потери SEO — механика 301 та же.
Шаг 6. Переобход и удаление в Вебмастере — одной партией. Сформируйте два списка: URL на переобход (приоритет — категории) и мусор на удаление. В кейсе вышло 179 на переобход и 89 на удаление. Отправьте один раз: повторно слать одни и те же URL каждый день нет смысла — это не ускоряет переобход. Изменения отражаются с задержкой от нескольких дней до нескольких недель. Неотправленные остатки (в кейсе 162 адреса) досылаются одной партией после первой волны.
После шагов 1–2 откройте 5–10 URL фильтров и страниц пагинации: фильтры должны отдавать noindex, страницы пагинации — self-canonical. Это 10 минут в браузере вместо месяца ожидания.
Проверка результата
После переобхода с задержкой от нескольких дней до нескольких недель смотрите Диагностику Вебмастера: счетчики дублей должны упасть. В кейсе динамика была такой: старт 970/936 → после шагов 1–2 осталось 156 → после sitemap и пагинации — меньше 50/50. Каждый шаг проверялся live: curl на canonical, коды ответов фильтров, размер sitemap.
Дополнительно проверьте запросом site:example.ru inurl:filter — используйте site: как дополнительную быструю проверку, а не как точный отчет об индексировании: оператор может показывать неполную выборку. Тренд на исчезновение мусорных адресов из выдачи — хороший знак. Если через месяц счетчик стоит — ищите второй источник дублей: www-зеркало, http-версию или второй шаблон, отдающий те же страницы (в кейсе был дубль оригинал + modification-копия).
Когда чистка не сработает
Если дубли генерируются зеркалами (www/без www, http/https) — это отдельная задача со склейкой зеркал, а не фильтры. Если дубли идут из двух активных тем/модулей, отдающих один контент (как seo_url + seo_pro в кейсе), — патчить нужно оба, иначе правка видна только наполовину. Если сайт на JS-рендере без SSR — поисковик может видеть одинаковые заглушки вместо разных страниц, тут нужна серверная отдача мета-тегов.
И главное: изменения в индексировании отражаются с задержкой — от нескольких дней до нескольких недель. Не откатывайте правильные правки только потому, что счетчик еще не упал.
/category/page/1/ отдает 301 на чистый URL категории. Canonical всех страниц на первую — плохой вариант: поисковик может исключить страницы 2+ из индекса. Помните: canonical — подсказка для выбора основной страницы, итоговое решение принимает поисковик.Вебмастер показывает сотни дублей?
Проведу аудит дублей title и description — найду источники мусора, закрою фильтры и пагинацию, почищу sitemap и доведу счетчики до нормы.