Вывод постов на странице, постраничная навигация

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

Вывести посты на странице в WordPress — это значит создать шаблон страницы (page template) и забацать туда цикл, query_posts.

Для чего нужно такое вытворять? Рассмотрим несколько вариантов:

  • представьте, что вам нужно вывести на одной странице записи сразу из нескольких категорий
    query_posts('cat=3,4,5');
  • либо архивы для какого-нибудь типа записей
    query_posts('post_type=artwork');
  • а ещё таким образом можно обобщить на одной странице несколько таксономий, несколько меток и прочее

Вообще можно скомбинировать любые условия, используя эту статью. Параметры, которые описаны для WP_Query также подойдут и для query_posts.

Теперь я думаю порядок действий вам понятен? Создаете шаблон страницы, пихаете наверх query_posts, потом цикл, потом постраничную навигацию…

Кстати о ней. Просто так она не будет работать. Как это исправить?

Пожалуй стоит описать порядок действий более подробно.

  1. Создать шаблон страницы.
  2. Определить номер текущей страницы.
  3. Использовать query_posts с необходимым набором аргументов, при этом не забыв включить в него номер текущей страницы.
  4. Добавить цикл.
  5. Добавить функцию постраничной навигации, например wp_pagenavi().

А теперь полностью готовый код:

<?php 
/*
 * Template name: Моя галерея
 */
$current_page = (get_query_var('paged')) ? get_query_var('paged') : 1;
$params = array(
	'posts_per_page' => 7, // количество постов на странице
	'post_type'       => 'artwork', // тип постов
	'paged'           => $current_page // текущая страница
);
query_posts($params);
 
$wp_query->is_archive = true;
$wp_query->is_home = false;
 
while(have_posts()): the_post();
	/*
	в тело цикла вставьте HTML одного анонса записи, например:
	<h2><?php the_title() ?></h2>
	<p><?php the_content() ?></p>
	*/
endwhile;
 
wp_pagenavi(); // функция постраничной навигации

Это конечно же обобщенный пример, поэтому не забудьте про get_header() и get_footer(), если они у вас используются.

Плагин постраничной навигации WP-PageNavi

В предыдущем примере я использовал функцию wp_pagenavi(). Она отвечает за постраничную навигацию и является составляющей частью плагина WP-PageNavi (русское название: Список страниц).

Если вы используете данный код как есть и при этом у вас не установлен WP-PageNavi, то вероятнее всего вы получите ошибку.

Плагин очень легко устанавливается через админку сайта и так же легко настраивается — так что для этих целей рекомендую использовать именно его.

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

Смотрите также

Комментарии 32

  • Лазарь Н.18 июня 2012 в 14:06 #

    Кучу статей перерыла, чтобы решить свою проблему с навигацией на пользовательской странице - ничего толкового нигде нет. И только ваша статья действительно помогла. Спасибо!

  • Леон3 августа 2012 в 05:08 #

    Почитал Ваш пост, чувствую, что ответ где то здесь :).
    Такая задача. Есть статья на 12 килознаков, я хочу разбить её на 3 части. По нажатию на ссылку на статью в меню, читатель должен попадать на вначале первую часть, далее читает вторую часть и напоследок третью. Однако в начале каждой части должна быть ссылка на статью в полном варианте, для тех кто хочет открыть сразу всю статью и читать не листая страницы туда-сюда. Понятно что нужно сделать три страницы для каждой из трех частей отдельно. Но как их собрать в кучу? подойдет ли для этого код помещенный в статье, там речь идет о постах (записях) а не о страницах? Или можно как то проще это реализовать?

  • Михаил1 октября 2012 в 12:10 #

    Я правильно понимаю вставляю код на свою страницу в таком виде

     2, // количество постов на странице
       'post_type'      => 'news', // тип постов
       'paged'          => $current_page // текущая страница
    );?>
     
     
    is_archive = true;?>
    is_home = false;?>

    почемуто не работает...

  • Михаил1 октября 2012 в 14:10 #

    Все понял теперь выводятся...

    Может быть сможеш разобратся как сделать чтобы хлебные крошки работали на странице... допустим страница у меня "Новости" на ней выводятся заметки из категории допустим "Блог" вот когда я на странице "Новости" перехожу по заметке то в хлебные крошки пдстовляется уже не "Новости" а "Блог" и потом название заметки...

    Хлебные крошки использую от dimox

  • serj13 ноября 2012 в 22:11 #

    Привет, подскажи пожалуйста как вывести 3 определенные записи в слайдер, (например: post=754,234,432)? Спасибо

    • Миша13 ноября 2012 в 22:11 #

      используй параметр post__in = array(754,234,432) для query_posts.
      Полный список параметров смотри здесь.

    • Миша13 ноября 2012 в 22:11 #

      например:

      $args = array('post__in' => array(754,234,432));
      query_posts($args);
      • serj13 ноября 2012 в 23:11 #

        А можешь показать куда вставить)(что удалить) на примере

         get_option('forester_featured_post_num'),
        					'tag' => get_option('forester_featured_post_tags')
        				) );
        				if( have_posts() ) : while( have_posts() ) : the_post();
      • Миша14 ноября 2012 в 05:11 #

        тот огрызок кода вообще нерабочий) на третьей строчке есть две скобки - где они открываются?

  • Артем20 февраля 2013 в 16:02 #

    Спасибо, информация очень помогла.

  • Марина25 февраля 2013 в 00:02 #

    Спасибо! Очень полезная и позновательная статья.

  • allexandriya24 января 2014 в 01:01 #

    Наконец-то все работает) Спасибо))

  • allexandriya27 января 2014 в 22:01 #

    У меня вопрос: Пытаюсь таким куском кода на одной странице выводить посты с разных категории, но столкнулась с проблемой: как только нет постов с такой категории - то дальнейшие if-ы уже не обрабатываются. Почему? Разве if не подразумевает, что если нет подходящего условия - идти дальше? Почему обрывается исполнение?

    Спасибо)

  • allexandriya27 января 2014 в 22:01 #

    Код:

    <?php if ( have_posts() ) :
                    query_posts('cat=8');
                    while ( have_posts() ) : the_post(); //The Loop?>
     
    		<div class="header" id="paymentMethods" style="margin-top: 60px;">
    			<div class="separete"></div>
    			<h1 class="title"><?php the_title()?></h1>
    			<div class="separete"></div>
    		</div>
    		<div class="lal">
    			<?php the_content()?>
    		</div>
                    <?php endwhile; ?>
    <?php endif; ?>
    • Миша28 января 2014 в 06:01 #

      Попробуйте небольшие изменения:

      <?php 
      query_posts('cat=8');
      if ( have_posts() ) :
      	while ( have_posts() ) : the_post(); ?>
      	<div class="header" id="paymentMethods" style="margin-top: 60px;">
      		<div class="separete"></div>
      		<h1 class="title"><?php the_title()?></h1>
      		<div class="separete"></div>
      	</div>
      	<div class="lal">
      		<?php the_content()?>
      	</div><?php
      	endwhile;
      endif;
  • Ольга8 декабря 2014 в 20:12 #

    Задача была такая: вывести на главной странице посты из 2-х категорий с id 102 и 103, с сортировкой по дате добавления в хронологическом порядке, и с количеством постов на странице 12 шт. Получилось вот так:

    query_posts($query_string .'cat=102,103&orderby=date&order=ASC&posts_per_page=12');

    Все отлично работает, но вот беда все же одна есть: на главной странице отображаются посты из нужных категорий, т.е. с id 103 и 102, а вот на второй странице отображаются посты из всех других категорий, к примеру, с id 3 или 4 или 5... В принципе, мне и не нужна эта вторая страница вовсе (эта та, которая выглядит как сайт.ru/page/2/, т.к. вся нужная мне информация присутствует на первой. Но вот как от этой второй и последующих страниц избавиться?
    Посмотрела, у меня в шаблоне index.php количество страниц задано через переменную

    $total_pages = ceil( $published_post_count / $posts_per_page );

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

    • Миша9 декабря 2014 в 07:12 #

      Сразу вопрос, а что за переменная $query_string?
      Также можете поменять:

      global $wp_query;
      $total_pages = $wp_query->max_num_pages;
      • Ольга9 декабря 2014 в 08:12 #

        Я в php не сильна:-) Использовала код, предложенный в одном из блогов. Переменная $query_string сохраняет параметры основного запроса, изменяя только то, что стоит после амперсанта (&)
        В итоге, воспользовалась редиректом всех "добавочных" страниц на главную через htaccess

  • Виталий3 января 2015 в 23:01 #

    Здравствуйте.
    Вопрос, может, не совсем по теме поста... Не подскажете, как в single.php вывести случайным образом посты из определенных категорий? Может ссылка какая-нибудь есть, где почитать...

    • Миша4 января 2015 в 12:01 #

      Здравствуйте, ссылка есть, вот и вот.

      Но для single.php раньше вроде не работало (для page.php и page-template.php — отлично).

      • Виталий5 января 2015 в 00:01 #

        Видимо реализовать что-то подобное как здесь http://a-a-ah.ru/bunker-42 - подгрузку постов из разных категорий на странице текущего поста на WP не получится(

        • Миша5 января 2015 в 09:01 #

          Хорошие знания jQuery + общее представление о WP_Query и всё получится. На самом деле реализовать на WP можно всё.

  • Виталий3 января 2015 в 23:01 #

    Забыл дописать, вывести посты с пагинацией.
    Смысл в том, чтобы под основным постом выводить рандомные статьи, а плагином Infinite Scroll подгружать след. страницы, как он это делает на страницах категорий.
    Хотя если честно, не уверено, что он сработает там, как нужно..

  • Никита28 апреля 2015 в 16:04 #

    Всяко перепробовал данный метод, но ничего не работало. У меня WP 4.2.1
    Не уверен с чем это связано.

    Получилось вывести пагинацию данным методом для :

    $my_query = new WP_Query( array( 'tag' => 'foo', 'paged' => get_query_var('paged') ) );
     
    while ( $my_query->have_posts() ) : $my_query->the_post();
    	the_title();
    	// more stuff here
    endwhile;
     
    wp_pagenavi( array( 'query' => $my_query ) );
     
    wp_reset_postdata();	// avoid errors further down the page

    Взято отсюда http://scribu.net/wordpress/wp-pagenavi/wpn-2-74.html.

    Для query_posts — http://scribu.net/wordpress/wp-pagenavi/right-way-to-use-query_posts.html , но не проверял на работоспособность у себя.

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.
  • Миша: Привет ещё раз, не поверишь, реально не сталкивался с этим вопросом. По теории можно сказать следующее: во-первых,...

  • Миша: Привет, вообще без проблем, делаешь всё через require(), require_once() - выбирай любую, какая больше нравится.

  • Виталий Моргунов: Привет! Не могу разобаться, как я могу контролировать порядок подключения стилей. В моем случае мне нужно чтобы стили...

  • Миша: Спасибо!

  • w0rmak: Это было просто. Нашел код в интернете. Добавьте и себе ymaps.load(function () { var input = document.getElem...