Нулевая страница в пагинации WordPress приводит к дублям страниц
В процессе работы над одним из Вордпрес-сайтов столкнулся с такой проблемой: если подставить в пагинацию нулевой номер страницы, то открывается страница категории. Таким образом появляется огромное количество дублей:
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
, с которой по-умолчанию всегда срабатывает редирект на саму категорию.