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

Если вы некоторое время покрутитесь вокруг WordPress, вы узнаете, как трудно бывает создать списков постов на основе комплексных критериев, но в то же время в соответствии со стандартами WordPress. В течение нескольких лет, платформа прошла долгий путь. Используя мощь класса WP_Query, мы можем строить любые желаемые списки сообщений.



wp_query (1)

Что такое WP_Query

Класс WP_Query является одной из самых важных частей коде WordPress. Среди прочего, он определяет нужный вам запрос на любой странице и соответственно подтягивает сообщения. Он также сохраняет много информации о совершаемых им запросах, что значительно помогает при оптимизации страниц (и устранение ошибок)

Еще одно предназначение WP_Query в том, что он позволяет нам выполнять сложные запросы к базе данных в безопасной, простой и модульной манере.

Безопасность

На протяжении всего нашего взаимодействия с этим объектом, мы обеспечиваем его параметрами и используем функций для достижения наших целей. Внутренние механизмы объекта сами заботиться о многих неприятностях, таких как защита от SQL-инъекций и проверка использования подходящего типа данных.

Простота

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

Модульность

Больше всего я люблю модульность. Выполняя необработанные запросы, трудно управлять их часто используемыми кусками, потому что это просто фрагменты SQL кода. Класс WP_Query покончил с этим, используя ассоциативный массив в качестве аргумента. От сюда вытекает изобилие всяких полезностей: вы можете объединять аргументы из различных мест, выполнять функций массива для всего, что вашей душе угодно и оригинальными способами обращаться с этим.

с чего начать?

“Обычный” цикл WordPress

Давайте посмотрим сначала на обычный цикл, и затем создадим такой же цикл, используя WP_Query. Давайте предположим, что мы пишем код для файла category.php.

<?php
   if(have_posts()) :
      while(have_posts()) :
         the_post();
?>

         <h1><?php the_title() ?></h1>
         <div class='post-content'><?php the_content() ?></div>

<?php
      endwhile;
   else :
?>

      Ой, а постов нет.

<?php
   endif;
?>

То же цикл, используя WP_Query

<?php

   $args = array('cat' => 4);
   $category_posts = new WP_Query($args);

   if($category_posts->have_posts()) :
      while($category_posts->have_posts()) :
         $category_posts->the_post();
?>

         <h1><?php the_title() ?></h1>
         <div class='post-content'><?php the_content() ?></div>      

<?php
      endwhile;
   else:
?>

      Ой, а постов нет.

<?php
   endif;
?>

Как видите, в них совсем не много различий! Давайте разберем их:

  1. Построение запроса На странице отдельной категории, WordPress уже знает, что вы хотите получить список постов этой категории. Поскольку мы строим запрос с нуля, используя WP_Query, мы должны определить его самостоятельно. Мы углубимся чуть глубже в это.
  2. Создание экземпляров класса и запрашивание постов Создавая экземпляр класса с использованием структурированного массива аргументов, WP_Query будет пытаться вытащить указанные посты и загрузить другие детали.
  3. Создание цикла Вы можете использовать все обычные функции, только не забудьте использовать их в качестве методов объекта:
  • Вместо have_posts(), используйте $category_posts->have_posts().
  • Вместо the_post(), используйте $category_posts->the_post().
  •   Восстанавливайте бизнес как обычно того как вы сделали все вышеуказанное, вы можете использовать все теги шаблонов, которые вы знаете и любите.

Если вы посмотрите на это подробно, вы увидите, что глобальный объект $post  также доступен. Это означает, что если вы используете пользовательский цикл внутри другого цикла, все может пойти не так. Обязательно сохраните первоначальное значение объекта $post и восстановить его после цикла.

<?php
   $temp_post = $post; // Временное сохранение объекта
   $my_query = new WP_Query();
   while($my_query->have_posts()) {
      // Начало цикла здесь
   }
   $post = $temp_post; // Восстановить значение переменной $post к исходному
?>

Копаем глубже

Мощь Хорошего Аргумента

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

Во многих случаях пользователи вашей темы захотят классно выглядящий слайдер, но они могут быть немного ленивы в создании контента. Многие пользователи также захотят, показать будущий контент. Давайте выполним запрос для предстоящих (т.е. не опубликованных) постов, для которых задана избранная картинка.

<?php
   $args = array(
      'post_status' => 'future',
      'meta_query' => array(
         array(
            'key' => '_thumbnail_id',
            'value' => '',
            'compare' => '!='
         )
      )
   );
   $slider_posts = new WP_Query($args);
?>

<?php if($slider_posts->have_posts()) : ?>

<div class='slider'>
   <?php while($slider_posts->have_posts()) : $slider_posts->the_post() ?>
      <div class='slide'>
         <?php the_post_thumbnail() ?>
      </div>
   <?php endwhile ?>
</div>

<?php endif ?>

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

Знайте свои стандартные настройки

Вы, возможно, заметили, что я не уточняю количество элементов в своих запросах. Что насчет числа сообщений в списке? Что насчет статуса поста в первом сделанном нами запросе?

Значения по умолчанию есть у многих из наиболее распространенных аргументов. Вот несколько, которые вы не обязаны указывать, если конечно вы не хотите поменять их:

Comments are closed.