Пагинация страниц WordPress не работает — как исправить?

Возникла проблема — в категориях не работала пагинация. При переходе на вторую страницу к URL  добавляется /page/2 и возникает 404 ошибка.

Долго искал в интернете решение, перепробовал много решений. Что помогло. Добавил в хук инициализации ‘init’ новое правило перезаписи URL (ЧПУ).

Ссылка была вида Название_сайта/category/название_категории/название_подкатегории/page/2

Во-первых в function.php добавляем к хуку ‘init’ нашу функцию my_pagination() .

function my_pagination() {

}
add_action('init', 'my_pagination');

Далее добавляем новое правило перезаписи URL (ЧПУ). Для этого используем функцию add_rewrite_rule().

У функции 3 параметра:

add_rewrite_rule( $regex, $query, $after );
$regex(строка) (обязательный)
Регулярное выражение, которому должна соответствовать ссылка (УРЛ). В регулярке можно использовать одну или несколько групп (()).По умолчанию: нет
$query(строка/array) (обязательный)
Соответствующие регулярке параметры запроса. Можно использовать массив $matches[], чтобы получить значения групп регулярки.С версии 4.4. поддерживает массив.По умолчанию: нет
$after(строка)
Приоритет проверки. Может быть top и bottom. top — значит это правило будет проверяться первым.По умолчанию: ‘bottom’

 

В переменной $regex мы должны описать наш REQUEST_URI(в моем случае category/название_категории/название_подкатегории/page/2) в виде регулярного выражения.

URL может быть с подкатегорией и без подкатегории.

Первый элемент category/ — он присутствует всегда.

Далее, если нет подкатегории пишем ([^/]*)/ — множество символов кроме ‘/’.

Если есть подкатегория — [^/]*?/?([^/]*)/.

Затем page/ — в пагинации он есть всегда.

И в конце любое число — ([0-9]+).

Получаем category/[^/]*?/?([^/]*)/page/([0-9]+).

Переменная $query содержит REQUEST_URI c GET —  запросом.

Получилось index.php?category_name=$matches[1]&page=$matches[2], где
$matches[1] — это первые круглые скобки ([^/]*), $matches[2] — вторые ([0-9]+).

Остался приоритет проверки. Ставим top.

add_rewrite_rule( '^category/[^/]*?/?([^/]*)/page/([0-9]+)?', 'index.php?category_name=$matches[1]&page=$matches[2]', 'top' );

Для вставки в functions.php получилась следующая конструкция:

function my_pagination() {
add_rewrite_rule( '^category/[^/]*?/?([^/]*)/page/([0-9]+)?', 'index.php?category_name=$matches[1]&page=$matches[2]', 'top' );
}
add_action('init', 'my_pagination');

Рад если вам помог. Пишите в комментариях, результаты.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *