Вопрос или проблема
У меня есть страница категории, содержащая 6 стандартных постов (не кастомных постов), но я хочу отображать 5 на странице 1 и оставшийся пост на странице 2.
Я выполняю этот запрос
$args = [
"numberposts" => -1,
"posts_per_page" => 5,
"cat" => $cat_id,
"post_status" => "publish",
"paged" => get_query_var("paged", 1),
];
$posts = new WP_Query($args);
if ($posts->have_posts()):
затем выполняю пагинацию с помощью
$big = 99999999;
paginate_links([
"total" => $posts->max_num_pages,
"current" => max(1, get_query_var("paged")),
"type" => "list",
"base" => str_replace($big, "%#%", get_pagenum_link($big)),
]);
Пока что все хорошо. Страница отображает 5 постов, и ниже у меня отображается пагинация.
URL для страницы 2 — https://staging5.designslikethese.co.uk/category/graphic-design-tips/page/2/, что я и ожидал, однако при нажатии на ссылку ‘Next’ в отображении пагинации я получаю 404.
Точно есть 6 постов, потому что если я установлю posts_per_page => 6, я получаю 6 постов на странице категории.
Я не могу понять, почему page/2/ дает 404, если это не URL второй страницы.
Я пересмотрел много постов о пагинации, но не вижу, что не так. На самом деле, кажется, что сама пагинация работает корректно.
Кто-нибудь может пролить свет на это?
Спасибо
Ответ или решение
Конечно, проблема, с которой вы столкнулись при реализации пагинации на категории страницы с использованием WordPress, довольно распространённая, и её решение требует понимания внутренней работы системы WordPress и PHP. Давайте разберёмся с каждым элементом вашего кода и определим возможные причины возникновения проблемы 404 при попытке перехода на вторую страницу.
Теория
Проблема, с которой вы столкнулись, заключается в получении ошибки 404 при попытке перейти на вторую страницу вашей категории. Это может произойти по нескольким причинам:
-
Ошибки в настройке параметров WP_Query: Ваш код использует класс
WP_Query
для получения постов и включения пагинации. Однако, несмотря на правильные настройки аргументов, важно учитывать, что функции орегулирования URL, такие какget_query_var
, могут давать неверные значения или быть неверно интерпретированы, если параметры ссылки или правил перезаписи установлен не корректно. -
Правила перезаписи (Rewrite Rules): В WordPress ссылки определяются с использованием правил перезаписи. Если они настроены неверно или устарели, это может привести к ошибкам 404. Часто эта проблема решается перезагрузкой правил перезаписи через панель администратора, переходом в "Настройки" → "Постоянные ссылки" и просто сохранением настроек.
-
Кэширование: Если у вас включено кэширование на уровне сервера или с помощью плагинов, это может привести к тому, что создаются и отображаются устаревшие версии страниц, в том числе и страницы с корректной пагинацией. Очищение кэша может помочь выявить, не в нём ли проблема.
Пример
Рассмотрим пример, чтобы увидеть, как можно решить проблему. Основное внимание тратится не только на настройки самого WP_Query, но и на правильное упоминание и использование функций WordPress, таких как paginate_links
и get_query_var
.
$args = array(
'cat' => $cat_id,
'posts_per_page' => 5,
'paged' => max(1, get_query_var('paged')),
'post_status' => 'publish'
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
// вывод поста
endwhile;
$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' => $query->max_num_pages,
));
endif;
wp_reset_postdata();
Применение
На практике, для решения проблемы необходимо выполнить следующие шаги:
-
Пересоздание правил перезаписи: Зайдите в панель администратора вашего сайта и обновите настройки "Постоянные ссылки". Это обновит правила перезаписи и, возможно, решит проблему 404 ошибки.
-
Проверка и очистка кэша: Убедитесь в отсутствии кэша, который может препятствовать правильной работе пагинации. Если у вас используется плагин кэширования, временно отключите его или очистите кэш. Также проверьте уровень серверного кэширования.
-
Отладка URL и функции
get_query_var
: Проверьте, какие значения возвращаетget_query_var('paged')
. Для этого добавьте временныеecho
для вывода текущих значений переменных в процессе отладки. -
Проверка корректности URL и работоспособности ссылки. Убедитесь, что вы не редактировали файл
.htaccess
, который мог бы вносить изменения в правила перезаписи. Посмотрите, нет ли у плагинов иных возможностей для конфликта с текущими настройками URL.
Такая методика позволит найти и устранить источник ошибки шаг за шагом, обеспечив корректное отображение страниц с пагинацией. Если это не решит вашу проблему, рекомендуется также следить за изменениями темы и плагинов, которые могут вмешаться в процессы обработки запросов и пагинации.