Настройка canonical в WordPress для страниц с параметрами

Проблема с URL-параметрами в WordPress обычно всплывает не на главной странице, а в мелочах: сортировка в архиве, фильтр в каталоге, UTM-метки, пагинация, внутренний поиск, служебные параметры от плагинов. В итоге одна и та же страница доступна по нескольким адресам, а поисковик видит это как набор почти одинаковых документов.

Если у вас уже закрыты дубли через robots.txt и .htaccess, это не значит, что вопрос решён полностью. Robots.txt не удаляет уже найденные URL из индекса, а запрет на обход не помогает, если ссылки на параметры продолжают появляться внутри сайта или в внешних источниках. В таких сценариях canonical часто оказывается более точным инструментом.

Когда canonical нужен, а когда он не решит проблему

rel="canonical" полезен, если у страницы есть несколько доступных URL, но контент по сути один и тот же. Типичный пример — архив записей с сортировкой по дате, где меняется только порядок вывода, но не смысл страницы. Другой пример — UTM-метки на посадочных страницах, которые нужны для аналитики, но не должны создавать отдельные документы для индекса.

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

Диагностика проблемы

Сначала проверьте, действительно ли у вас дубли из-за параметров, а не из-за шаблона темы или плагина. Откройте несколько вариантов одного URL:

  • основной адрес страницы;
  • тот же адрес с ?utm_source=test;
  • адрес с сортировкой или фильтром, если они есть;
  • версию со слешем и без, если сервер позволяет обе.

Дальше посмотрите исходный код и найдите тег canonical. Если он указывает на саму параметризованную страницу, а не на чистый URL, поисковик может считать такие адреса отдельными документами. Ещё один полезный тест — заголовок ответа и статус страницы. Если параметр создаёт 200 OK и не меняет контент, это кандидат на canonical.

Для быстрой проверки можно использовать curl:

curl -I "https://example.com/page/?utm_source=test"
curl -s "https://example.com/page/?utm_source=test" | grep -i canonical

Если canonical отсутствует или ведёт не туда, сначала ищите, кто его генерирует: тема, SEO-плагин или кастомный код.

Как настроить canonical в WordPress без лишних дублей

В WordPress canonical часто уже добавляет ядро или SEO-плагин. Но проблема в том, что стандартная логика не всегда учитывает ваши сценарии: кастомные архивы, служебные параметры, отдельные страницы фильтрации. В таких случаях лучше не отключать canonical целиком, а точечно переопределять его для нужных URL.

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

add_filter( 'get_canonical_url', function( $canonical, $post ) {
	if ( is_admin() || ! $post instanceof WP_Post ) {
		return $canonical;
	}

	// Убираем UTM и другие маркетинговые параметры с канонического URL.
	if ( isset( $_GET['utm_source'] ) || isset( $_GET['utm_medium'] ) || isset( $_GET['utm_campaign'] ) ) {
		return get_permalink( $post );
	}

	return $canonical;
}, 10, 2 );

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

Для более сложного сценария, когда нужно убрать параметры только на определённых типах страниц, можно собрать URL без query string и использовать его как canonical:

add_action( 'wp_head', function() {
	if ( is_admin() ) {
		return;
	}

	if ( ! is_page() && ! is_single() ) {
		return;
	}

	$canonical = get_permalink();
	if ( ! $canonical ) {
		return;
	}

	printf(
		"<link rel=\"canonical\" href=\"%s\" />\n",
		esc_url( $canonical )
	);
}, 1 );

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

Что делать с UTM, сортировкой и внутренним поиском

Для UTM-меток canonical обычно должен вести на чистый URL без параметров. Это нормальная практика: аналитика продолжит работать, а поисковик не будет плодить копии. Для сортировки и фильтров решение зависит от смысла страницы.

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

ПодходКогда использоватьМинус
SEO-плагинСтандартные записи, страницы, архивыНе всегда учитывает кастомные параметры
Код в теме/плагинеТочечные правила для конкретных URLНужна аккуратная проверка конфликтов
Оставить как естьПараметр реально меняет контентРиск появления дублей, если логика не продумана

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

После настройки откройте страницу с параметрами и проверьте три вещи:

  1. в исходном коде есть один canonical;
  2. canonical указывает на чистый URL без лишних параметров;
  3. страница отдаёт код ответа 200, а не редиректит неожиданно на другой адрес.

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

Полезно также проверить, не генерирует ли тема второй canonical через кастомный wp_head. Это видно по исходнику страницы: если тег повторяется, уберите ручной вывод или отключите его в SEO-плагине.

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

Canonical ведёт на URL с параметрами

Такое бывает, если шаблон берёт текущий адрес без очистки query string. Исправление простое: canonical должен указывать на базовую версию страницы, если параметры не меняют смысл контента.

На странице два canonical

Обычно это конфликт темы и SEO-плагина. Оставьте один источник правды. Если плагин уже умеет управлять canonical, не дублируйте тег вручную в header.php.

Все параметры канонизируются на главную

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

Canonical используют вместо редиректа

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

Безопасность и производительность

Не ставьте универсальные правила, которые зависят только от наличия $_GET. Сначала проверьте, какие параметры реально используются на сайте и не ломают ли они кэш. Если у вас включён page cache, разные query string могут обходить кэш или создавать лишние варианты страниц. Это уже вопрос не только SEO, но и производительности.

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

Если нужен более широкий набор инструментов для чистки дублей и технической оптимизации, можно посмотреть Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже в этом случае логику canonical для нестандартных параметров лучше перепроверять вручную.

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

  • проверен исходный код страницы с параметрами;
  • canonical один и ведёт на нужный URL;
  • нет конфликта между темой и SEO-плагином;
  • не перепутан canonical и 301-редирект;
  • проверены UTM, сортировка и внутренний поиск;
  • страницы с реальным уникальным контентом не канонизированы на общий архив.

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

⭐⭐⭐⭐⭐