Способы вывода постов в вордпрессе

Wordpress post, query_posts, get posts и прочие вкусняшки

Понравилась статья? Оставьте оценку:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(2 голоса, в среднем: 5 из 5)

До этого мы говорили о различных интересных штуках, а сейчас я подумал о том, что упустил самое базовое понятие в вордпрессе — вывод постов. Существует несколько способов вывести посты, и я их рассмотрю по порядку, начиная с самого простейшего — стандартного цикла вордпресса.

Стандартный цикл вордпресс

Стандартный цикл вордпресс используется в том случае, когда запрос уже сформирован, и записи уже получены, и полученную выборку не нужно никак модернизировать. Пример — шаблон категории category.php — нужно просто вывести уже полученные записи категории, или single.php — единственная запись также уже выбрана, и нужно ее вывести. И так далее. В этом случае достаточно использовать стандартный цикл. Выглядит он примерно вот так:

<?php if(have_posts()) : ?>
  <?php while ( have_posts() ) : the_post(); ?>
    <div id="post-<?php the_id(); ?>" <?php post_class(); ?>
      <h1><?php the_title();  ?></h1>
      <?php the_content(); ?>
    </div>
  <?php endwhile; ?>
<?php else : ?>
  <h2>Записей нет</h2>
<?php endif; ?>

Этот код перебирает уже сформированную выборку и выводит посты на страницу. Все просто.

Вордпресс заботится о нас и делает стандартную выборку для каждого шаблона, для рубрики, для таксономии, архивов, одиночных постов, страниц и прочее. Данные стандартного запроса сохраняются в $wp_query, а затем мы их выводим с помощью вышеописанного цикла.

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

Выборка при помощи query_posts()

query_posts — это стандартная вордпресс функция, выполняющая запрос к базе данных на выборку постов. С помощью нее мы можем модернизировать существующую выборку или получить новую. Сначала разберем получение новой выборки постов.

<?php query_posts('cat=10&order=ASC'); ?>
<?php if(have_posts()) : ?>
  <?php while ( have_posts() ) : the_post(); ?>
    <div id="post-<?php the_id(); ?>" <?php post_class(); ?>
      <h1><?php the_title();  ?></h1>
      <?php the_content(); ?>
    </div>
  <?php endwhile; ?>
<?php else : ?>
  <h2>Записей нет</h2>
<?php endif; ?>
<?php wp_reset_query(); ?>

Что тут происходит? Сначала функцией query_posts('cat=10&order=ASC'); мы выбираем посты из десятой рубрики и сортируем их, затем базовым циклом выводим на страницу, затем «сбрасываем» запрос на стандартный при помощи wp_reset_query()

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

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

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

<?php global $query_string;  // получаем базовые параметры запроса 
query_posts($query_string.'cat=-10&order=ASC');  // используем базовые параметры, но исключаем категорию 10 и сортируем ?>

Далее как и в предыдущих примерах используем цикл для вывода и wp_reset_query для сброса запроса на стандартный.

Выборка постов с помощью WP_Query

На самом деле использовать query_posts следует крайне аккуратно и не рекомендовано разработчиками вордпресса. Лучшим решением будет использование WP_Query. Это класс для работы с постами. Именно на его основе работает функция query_posts. С помощью этого класса можно создавать запросы, которые не будут переписывать стандартную переменную $wp_query, а следовательно нам не нужно будет заботиться о сбросе переменных, да и выборки можноделать не заморачиваясь о том что что-то где-то перепишется и сработает не так как надо. Замечательно, правда?

<?php $my_query = new WP_Query('cat=10'); ?>
<?php if ($my_query->have_posts()) : ?>
  <?php while ($my_query->have_posts()) : $my_query->the_posts(); ?>
    <div id="post-<?php the_id(); ?>" <?php post_class(); ?>>
      <h1><?php the_title(); ?></h1>
      <?php the_content(); ?>
    </div>
  <?php endwhile(); ?>
<?php else : ?>
  <h2>Постов не найдено</h2>
<?php endif; ?>
wp_reset_postdata()

Комментарии по коду. С помощью WP_Query мы делаем запрос и помещаем в переменную $my_query (не затирая данные в стандартной переменной $wp_query). Далее стандартный цикл, чуть модернизированый, использующий нашу новую переменную. Далее сбрасываем переменную $post с помощью wp_reset_postdata(). Профит.

Цикл на основе get_posts()

Еще один вариант вывода постов в вордпрессе. Функция похожа на query_posts, также работает на основе WP_Query, но сохраняет данные в массив, и не трогает переменную $wp_query. Удобно.

<?php $my_posts = get_posts( 'cat=10'); ?>
<?php if ($my_posts) : ?>
  <?php foreach( $my_posts as $post ){ setup_postdata($post);
	// здесь выводим записи как в стандартном цикле
  } ?>
<?php else : ?>
  <h2>Постов не найдено</h2>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

На сегодня это все что я хотел рассказать о выводе постов в вордпрессе.

Присоединиться к обсуждению 3 комментария

    Спасибо, огромное!! Очень помогла статья, особенно место — Выборка постов с помощью WP_Query.

    Здравствуйте, а если использовать get_posts(), как добавить в этот код конструкцию if… else, чтобы можно было выводить надпись «Постов не найдено»?

      Достаточно проверить пустоту переменной $my_posts. Дополнил последний пример.

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