Вопрос или проблема
Я перенес пользовательские записи, которые обычно находились бы в шаблоне архива, на специальный шаблон страницы. Я следовал этой статье:
https://jasonyingling.me/use-page-custom-post-type-archive-url-rewrites/.
Но я запутался, как мне добавить пагинацию. Если я проверяю код, $paged теперь всегда равен 0. Когда я вызываю код, который у меня есть (<?php pagination(); ?>
, ничего не отображается.
function pagination() {
global $wp_query;
$total_pages = $wp_query->max_num_pages;
if ($total_pages > 1){
$current_page = max(1, get_query_var('paged'));
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => '/page/%#%',
'current' => $current_page,
'total' => $total_pages,
));
}
}
Какие-нибудь идеи, что я делаю не так?
Я думаю, что ваш запрос в функции пагинации не включает ваш пользовательский тип записи. Посмотрите пример с пользовательским запросом, где категория установлена в аргументах. Также обратите внимание, как устанавливается $paged
.
.
Ответ или решение
Для решения задачи добавления пагинации на страницу архивов произвольного типа записей, прежде всего, необходимо понять основные концепты и технологии, стоящие за вашими текущими настройками. Основной проблемой, с которой вы столкнулись, является некорректная работа переменной $paged
, которая, как вы заметили, всегда равна 0, и вследствие этого пагинация не отображается.
Теория
В общем смысле, пагинация позволяет разбить вывод большого объема данных на страницы. В стандартных условиях WordPress использует встроенные механизмы для работы с архивами записей, где использование переменной $paged
и функции paginate_links()
позволяют корректно отображать навигацию по страницам.
Проблема возникает, когда мы работаем с кастомными шаблонами, как в вашем случае – заменой шаблона архива произвольного типа записей на специализированный шаблон страницы. При этом важно правильно настроить систему генерации URL и передавать корректные параметры функции WP_Query()
.
Пример
Ваша задача состоит в том, чтобы убедиться, что ваш запрос действительно обрабатывает параметр paged
. Вот типичный подход к решению этой проблемы:
- Определение
$paged
: Если вы используете запрос с пользовательскими параметрами, необходимо явно определить переменную$paged
, иначе она может не быть инициализирована автоматически.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
- Параметры WP_Query: Убедитесь, что вы передаете параметры для типа кастомного поста и пагинации:
$args = array(
'post_type' => 'your_custom_post_type',
'paged' => $paged,
// другие ваши параметры
);
$query = new WP_Query($args);
- Использование в лупе: Настройте ваш шаблон так, чтобы использовать этот новый объект
$query
, а не глобальный$wp_query
, если вы создали свой запрос.
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
// Отображение записи
endwhile;
$total_pages = $query->max_num_pages;
if ($total_pages > 1) {
echo paginate_links(array(
'current' => $paged,
'total' => $total_pages,
'base' => get_pagenum_link(1) . '%_%',
'format' => '/page/%#%',
));
}
endif;
wp_reset_postdata();
Приложение
Применяя вышеописанный метод, вы сможете поднять уровень реализации пагинации в каркасах средней или высокой сложности. Попробуйте следующий шаблон:
- Подготовьте ваш шаблон страницы таким образом, чтобы быть уверенным, что он обрабатывает и позволяет параметры пагинации.
- Убедитесь, что
functions.php
или файл с шаблоном страницы не использует неправильные параметры или параметры URL, которые могут конфликтовать с вашей системой пагинации. - Запустите и тестируйте страницу, проверяя, что переменная
$paged
правильно изменяется при навигации через вашу пагинацию.
Дополнительно это решение можно перерасти в нечто более комплексное с AJAX-пагинацией, если понадобится, чтобы улучшить производительность страницы без обновления страницы целиком.
Таким образом, решая задачу добавления пагинации, необходимо правильно настроить второй запрос в WP_Query с учетом всех нужных условий, что позволит вам добиться ожидаемой работы функционала. Не забудьте протестировать корректное изменение кодов URL, чтобы убедиться, что ваш шаблон страницы обрабатывает переменные пагинации и отображает корректный результат.