Нулевая страница в пагинации WordPress приводит к дублям страниц

30 марта 2021

В процессе работы над одним из Вордпрес-сайтов столкнулся с такой проблемой: если подставить в пагинацию нулевой номер страницы, то открывается страница категории. Таким образом появляется огромное количество дублей:

https://domain.ru/category-name
https://domain.ru/category-name/page/0
https://domain.ru/category-name/page/00
https://domain.ru/category-name/page/000
... и так далее

Все такие УРЛы отдают 200 код ответа. С одной стороны, canonical у всех этих страниц выводится корректный — https://domain.ru/category-name. А с другой, никогда не знаешь как этот каноникал учтёт поисковик.

Путём исследования нашёл такое решение проблемы:

add_action( 'template_redirect', 'arutyunov_redirects_from_zero_number_pages', 1 );
function arutyunov_redirects_from_zero_number_pages() {
	global $wp_query;

	// Если в параметрах передан номер страницы, и он равен 0,
	// то «насильно» меняем query-параметр пагинации на 1,
	// в таком случае дефолтная Вордпрес-функция `redirect_canonical`
	// подумает, что пользователь открывает /page/1 и перенаправит
	// на страницу категории без page-параметра
	if( isset($wp_query->query['paged']) && intval($wp_query->query['paged']) === 0 ) {
		$wp_query->query_vars['paged'] = 1;
	}
}

Код нужно добавить в файл functions.php вашей темы.

Важно! Рекомендую проверить работу этого кода в дев-окружении, а не на основном сайте. Могут возникнуть какие-то конфликты с кодом вашей темы или ваших плагинов, что может привести к неожиданным редиректам.

На что стоит обратить внимание:

  • у экшена установлен приоритет 1, чтобы он сработал раньше, чем встроенная функция redirect_canonical;
  • параметр paged у query заполнен лишь в том случае, если мы передаём GET-параметр page
  • мы перезаписываем paged в query_vars, чтобы Вордпрес подумал, что мы пытаемся открыть /page/1, с которой по-умолчанию всегда срабатывает редирект на саму категорию.
Добавить комментарий