WordPress Пагинация без Плагина
Рассмотрим, как добавить пагинацию в WordPress без плагинов. Наверняка все использовали различные популярные плагины для реализации пагинации, сегодня мы создадим пагинацию при помощи WordPress функции paginate_links(). Это позволит создать пагинацию для любых типов страниц в любом месте вашей темы.
Список параметров, доступных для использования функцией paginate_links():
echo paginate_links([
"base" => "%_%", // базовый формат URL
"format" => "?page=%#%", // строка замены /page/1/
"total" => $total, // всего страниц
"current" => $current, // текущая страница
"aria_current" => "page", // "page", "step", "location", "date", "time", "true", "false"
"show_all" => false, // настраивается end_size и mid_size (или показ всех страниц)
"prev_next" => true, // показ ссылок предыдущая/следующая
"prev_text" => "« Ранее", // анкор ссылки на предыдущую страницу
"next_text" => "Далее »", // анкор ссылки на следующую страницу
"end_size" => 1, // кол-во ссылок в начале и конце
"mid_size" => 2, // кол-во ссылок до и после текущей страницы
"type" => "plain", // в каком виде вернуть результат ("plain", "array", "list")
"add_args" => array(), // добавление параметров к ссылкам
"add_fragment" => "", // добавление текста к ссылкам
"before_page_number" => "", // тест до числа пагинации
"after_page_number" => "", // текст после числа
]);
Пример приближенный к реальному проекту. Создание пагинации для произвольного типа записи:
if (is_front_page()) {
$currentPage = (get_query_var("page")) ? get_query_var("page") : 1;
} else {
$currentPage = (get_query_var("paged")) ? get_query_var("paged") : 1;
}
$posts_Query = new WP_Query(array(
"post_type" => "production", // тип записи
"posts_per_page" => 3, // кол-во записей на странице
"paged" => $currentPage, // текущая страница
));
# $GLOBALS["wp_query"] = $posts_Query; // для получения в function.php
if ($posts_Query->have_posts()) {
while ($posts_Query->have_posts()) {
$posts_Query->the_post();
get_template_part("template");
}
wp_reset_postdata();
}
echo paginate_links([
"base" => str_replace(999999999, "%#%", get_pagenum_link(999999999)),
"format" => "",
"current" => max(1, $currentPage),
"total" => $posts_Query->max_num_pages,
]);
По умолчанию разметка пагинации будет следующая:

Добавление обёртки для пагинации
Добавим обёртку, например, с классом pagination. Замените:
echo paginate_links([
"base" => str_replace(999999999, "%#%", get_pagenum_link(999999999)),
"format" => "",
"current" => max(1, $currentPage),
"total" => $posts_Query->max_num_pages,
]);
Следующим кодом:
$pagination = paginate_links([
"base" => str_replace(999999999, "%#%", get_pagenum_link(999999999)),
"format" => "",
"current" => max(1, $currentPage),
"total" => $posts_Query->max_num_pages,
]);
echo "<div class='pagination'>" . $pagination . "</div>";
Получаем:

Создание пагинации в виде списка
Чтобы создать WordPress пагинацию в виде списка, необходимо изменить type на list:
echo paginate_links([
"base" => str_replace(999999999, "%#%", get_pagenum_link(999999999)),
"format" => "",
"current" => max(1, $currentPage),
"total" => $posts_Query->max_num_pages,
"type" => "list"
]);
Получаем:

Изменить класс page-numbers можно следующим образом:
$pagination = paginate_links(array());
echo str_replace("page-numbers", "pagination", $pagination);
Создание функции пагинации в function.php
Чтобы сделать код более красивым, можно вынести всю логику пагинации в function.php:
function my_pagination()
{
global $wp_query;
if (is_front_page()) {
$currentPage = (get_query_var("page")) ? get_query_var("page") : 1;
} else {
$currentPage = (get_query_var("paged")) ? get_query_var("paged") : 1;
}
$pagination = paginate_links([
"base" => str_replace(999999999, "%#%", get_pagenum_link(999999999)),
"format" => "",
"current" => max(1, $currentPage),
"total" => $wp_query->max_num_pages,
"type" => "list",
"prev_text" => "«",
"next_text" => "»",
]);
echo str_replace("page-numbers", "pagination", $pagination);
}
Необходимо раскомментировать строку $GLOBALS[«wp_query»] = $posts_Query;.
Вывод в шаблоне:
my_pagination();
Не работает пагинация в WordPress
Страница пагинации может не работать в следующей ситуации:
- вы создали кастомную таксономию и произвольный тип записи;
- вывели благополучно пагинацию на странице таксономии (taxonomy-name.php);
- но при переходе на следующую страницу, вы получили ошибку: «Страница не найдена».
Чтобы исправить ошибку, необходимо добавить следующий php-код в function.php:
add_filter("pre_get_posts", "tax_posts_per_page");
function tax_posts_per_page($query)
{
if (is_tax("название_таксономии")) {
$query->set("posts_per_page", get_option("posts_per_page"));
}
return $query;
}
Укажите число записей для нужной таксономии или пусть значение берется из админки: Настройки » Чтение » На страницах блога отображать не более.
Таким образом, можно сделать вывод, что совсем необязательно использовать сторонние плагины для создания пагинации на сайте WordPress, с этой задачей отлично справляется paginate_links().
Надеюсь, вам понравилась данная информация. Если вам интересна тема web-разработки, то можете следить за выходом новых статей в Telegram.
Поделиться с друзьями:
Статьи из данной категории:
Комментарии (1)
- Никита