Проблема с пагинацией WordPress /page/2 возвращает 404 - что делать?
Я столкнулся с проблемой пагинации /page/2
, которая возвращает 404, и пытался найти решение. Я прочитал несколько предложений, но они пока не помогли.
Работает: http://pandasnacozinha.com.br/bolos-doces-e-sobremesas/
Не работает: http://pandasnacozinha.com.br/bolos-doces-e-sobremesas/page/2/
Я пытаюсь разобраться с этим уже несколько часов. Я понимаю, что WordPress воспринимает "page" как запись из категории "bolos, doces e sobremesas", поскольку моя структура постоянных ссылок настроена как /%category%/%postname%/
, но я не знаю, как это исправить.

У меня была такая же проблема, и я заметил, что в параметре 'posts_per_page = 6'
и в 'Настройки/Чтение'
на странице 'options-reading' WordPress у меня было установлено значение 10. Когда я выставил везде одинаковое значение (в моём случае 6), всё снова начало работать.

Этот пост вдохновил меня, и я нашел причину, почему это происходит. Вы спасли мой день!

Это полностью решило проблему для меня. Я до сих пор не понимаю, в чем была проблема. Мой пользовательский 'posts_per_page' установлен на 9.

В моем случае с пользовательскими ссылками: /%category%/%postname%/ У меня возникла проблема с: /news/page/2/
В итоге мне помог следующий код (добавить в functions.php):
function remove_page_from_query_string($query_string)
{
// Если имя запроса 'page' и параметр 'page' установлен
if ($query_string['name'] == 'page' && isset($query_string['page'])) {
unset($query_string['name']);
$query_string['paged'] = $query_string['page'];
}
return $query_string;
}
// Добавляем фильтр к хуку 'request'
add_filter('request', 'remove_page_from_query_string');

Только что столкнулся с точно такой же ситуацией - кажется большим упущением позволять настраивать структуру постоянных ссылок и не давать пользователям никаких подсказок о том, что им, возможно, придется вручную перезаписывать правила перезаписи... Или, может, это скорее баг и этого не должно требоваться?

Пробовал несколько часов, пока не нашел рабочее решение в этой статье.
В ваш файл functions.php
добавьте:
/**
* Исправление пагинации на страницах архивов
* После добавления правила перезаписи перейдите в Настройки > Постоянные ссылки и нажмите Сохранить, чтобы сбросить кэш правил
*/
function my_pagination_rewrite() {
add_rewrite_rule('blog/page/?([0-9]{1,})/?$', 'index.php?category_name=blog&paged=$matches[1]', 'top');
}
add_action('init', 'my_pagination_rewrite');
Замените blog
на название вашей категории в приведенном выше коде.
После добавления этого кода обязательно перейдите в Настройки > Постоянные ссылки
и нажмите Сохранить
, чтобы сбросить кэш правил, иначе правило не применится.
Надеюсь, это поможет!

Это сработало для меня. Всё ещё хотелось бы понять, почему это поведение появилось ни с того ни с сего. Но спасибо за решение.

Я обнаружил, что изменение структуры постоянных ссылок сработало для меня, смотрите:
Постоянная ссылка была такой в пользовательской структуре:
/index.php/%year%/%monthnum%/%day%/%postname%/
Затем я изменил её на: Дата и название (просто выберите радио-кнопку), и она стала выглядеть так:
/%year%/%monthnum%/%day%/%postname%/
Я попробовал это, и это работает!

Мое решение состоит из 3 шагов:
1- первый шаг: Установка этого плагина: https://wordpress.org/plugins/category-pagination-fix/
2- затем: приведите ваш код к следующей структуре
<?php $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; ?>
<?php
$q=new wp_Query(
array(
"posts_per_page"=>10, // постов на страницу
"post_type"=>"", // тип записи
"meta_key"=>"", // ключ мета-поля
"orderby"=>"meta_value_num", // сортировка по числовому значению мета-поля
"order"=>"asc", // по возрастанию
"paged" => $paged, // номер текущей страницы
)
);
while($q->have_posts())
{
$q->the_post();
?>
<li></li>
<?php
}
wp_reset_postdata();
?>
<div class="pagination">
<?php
global $q;
$big = 999999999; // необходимо указать маловероятное целое число
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $q->max_num_pages
) );
?>
</div>
3- перейдите в настройки WordPress > чтение > количество записей на странице блога и введите число 1

Как уже упоминали другие, убедитесь, что ваш параметр 'posts_per_page = 6' равен или меньше настройки WordPress: Настройки > Чтение > На страницах блога отображать не более.
Я недавно столкнулся с этой проблемой, и причина была в том, что я полностью управлял количеством постов на странице через файл шаблона. Если на последней странице недостаточно постов, это вызовет ошибку 404.
Например: у меня установлено 9 постов на страницу, но всего 25 постов. Первая и вторая страницы работали, а третья выдавала 404. Я изменил настройку WordPress на 1, оставив в файле шаблона 9, и теперь всё работает как ожидалось.

В моем случае, при использовании Divi и плагина PageNavi, причина ошибки 404 заключалась в том, что шаблон страницы (в моем случае архив) получал параметр запроса paged
с помощью get_query_var( 'paged' )
. Вместо этого все, что мне нужно было сделать — использовать глобальную переменную, как показано ниже:
<?php
/*
Template Name: Архивы
*/
get_header(); ?>
<?php
// $paged - глобальная переменная, предоставляемая темой
global $paged;
$args = array(
'posts_per_page' => 4,
'post_type' => 'axis',
'paged' => $paged,
);
$myposts = new WP_Query($args);
?>
<div div style="width: 50%; margin: 0 auto;">
<?php while ( $myposts->have_posts() ) : $myposts->the_post(); ?>
<div class="media-body">
<?php the_content(); ?>
</div>
<?php endwhile; wp_reset_postdata(); ?>
<?php wp_pagenavi( array( 'query' => $myposts ) ); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Этот код исправил ссылки и решил проблему с форматом записей post-name/page/N
.
Настройка постоянных ссылок установлена на "Название записи", т.е. http://localhost/sample-post/

В моем случае у меня был такой код в цикле:
if (is_category()) $args['posts_per_page'] = 8;
А в Настройки->Чтение у меня было установлено 10 записей на страницу для блога и ленты.
Я изменил на 8 записей на страницу в Настройки->Чтение, и теперь ошибка 404 исчезла, и всё, кажется, работает.
Я не знаю, почему так произошло, но, возможно, это кому-то поможет в будущем.

Вот обобщённое решение на основе ответа kregus, которое исправляет пагинацию сразу для всех категорий:
/**
* Исправление пагинации на страницах архивов
*/
function my_pagination_rewrite() {
$categories = '(' . implode('|', array_map(function($category){return $category->slug;}, get_categories())) . ')';
add_rewrite_rule($categories . '/page/?([0-9]{1,})/?$', 'index.php?category_name=$matches[1]&paged=$matches[2]', 'top');
}
add_action('init', 'my_pagination_rewrite');

Для тех, кто использует WooCommerce: я искал то же самое и выяснил, что WooCommerce изменяет параметр posts_per_page
для категорий товаров.
Подробнее: https://woocommerce.com/document/change-number-of-products-displayed-per-page/
Используя фильтр WooCommerce:
/**
* Изменение количества товаров, отображаемых на странице (страница магазина)
*/
add_filter( 'loop_shop_per_page', 'wc_update_loop_shop_per_page', 20 );
function wc_update_loop_shop_per_page( $cols ) {
// $cols содержит текущее количество товаров на странице, основанное на значении из Настройки → Чтение
// Возвращаем желаемое количество товаров на странице.
$cols = 9;
return $cols;
}
В моем случае я изменил $cols
на 12, и тогда пагинация снова заработала корректно.

У меня тоже была эта проблема, перепробовал все решения на этой странице, но ничего не помогло. В моем случае это было вызвано тем, что 'База категорий' совпадала с постоянной ссылкой моей страницы блога.
Например, постоянная ссылка моей страницы блога была 'articles', и я также установил 'Базу категорий' (в Настройки > Постоянные ссылки) в значение 'articles'. Изменение 'Базы категорий' на что-то другое исправило ошибки 404.

Я получаю ошибку 404, когда перехожу по URL с /page/2/...
. Поэтому я зашел на страницу 404 в WordPress и добавил этот JavaScript в начало страницы с ошибкой:
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script>
var getreurl = window.location.href;
if(getreurl != ""){
var res = getreurl.split("/?");
if(res[1] != ""){
var resd = "http://www.yourwebsite.com/list/?"+res[1];
window.location = resd;
}
}
</script>
Когда я возвращаюсь на страницу 404, она сохраняет URL. Я разбираю URL, получаю нужную строку URL, перестраиваю новую ссылку и перенаправляю на новый перестроенный URL.

Решение найдено!
Установка этого плагина решила проблему: https://wordpress.org/plugins/category-pagination-fix/
Также мне пришлось внести изменения в Настройки > Чтение, чтобы отображать менее 10 записей на странице (сейчас я показываю 6 записей, но любое значение меньше 10 должно работать).
Надеюсь, это поможет и вам. :)

устаревший плагин, исправляющий конкретную проблему в WordPress, которая была исправлена в ядре 6 лет назад? вряд ли это хороший ответ
