Возникла проблема — в категориях не работала пагинация. При переходе на вторую страницу к 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');
Рад если вам помог. Пишите в комментариях, результаты.