wplang.ru wordpress WP Lang

Как запретить индексацию страниц с фильтрами и параметрами в WordPress

Если на сайте появились десятки или сотни URL с параметрами вроде ?sort=price, ?filter_color=red, ?utm_source=... или страницами фильтрации каталога, поисковики быстро начинают видеть дубли. На небольшом сайте это выглядит как мусор в индексе, на большом — как распыление краулингового бюджета и лишние канонические конфликты.

Задача здесь не в том, чтобы «запретить всё подряд», а в том, чтобы оставить полезные страницы доступными для обхода, но убрать из индекса технические и бесполезные варианты. Ниже — рабочая схема: как диагностировать проблему, что именно закрывать, как это сделать кодом и как проверить результат.

Когда проблема действительно есть

Сначала стоит убедиться, что речь именно о дублях, а не о нормальной функциональности. Фильтры, сортировки и параметры часто создают URL, которые открывают тот же контент в другом представлении. Для пользователя это удобно, для индекса — не всегда.

Типичные признаки

  • в site:-поиске всплывают страницы с параметрами, которые не должны ранжироваться;
  • в Google Search Console растёт число «Просканировано, но не проиндексировано» для URL с параметрами;
  • одна и та же категория доступна по нескольким адресам из-за сортировки, пагинации и фильтров;
  • в логах или аналитике заметно много заходов на URL с utm_, sort, filter, page и похожими параметрами.

Что не стоит закрывать автоматически

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

Поэтому сначала разделите URL на три группы:

  • индексируемые — основные страницы категорий, записей, посадочные;
  • доступные, но неиндексируемые — фильтры, сортировки, служебные параметры;
  • полностью технические — внутренние тестовые адреса, временные страницы, неиспользуемые endpoint’ы.

Какие варианты решения есть и чем они отличаются

ПодходКогда подходитМинус
Плагин SEO/чисткиНужно быстро закрыть типовые дубли без разработкиНе всегда покрывает кастомные параметры и логику темы
Код в теме или mu-pluginЕсть понятный набор параметров и нужен контрольНужно тестировать на staging и следить за совместимостью
robots.txtНужно ограничить обход отдельных шаблонов или путейНе гарантирует удаление из индекса и не решает canonical

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

Пошаговое решение через noindex и canonical

Самый безопасный вариант — оставить страницу доступной для обхода, но отдать ей noindex,follow и при необходимости указать канонический URL на основную версию. Так поисковик видит страницу, но не добавляет её в индекс как самостоятельную.

Шаг 1. Определите список параметров

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

  • sort, orderby, order;
  • filter_*;
  • utm_*;
  • replytocom;
  • служебные параметры плагинов поиска и фильтрации.

Шаг 2. Добавьте условный noindex для страниц с параметрами

Если у вас есть доступ к теме или mu-plugin, можно добавить фильтр, который меняет robots meta только для нужных URL. Ниже пример для WordPress, который работает через стандартный фильтр wp_robots.

<?php
add_filter( 'wp_robots', function( array $robots ) {
	if ( is_admin() ) {
		return $robots;
	}

	$blocked_params = array( 'sort', 'orderby', 'order', 'replytocom' );
	$has_blocked_param = false;

	foreach ( $blocked_params as $param ) {
		if ( isset( $_GET[ $param ] ) ) {
			$has_blocked_param = true;
			break;
		}
	}

	foreach ( array_keys( $_GET ) as $key ) {
		if ( strpos( $key, 'utm_' ) === 0 ) {
			$has_blocked_param = true;
			break;
		}
	}

	if ( $has_blocked_param ) {
		$robots['noindex'] = true;
		$robots['follow']  = true;
	}

	return $robots;
} );

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

Шаг 3. Укажите canonical на основную версию

Для страниц с параметрами canonical должен указывать на чистый URL без параметров, если содержимое по сути то же самое. В WordPress это можно сделать через фильтр wpseo_canonical в Yoast SEO или аналогичный механизм в другом SEO-плагине. Если плагина нет, можно вывести canonical вручную в wp_head, но только если вы точно контролируете шаблон.

<?php
add_filter( 'wpseo_canonical', function( $canonical ) {
	if ( empty( $_GET ) ) {
		return $canonical;
	}

	$remove_params = array( 'sort', 'orderby', 'order', 'replytocom' );
	$has_target_param = false;

	foreach ( $remove_params as $param ) {
		if ( isset( $_GET[ $param ] ) ) {
			$has_target_param = true;
			break;
		}
	}

	foreach ( array_keys( $_GET ) as $key ) {
		if ( strpos( $key, 'utm_' ) === 0 ) {
			$has_target_param = true;
			break;
		}
	}

	if ( $has_target_param ) {
		return get_permalink( get_queried_object_id() );
	}

	return $canonical;
} );

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

Как закрыть только часть URL, а не весь сайт

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

Пример для архивов и таксономий с параметрами

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

<?php
add_action( 'template_redirect', function() {
	if ( is_admin() || is_feed() ) {
		return;
	}

	$has_filter = isset( $_GET['sort'] ) || isset( $_GET['orderby'] ) || isset( $_GET['replytocom'] );
	$has_utm = false;

	foreach ( array_keys( $_GET ) as $key ) {
		if ( strpos( $key, 'utm_' ) === 0 ) {
			$has_utm = true;
			break;
		}
	}

	if ( $has_filter || $has_utm ) {
		headers_sent() || header( 'X-Robots-Tag: noindex, follow', true );
	}
} );

Здесь используется заголовок X-Robots-Tag. Он полезен, когда нужно отдать директиву не только HTML-странице, но и файлам или нестандартным ответам. Но если вы работаете только с обычными страницами, достаточно meta robots.

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

После правки не ограничивайтесь открытием страницы в браузере. Нужно проверить, что поисковик действительно видит нужные сигналы.

  • Откройте URL с параметром, например ?sort=price, и посмотрите исходный код страницы.
  • Убедитесь, что в <meta name="robots"> есть noindex, если это задумано.
  • Проверьте canonical: он должен вести на чистый URL без параметров.
  • В Google Search Console используйте проверку URL и посмотрите, как страница интерпретируется роботом.
  • Если ставили X-Robots-Tag, проверьте заголовки через DevTools или curl -I.

Пример проверки заголовков:

curl -I "https://example.com/category/shoes/?sort=price"

В ответе должен быть либо X-Robots-Tag: noindex, follow, либо соответствующий meta robots в HTML, если вы используете только HTML-метку. Для canonical проверьте сам HTML-источник страницы.

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

Закрывают URL в robots.txt, а не ставят noindex

Это частая путаница. Disallow запрещает обход, но не гарантирует удаление из индекса, если URL уже известен поисковику. Для дублей чаще нужен именно noindex плюс canonical.

Ставят canonical на страницу с параметрами

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

Закрывают все параметры подряд

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

Не тестируют шаблоны темы и плагины

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

Чек-лист перед публикацией правок

  • Список параметров составлен по фактическим URL сайта.
  • Основные страницы без параметров остаются индексируемыми.
  • Для параметризованных URL задан noindex,follow.
  • Canonical ведёт на чистый адрес.
  • Нет дублирующих meta robots в шаблоне.
  • Проверка в Search Console показывает нужную интерпретацию страницы.
  • Фильтры и сортировки продолжают работать для пользователей.

Что делать, если нужен более быстрый способ без кода

Если сайт уже использует SEO-плагин и вы не хотите править тему, проще всего настроить правила там, где это предусмотрено. Для типовых дублей и чистки технических страниц часто хватает плагина, который умеет управлять индексированием, canonical и служебными параметрами. В экосистеме WordPress для таких задач иногда используют Clearfy Pro: он помогает убрать лишние дубли и технический шум без ручного встраивания кода, если ваш сценарий укладывается в его настройки. Но даже в этом случае логику параметров лучше сначала проверить на staging.

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

Главный критерий здесь простой: после внедрения поисковик должен видеть только те URL, которые реально нужны в индексе, а пользователь — продолжать пользоваться фильтрами без поломок. Если это выполняется, задача решена правильно.

×
C Днём программиста!
-20%

Ваша скидка
на премиум-темы и
плагины WordPress

Купить со скидкой сейчас ⋙