WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

the_posts_pagination() WP 4.1.0

Выводит на экран ссылки пагинации на след./пред. сет постов. Используется на страницах архивов (рубрики, метки, ...).

ссылки пагинации в теме Twenty Fifteen

Функция рассчитана на использования с любым типом записей.

Чтобы получить результат для обработки, используйте get_the_posts_pagination().

Работает на основе: get_the_posts_pagination()

Хуков нет.

Возвращает

Ничего. Выводит на экран HTML код пагинации. Если страниц пагинации нет (меньше 1), то ничего не выведет.

Использование

the_posts_pagination( $args );
$args(массив)

Параметры по которым будет выводиться результат. По умолчанию:

$args = array(
	'show_all'     => false, // показаны все страницы участвующие в пагинации
	'end_size'     => 1,     // количество страниц на концах
	'mid_size'     => 1,     // количество страниц вокруг текущей
	'prev_next'    => true,  // выводить ли боковые ссылки "предыдущая/следующая страница".
	'prev_text'    => __('« Previous'),
	'next_text'    => __('Next »'),
	'add_args'     => false, // Массив аргументов (переменных запроса), которые нужно добавить к ссылкам.
	'add_fragment' => '',     // Текст который добавиться ко всем ссылкам.
	'screen_reader_text' => __( 'Posts navigation' ),
);

$args передается в функцию paginate_links(), поэтому полный список параметров, смотрите в её описании.
По умолчанию: предустановки

Примеры

#1 Вывод пагинации на экран

<?php the_posts_pagination(); ?>

Выведет:

<nav class="navigation pagination" role="navigation">
	<h2 class="screen-reader-text">Навигация по записям</h2>
	<div class="nav-links"><span class="page-numbers current"><span class="meta-nav screen-reader-text">Страница </span>1</span>
		<a class="page-numbers" href="http://wptest.ru/page/2/"><span class="meta-nav screen-reader-text">Страница </span>2</a>
		<span class="page-numbers dots">…</span>
		<a class="page-numbers" href="http://wptest.ru/page/86/"><span class="meta-nav screen-reader-text">Страница </span>86</a>
		<a class="page-numbers" href="http://wptest.ru/page/87/"><span class="meta-nav screen-reader-text">Страница </span>87</a>
		<a class="next page-numbers" href="http://wptest.ru/page/2/">Следующая страница</a>
	</div>
</nav>

Ссылки пагинации в теме Twenty Fifteen

#2 Управление отображением

По умолчанию the_posts_pagination() выводит первую и последнюю страницу и по одной странице около текущей. Остальные заменяются многоточием. Этот вывод можно изменить с помощью аргументов:

show_all — показывать все страницы
end_size — количество страниц в начале и конце списка
mid_size — количество страниц слева и справа от текущей страницы

<?php 
the_posts_pagination( array(
	'mid_size' => 2,
) ); 
?>

Ссылки пагинации в теме Twenty Fifteen

#2.1 параметр end_size

Установим 2 ссылки на последние страницы в пагинации:

<?php 
the_posts_pagination( array(
	'end_size' => 2,
) ); 
?>

Ссылки пагинации в теме Twenty Fifteen

#3 Удаляем заголовок H2 из шаблона

По умолчанию шаблон пагинации содержит скрытый тег H2, который добавляется для роботов.

С точки зрения SEO этот тег, вроде бы, лучше убрать. Сделать это можно с помощью фильтра navigation_markup_template:

// удаляет H2 из шаблона пагинации
add_filter('navigation_markup_template', 'my_navigation_template', 10, 2 );
function my_navigation_template( $template, $class ){
	/*
	Вид базового шаблона:
	<nav class="navigation %1$s" role="navigation">
		<h2 class="screen-reader-text">%2$s</h2>
		<div class="nav-links">%3$s</div>
	</nav>
	*/

	return '
	<nav class="navigation %1$s" role="navigation">
		<div class="nav-links">%3$s</div>
	</nav>    
	';
}

// выводим пагинацию
the_posts_pagination( array(
	'end_size' => 2,
) ); 

Код the posts pagination: wp-includes/link-template.php WP 5.2.1

<?php
function the_posts_pagination( $args = array() ) {
	echo get_the_posts_pagination( $args );
}

Cвязанные функции

Из метки: navigation pagination (навигация пагинация)

Еще из раздела: Архивы

35 комментов
Полезные 3 Вопросы 2 Все
  • Otshelnik-fm202 cайт: otshelnik-fm.ru

    Получается можно избавиться от wp-pageNavi и им подобным?

    Ответить4.3 года назад #
    • Kama7453

      Да, я бы сказал даже нужно теперь использовать эту функцию в темах. Но менять в уже имеющихся, думаю совсем нет смысла. yes

      Ответить4.3 года назад #
      • @ campusboy3315 cайт: www.youtube.com/c/wpplus

        Эта функция, судя по описанию, на главной не сможет выводить пагинацию, а эти плагины как раз могут smile

        Ответить3.7 года назад #
        • Kama7453

          А где это в описании? Если про это:

          Используется на страницах архивов (рубрики, метки).

          То главная с постами - это тоже страница архива...

          Я там поправил немного, чтобы было понятнее. Спасибо!

          Ответить3.7 года назад #
  • Тимур, есть ли какой нибудь универсальный способ убрать при выводе пагинации тег h2 и текст screen-reader-text? Сама функция очень понравилась, но мне не нужен лишний заголовок h2.
    Пока удалил ненужный код из wp-includes/link-template.php. Но ведь при следующем обновлении это все опять вернется. Можно ли сделать какой-нибудь хук, чтобы избавиться от этого заголовка раз и навсегда? (сделать его невидимым через стили не подходит smile

    1
    Ответить4.2 года назад #
    • Kama7453

      Очень странно, нет фильтра для этого дела... Не похоже не ВП...

      Но, да, так сделать можно. Хотя разработчики как я понимаю именно это сделали чтобы через css прятать, насколько я понял.

      В общем, можно вырезать его регуляркой:

      // вместо the_posts_pagination(); используйте такой код:
      $nav = get_the_posts_pagination();
      $nav = preg_replace('~<h2.*?h2>~', '', $nav);
      echo $nav;
      2
      Ответить4.2 года назад #
      • WPShop4 cайт: wpshop.ru

        Можно использовать этот фильтр navigation_markup_template, задать свой темплейт

        1
        Ответить3.2 года назад #
  • @ campusboy3315 cайт: www.youtube.com/c/wpplus

    В WP много функций, но их фиг настроишь. К примеру, эту. Идея хорошая, реализация сырая. Вот как добавить nofollow к ссылкам пагинации? Никак, я так понимаю, без вмешательства в файлы движка. Так что пока Пейджнави или Тимуровское решение для "тру" ребят. Для домохозяек, в принципе, именно эта функция отлична. Поставил и забыл.

    Ответить4.2 года назад #
    • Kama7453

      Вот как добавить nofollow к ссылкам пагинации?

      Можно так:

      $pag = get_the_posts_pagination();
      $pag = str_replace('<a ', '<a rel="nofollow"', $pag);
      echo $pag;
      3
      Ответить4.2 года назад #
      • @ campusboy3315 cайт: www.youtube.com/c/wpplus

        Спасибо за решение, Тимур. Думаю, многим пригодиться, кто занимается SEO.

        Ответить4.2 года назад #
  • @ Егор

    Здравствуйте, недавно начал изучать программирования и вордпресс. Подскажите тут написано что
    пагинация выводится

    <?php paginate_links(); ?>

    когда вставляю эту строку то ничего не появляется, зато если написать

    <?php the_posts_pagination(); ?>

    то выводятся ссылки на другие страницы.
    Объясните почему работает так, а написано по-другому, может я не правильно понял или неправильно делаю. Или можно дать хотя бы ссылку где прочитать про это. Спасибо!

    1
    Ответить4.1 года назад #
    • Kama7453

      Спасибо за комментарий, это ошибка-опечатка в примерах была. Поправил paginate_links() не нужно использовать. Используйте the_posts_pagination().

      Ответить4.1 года назад #
  • @ campusboy3315 cайт: www.youtube.com/c/wpplus

    Если честно, ни разу не смог заставить эту функцию работать. Вот пишу очередной шаблон, вставляю в category.php сразу после цикла вывода новостей и ничего не происходит. И так во всех шаблонах, которые я пробовал. Поэтому по старинке использую альтернативу плагину WP-pagenavi.

    P.S.: Тимур, в который раз так получается smile http://prntscr.com/8naojy и улетаю в шапку сайта. Монитор у меня шириной 1366.

    P.S.2: Беру свои слова обратно, заработала функция. Не было видно вывод ссылок из-за неточного оформления в CSS.

    3
    Ответить3.5 года назад #
  • Владимир

    Можно ли заменить контейнер nav на обычный div? и вообще отключить вывод заголовка (screen-reader-text) ?

    Ответить3.2 года назад #
  • Гарик

    Привет. Подскажите, ни у кого не было такой проблемы - постраничная навигация выводит страницы, но половина из них - пустые? Вывожу ленту новостей в цикле, по 10 превьюшек на страницу, но навигация показывает больше страниц чем нужно, и где-то с середины начинаются пустые страницы. С чем это может быть связано? уже месяц пытаюсь найти решение. Какие только циклы вывода новостей не перепробовал, ставлю пагинацию - показывает такой косяк dash

    Ответить2.9 года назад #
    • Гарик

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

      Ответить2.9 года назад #
      • Александр

        В самой пагинации нужно использовать не $GLOBALS['wp_query']->max_num_pages, а используй параметр сформированый в запросе допустим делаешь запрос

        global $catalog;
        $catalog = new WP_Query(array(
        	'post_type' => 'catalog', 
        	'post_parent' => $post->ID,
        	'posts_per_page' => 3
        	));

        А функции пагинации используешь $GLOBALS['catalog']->max_num_pages>1
        я вышел из ситуации так, насколько это правильно я не знаю, пришел к этому сам,

        Ответить2.9 года назад #
      • Kama7453

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

        Чтобы это исправить вместо WP_Query() или get_posts() что вы там юзаете для изменения базового запроса, используйте query_posts() он перепишет все глобальные переменные, на которые ориентируется пагинация. После него вызовите пагинацию и после пагинации обязательно сбросьте запрос на начальный, вызвав wp_reset_query().

        1
        Ответить2.9 года назад #
    • Александр

      Подозреваю вы используете иерархичную структуру записей, запросом вытаскиваете определенные из них, они так и отображаются, а те которые не подходят под параметры не отображаются, но в список попадают!

      Ответить2.9 года назад #
  • @ GpewHuk

    Добрый день, такой вопрос, как можно убрать описание категории в пагинации т.е. чтобы на второй, третьей странице и так далее, описание категории не выводило.

    Ответить2.5 года назад #
  • Дмитрий

    Доброго времени суток.

    Пытаюсь сделать пагинацию с помощью встроенной функции the_posts_pagination();
    Эта функция работает с основным циклом. Но как быть если посты выводятся в созданный шаблон с определенной категории?
    Если вывод постов делать в index.php все работает. Но вот в шаблоне blog.php не работает.
    Код из шаблона:

    <?php
    	query_posts("cat=3&orderby=date&showposts=4");
    				if( have_posts() ){
    					while( have_posts()){
    						the_post();
    						// здесь оформляем данные для каждого поста в цикле
    						echo "<div class='col-md-6 col-sm-6 col-xs-12'>";
    							echo "<h3>";the_title();echo "</h3>";
    							echo "<p>";the_content();echo "</p>";
    						echo "</div>";
    					}
    					the_posts_pagination(array(                        
    						'end_size'     => 1,
    						'mid_size'     => 2,
    					));
    					wp_reset_query();
    				} else {
    					echo "<p>Блог еще без записей</p>";
    				}
    ?>

    Использую query_posts() для вывода постов из определенной категории так как при get_posts() пагинация вообще не отображается. А так просто не листает посты.

    Ответить2.4 года назад #
    • @ campusboy3315 cайт: www.youtube.com/c/wpplus

      Привет! Советую посмотреть "отца" этой функции, а именно paginate_links, там рассказывается о аргументе add_args, который можно применить и тут (смотрите там пример №2).

      2
      Ответить2.4 года назад #
Здравствуйте, !     Войти . Зарегистрироваться