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,
]);

По умолчанию разметка пагинации будет следующая:

Стандартная пагинация WordPress при помощи paginate_links()

Добавление обёртки для пагинации

Добавим обёртку, например, с классом 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

Создание пагинации в виде списка

Чтобы создать 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'
]);

Получаем:

WordPress пагинация в виде списка

Изменить класс 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, с этой задачей отлично справляется paginate_links().

Админ admin