Постраничная навигация в WordPress без плагина (альтернатива WP-PageNavi)

Практически любой блоггер, который ведет свой блог на движке WordPress, знаком с плагином WP-PageNavi, который выводит постраничную навигацию такого вида:

Постраничная навигация в WordPress без плагина

Но не каждый знает (включая меня до недавнего времени), что WordPress имеет встроенную функцию (начиная аж с версии 2.1), которая реализует практически тот же самый функционал. Т.е. необходимость в использовании плагина отпадает.

Некоторое время я пользовался другим аналогичным решением, за что большое спасибо его автору Тимуру.

Функция, которую я вам предлагаю, совсем небольшая по размеру:

function wp_corenavi() {
  global $wp_query;
  $total = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
  $a['total'] = $total;
  $a['mid_size'] = 3; // сколько ссылок показывать слева и справа от текущей
  $a['end_size'] = 1; // сколько ссылок показывать в начале и в конце
  $a['prev_text'] = '«'; // текст ссылки "Предыдущая страница"
  $a['next_text'] = '»'; // текст ссылки "Следующая страница"

  if ( $total > 1 ) echo '<nav class="pagination">';
  echo paginate_links( $a );
  if ( $total > 1 ) echo '</nav>';
}

Данный код необходимо поместить в файл functions.php вашего шаблона. В функции всего четыре опции, комментарии я написал, думаю, тут все понятно.

Для того, чтобы вывести навигацию в нужном месте, вставляйте в шаблон следующую строку:

<?php if ( function_exists( 'wp_corenavi' ) ) wp_corenavi(); ?>

В HTML-коде, который получается в результате вывода функции, присутствуют все необходимые CSS-классы, которые можно использовать для оформления любого элемента навигации (например, текущую страницу, ссылки на предыдущую и следующую страницы).

Пользуйтесь.

* * *

Если вам нужен надежный хостинг и регистрация доменов, то вас ждет крупнейших украинский хостинг-провайдер FREEhost.UA, который готов предложить любой вид хостинга, начиная от виртуального, заканчивая арендой готового сервера.

Комментарии (228)

  1. Дмитрий
    5 апреля 2015 г. в 14:59

    Может кому пригодится, но пагинация уже встроена в WP начиная с версии 4.1, функция the_posts_pagination

  2. Андрей
    10 июля 2015 г. в 15:16

    Благодарю за полезную информацию. Очень пригодилась!

  3. 19 июля 2015 г. в 14:38

    А как в этой функции сделать так что бы убрать кнопки вывод к первой и последней?

    1. Если имеете в виду те, которые отделяются многоточием, то, вроде бы, никак.

  4. Максим
    29 июля 2015 г. в 09:26

    Привет! Сделал пагинацию как у Вас, пагинация вывелась как и должна, но при переходе по ссылке браузер выдает ошибку – такой страницы нет, ошибка 404. Использую query_posts(), настраивал опираясь на этот пост. В чем может быть проблема?

  5. 18 августа 2015 г. в 21:16

    Нужная статья, планирую сделать постраничную навигацию в своем блоге.

  6. 6 октября 2015 г. в 17:53

    Здравствуйте! А как добавить кнопки “первая страница” и “последняя страница” ?

  7. Алексей
    25 ноября 2015 г. в 22:43

    Здравствуйте. Подскажите, пожалуйста, у меня на главной странице выводятся последние записи. Но вместо навигации, а я указал, чтобы выводилось по пять постов, после пяти постов следует строка с надписью page 2, а потом идут следующие пять постов, потом опять надпись page 3 и посты. И все на одной странице. Что это за прикол такой.

  8. Kobeta
    21 декабря 2015 г. в 01:48

    Всё бы ничего, но уже несколько часов ищу плагин, который разбивает УЖЕ опубликованные статьи на 2-3 страницы, в зависимости от длинны. Неужели такого нет? Указать например, после 3000 символов создавать новую страницу. Всё.

  9. Анна
    5 августа 2016 г. в 10:51

    Спасибо большое, за статью.
    Очень доступно и понятно.

  10. Ильяс
    8 октября 2016 г. в 02:39

    Спасибо большое, очень помогли! :)

  11. 10 октября 2016 г. в 08:59

    Спасибо тебе большое, я перебрал кучу кодов но никак не мог решить эту задачу. ++++ Если хочешь, можешь посмотреть результат на моем сайте.

  12. Puchnin
    14 ноября 2016 г. в 14:00

    Восторг и овации! Пагинация прикрутилась как родная, спасибо!)

  13. 23 января 2017 г. в 14:38

    Большое спасибо автору. Успехов!

  14. Anton
    6 июня 2017 г. в 19:16

    не читал все комментарии, а что делает строка
    $a[‘base’] = str_replace(999999999, ‘%#%’, get_pagenum_link(999999999));
    ?

    1. 6 июня 2017 г. в 20:52 / ответ на коммент Anton

      Что-то связанное с получением правильных ссылок. Точно не знаю.

      1. Anton
        7 июня 2017 г. в 11:47 / ответ на коммент Dimox

        Значит я близко к решению проблемы, у меня на всём сайте пагинация работает корректно, а вот на заданной пользователем отдельной таксономии вместо “/page/2” выводится “/2”, в следствие чего на ссылку первой пагинации не удаётся перейти
        Буду бороть, но всё равно спасибо! :-)

  15. павел
    26 июля 2017 г. в 12:09

    а как обернуть ссылки в li ?

    1. 26 июля 2017 г. в 15:36 / ответ на коммент павел

      Такой возможности нет.

      1. павел
        26 июля 2017 г. в 15:38 / ответ на коммент Dimox

        спасибо я уже нашел , $a[‘type’] = ‘list’;

        1. 26 июля 2017 г. в 16:16 / ответ на коммент павел

          Окей. Не знал об этом.

  16. 19 января 2018 г. в 14:02

    немогу понять как сделать чтоб на главной выбивалось всего 4 статьи остальное уходило в пагинацию

    1. 19 января 2018 г. в 14:13 / ответ на коммент любовь

      В меню админки “Настройки -> Чтение” опция “На страницах блога отображать не более”.

  17. 7 апреля 2018 г. в 20:51

    У меня вместо цифр стоит “следующая страница” а нельзя ли это поменять в настройках ВП, не влезая в файлы шаблона?

    1. 8 апреля 2018 г. в 14:18 / ответ на коммент Роман

      Нельзя.

  18. 10 мая 2018 г. в 00:36

    Спасибо за статью! Добавил постраничную навигацию на свой сайт techbez01.ru без плагина. Круто!

  19. Виктор
    8 августа 2019 г. в 16:55

    Добрый день! Код замечательный, много раз меня выручал. Но, попытка использовать его для вывода пагинации для кастомных типов записей не увенчалась успехом. Подскажите можно ли его адаптировать для использования на страницах с кастом пост тайпами.

    1. 8 августа 2019 г. в 18:06 / ответ на коммент Виктор

      Функция должна работать с любыми типами записей. У меня с этим проблем не было.

    2. Николай
      11 ноября 2019 г. в 12:56 / ответ на коммент Виктор

      Сделал вот-так

      function pagination($wp_query=null) { // функция вывода пагинации
      		if (!is_object($wp_query)) {
                  global $wp_query; // используем глобальную выборку если не передана пользовательская
              }

      Теперь в функцию можно передать объект пользовательской выборки для кастомных страниц. Пагинация правильно расчитывается и выводится, но есть проблема: при переходе по разным страницам пагинации всегда отображаются записи первой страницы.
      Если у кого то есть мысли как это победить – буду крайне благодарен

  20. Николай
    11 ноября 2019 г. в 15:11

    Проблему решил: при создании своего объекта WP_Query в его аргументах обязательно добавляем
    ‘paged’ => get_query_var(‘paged’) ?: 1
    Все вместе у меня выглядит так:

    $args = [   'post_type' => 'post',
                            'post_status' => 'publish',
                            'paged' => get_query_var('paged') ?: 1,];//разбивает запрос постранично
                $query = new WP_Query($args);
    
    //потом цикл вывода поста
    
    pagination($query); //вызываем функцию пагинации
    

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код