Пагинация для кастомных типов записей в WordPress

Вывод простой пагинации для кастомных типов записей в Wordpress

post-image

Наверняка Вы знаете, что стандартную пагинацию для записей в WordPress можно вывести используя функцию

<?php posts_nav_link(); ?>

но для кастомных типов записей (custom post type) такая функция не работает. В интернете есть много решений данной проблемы, но мне они не помогли сделать то, что нужно, поэтому я написал простое решение, которое заработает в 100% случаев.

Как это будет работать?

Данная инструкция позволит вам добавить пагинацию вида: «Следующая страница» и «Предыдущая страница». Это самый просто вид пагинации. Если вам нужна более продвинутая пагинация с цифрами советую обратить внимание на данную статью — Постраничная навигация в WordPress без плагина.

Сначала мы должны получить информацию о том, какую страницу (номер страницы) нам нужно отобразить. Затем мы отправляем запрос, в котором передаём количество постов, которое мы отображаем на одной странице и номер текущей отображаемой страницы:

<?php 

    // номер текущей страницы
    $current_page = $_GET['page'];

    // имя custom post type
    $post_type = 'projects';

    // если GET параметр пустой, то принимаем,
    // что текущая страница равна 1
    if ( empty($current_page) ) {
        $current_page = 1;
    }

    $args = array(
        'post_type' => $post_type,
        'posts_per_page' => 10, // количество постов на странице
        'paged' => $current_page, // номер текущей страницы
    );

    $projects = new WP_Query( $args );

?>

Далее идёт стандартная конструкция вывода постов:

if ( $projects->have_posts() ) :
    while ( $projects->have_posts() ) : $projects->the_post();
      // здесь HTML разметка поста
    endwhile; 
endif;

На этом почти всё. Единственное, что нам осталось сделать — это написать условия, при каких должна появляться пагинация и собственно вывести её в нужное место:

<?php
  if ( $projects->max_num_pages > 1 ) : // если максимальное количество страниц больше 1, то выводим пагинацию

    // если это не последняя страница и не первая, то выводим ссылки на следующую и предыдущую страницу
    if ( $projects->max_num_pages > $current_page && $current_page > 1 ) : ?>

      <a href="<?php prevlink($current_page) ?>">Предыдущая страница</a>
      <a href="<?php nextlink($current_page) ?>">Следующая страница</a>

    // если текущая страница является первой страницей, выводим только ссылку на следующую страницу
    <?php elseif ( $current_page == 1 ) : ?> 

      <a href="<?php nextlink($current_page) ?>">Следующая страница</a>

    // если текущая страница - это последняя страница, выводим ссылку только на предыдущую страницу
    <?php elseif ( $current_page == $projects->max_num_pages ) : ?>

      <a href="<?php prevlink($current_page) ?>">Предыдущая страница</a>

    <?php endif;

  endif;
?>

Функция, вставляющая ссылки на нужные страницы выглядит так:

<?php
  // ссылка на следующую страницу
  function nextlink($current){
      echo '?page=' . ($current + 1);
  }

  // ссылка на предыдущую страницу
  function prevlink($current){
      echo '?page=' . ($current - 1);
  }
?>

На этом всё. Постраничная навигация в URL будет выглядеть так:

site-name./projects?page=2

Код получился очень простым и в то же время рабочим, не пришлось использовать различные манипуляции, которые я находил в сети.

Это решение будет работать не только с произвольными типами записей, но и со стандартными.

Полный код выглядит вот так:

<?php

  $current_page = $_GET['page']; // текущая страница
  $post_type = 'projects'; // имя custom post type

  // если GET параметр пустой, то принимаем, что текущая страница равна 1
  if ( empty($current_page) ) {
    $current_page = 1;
  }

  // аргументы, передаваемые в запрос
  $args = array(
    'post_type'      => $post_type, // custom post type
    'posts_per_page' => 10,         // количество постов на одной странице
    'paged'          =>  $current_page,      // задаем номер страницы, которую хотим отобразить
  );

  $projects = new WP_Query( $args ); // отправляем запрос

  if ( $projects->have_posts() ) :

    while ( $projects->have_posts() ) : $projects->the_post(); ?>

      // здесь HTML разметка поста

    <?php endwhile; 

    // если максимальное количество страниц больше 1, то выводим пагинацию
    if ( $projects->max_num_pages > 1 ) : 

      // если это не последняя страница и не первая, то выводим ссылки на следующую и предыдущую страницу
      if ( $projects->max_num_pages > $current_page && $current_page > 1 ) : ?> 

        <a href="<?php prevlink($current_page) ?>">Предыдущая страница</a>
        <a href="<?php nextlink($current_page) ?>">Следующая страница</a>

      // если текущая страница является первой страницей, выводим только ссылку на следующую страницу
      <?php elseif ( $current_page == 1 ) : ?> 

        <a href="<?php nextlink($current_page) ?>">Следующая страница</a>

      // если текущая страница - это последняя страница, выводим ссылку только на предыдущую страницу
      <?php elseif ( $current_page == $projects->max_num_pages ) : ?> 

        <a href="<?php prevlink($current_page) ?>">Предыдущая страница</a>

      <?php endif;

    endif;

  endif;
?>

Понравился пост? Поставь лайк :)
И поделись с друзьями
VK
Telegram
Комментарии