Если опросы в WordPress создают отдельные страницы, архивы, страницы результатов или фильтры, поисковик часто видит не один документ, а несколько почти одинаковых. На небольшом сайте это незаметно, но на проекте с регулярными опросами дубли быстро размывают индексацию и мешают понять, какая страница вообще должна ранжироваться.
Задача здесь не в том, чтобы «запретить всё подряд», а в том, чтобы оставить в индексе только полезные страницы: сам опрос, если он нужен в поиске, или вообще ничего, если это внутренний интерактивный блок. Остальное — архивы, результаты, страницы пагинации, параметры сортировки и служебные URL — лучше закрыть аккуратно.
Когда проблема действительно есть
Сначала проверьте, что именно индексируется. Частая ошибка — закрывать URL наугад, не понимая, откуда берутся дубли. Для опросов типичны такие сценарии:
- один и тот же опрос доступен по разным адресам с параметрами
?result=1,?tab=results,?vote=1; - есть архивы опросов, страницы рубрик или тегов, которые дублируют заголовки и краткие описания;
- страницы результатов отличаются только числом голосов, но содержат почти одинаковый контент;
- в sitemap попадают URL, которые не должны индексироваться;
- внутренний поиск или фильтры создают бесконечные комбинации URL.
Что смотреть в первую очередь
Откройте в Google Search Console отчёт по страницам и проверьте, какие URL уже попали в индекс. Затем сравните:
- канонический URL страницы опроса;
- служебные URL с параметрами;
- архивы и таксономии, если они есть;
- страницы, которые отдают одинаковый title и description.
Если у вас подключён SEO-плагин, проверьте, не создаёт ли он отдельные мета-теги для архивов опросов автоматически. Иногда дубли появляются не из-за самого опроса, а из-за шаблонов архивов и пагинации.
Какой подход выбрать: плагин, код или оба варианта
Для большинства сайтов лучше комбинировать настройки SEO-плагина и точечный код. Плагин удобен для массовых правил, код — для нестандартных URL и страниц результатов.
| Подход | Когда подходит | Минус |
|---|---|---|
| SEO-плагин | Нужно закрыть архивы, таксономии, отдельные типы записей | Не всегда умеет работать с параметрами и служебными страницами опросов |
| Код в теме или мини-плагине | Есть конкретные URL, которые нужно пометить noindex или исключить из sitemap | Нужно аккуратно тестировать после обновлений |
| Комбинация | Есть и архивы, и параметры, и отдельные результаты | Нужно следить, чтобы правила не конфликтовали |
Если вы используете Clearfy Pro, часть задач по чистке дублей и технической оптимизации можно закрыть настройками плагина, но для специфичных страниц опросов всё равно часто нужен код. Это нормальная практика: плагин для базовой гигиены, код для точечных исключений.
Пошаговое решение
1. Закройте архивы и служебные страницы в SEO-плагине
Если опросы у вас оформлены как отдельный тип записей или как таксономия, в настройках SEO-плагина отключите индексацию архивов, если они не несут самостоятельной ценности. Для страниц результатов и фильтров лучше использовать noindex, а не просто надеяться на robots.txt.
Важно: robots.txt не гарантирует удаление URL из индекса. Если страница уже известна поисковику, он может продолжать показывать её без содержимого. Для дублей это слабая защита.
2. Добавьте noindex для параметров и результатов
Если результаты опроса открываются через query string, можно отдать мета-тег noindex, follow только на таких страницах. Ниже пример для wp_head:
<?php
add_action('wp_head', function () {
if (is_admin()) {
return;
}
$has_poll_result = isset($_GET['result']) || isset($_GET['tab']) && $_GET['tab'] === 'results';
if ($has_poll_result) {
echo '<meta name="robots" content="noindex,follow" />' . "\n";
}
}, 1);Этот вариант подходит, если у вас есть понятные служебные параметры. Не расширяйте условие до всех GET-параметров подряд: можно случайно закрыть полезные страницы с сортировкой, пагинацией или UTM-метками.
3. Задайте канонический URL для основной страницы опроса
Если одна и та же страница открывается с параметрами, поисковику нужно явно показать основную версию. Для этого можно переопределить canonical:
<?php
add_filter('get_canonical_url', function ($canonical, $post) {
if (is_admin() || ! $post instanceof WP_Post) {
return $canonical;
}
if (isset($_GET['result']) || (isset($_GET['tab']) && $_GET['tab'] === 'results')) {
return get_permalink($post);
}
return $canonical;
}, 10, 2);Это не заменяет noindex, а дополняет его. Canonical помогает склеить дубли, но если страница служебная и не должна индексироваться, лучше явно закрыть её от индексации.
4. Исключите служебные URL из sitemap
Если ваш SEO-плагин добавляет в sitemap страницы результатов или архивы опросов, их нужно убрать. Логика зависит от плагина, но принцип один: в sitemap должны попадать только те URL, которые вы готовы видеть в поиске.
Для кастомного типа записей можно использовать фильтр, если sitemap формируется через WordPress core. Пример для исключения определённого post type из XML sitemap:
<?php
add_filter('wp_sitemaps_post_types', function ($post_types) {
unset($post_types['poll_result']);
return $post_types;
});Если у вас не отдельный post type, а обычные страницы с параметрами, sitemap нужно чистить на уровне SEO-плагина или не включать такие URL в генерацию вообще.
Проверка результата после внедрения
После правок не ограничивайтесь просмотром исходника страницы. Проверьте цепочку целиком:
- открывается ли основная страница опроса без параметров;
- есть ли на служебной странице
<meta name="robots" content="noindex,follow" />; - не изменился ли canonical на неправильный URL;
- не попали ли служебные страницы в sitemap;
- не отдаются ли для них 200 OK, если вы ожидали редирект или 404.
Быстрая проверка через браузер и curl:
curl -I "https://example.com/poll/?result=1"
curl -s "https://example.com/poll/?result=1" | grep -i robotsЕсли страница должна быть закрыта, но в ответе нет noindex, значит условие в коде не сработало или шаблон страницы обходит wp_head. Если canonical указывает на служебный URL, проверьте, не переопределяет ли его SEO-плагин позже по приоритету.
Частые ошибки и как их исправить
Закрывают всё через robots.txt
Это самая частая ошибка. Disallow мешает обходу, но не решает проблему индексации уже известных URL. Для дублей и страниц результатов используйте noindex или редирект, если страница вообще не нужна.
Ставят noindex на основную страницу опроса
Так бывает, когда условие написано слишком широко и срабатывает на любой URL с параметрами. В итоге поисковик перестаёт видеть полезную страницу. Проверяйте, что закрываются только служебные версии.
Оставляют дубли в sitemap
Даже если страница закрыта от индексации, её наличие в sitemap создаёт лишний шум. Поисковик получает противоречивые сигналы: URL одновременно предлагается к обходу и помечается как нежелательный для индексации.
Не учитывают кэш
Если на сайте стоит кэширование страниц, после изменения мета-тегов вы можете видеть старую версию HTML. Очистите кэш плагина, серверный кэш и CDN, если он есть. Иначе проверка будет ложной.
Практические советы по безопасности и производительности
Если опросы активно генерируют параметры, не давайте им бесконтрольно плодить URL. Это не только SEO-проблема, но и нагрузка на кэш, логи и обход поисковыми роботами.
- не индексируйте страницы с результатами, если они не несут самостоятельной ценности;
- не добавляйте в sitemap URL с параметрами;
- если результаты нужны только авторизованным пользователям, ограничьте доступ по роли, а не только мета-тегом;
- проверяйте, не создаёт ли тема или плагин отдельные архивы для опросов без необходимости;
- после обновления SEO-плагина повторно проверьте canonical и robots meta.
Если вам нужно не просто скрыть дубли, а системно почистить сайт от технического мусора, имеет смысл посмотреть в сторону инструментов для удаления дублей и технической оптимизации. Но даже в этом случае логику индексации опросов лучше держать под контролем вручную: это тот случай, где автоматические настройки часто слишком общие.
Хороший ориентир простой: в индексе остаётся только та страница, которую вы готовы показать пользователю из поиска. Всё остальное либо закрыто noindex, либо исключено из sitemap, либо вообще не создаётся как отдельный URL.