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

Страница пагинации может не работать в следующей ситуации:

  • вы создали кастомную таксономию и произвольный тип записи;
  • вывели благополучно пагинацию на странице таксономии (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().