В предыдущих статьях мы рассмотрели весь теоретический материал о классе WP_Query, теперь посмотрим более подробно как все это работает на практике. В этом уроке мы разберем 10 различных сценариев применения данного класса и связанных с ним функций.

Это будет интересно и в то же время познавательно. Итак, приступим!

Создание цикла с помощью класса WP_Query

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

Цикл, созданный при помощи WP_Query, отличается от стандартного цикла. Типичный WordPress цикл выглядит следующим образом:


<?php 
if ( have_posts() ) {
   while ( have_posts() ) 
   { 
      the_post(); 
      // Вывод данных. 
} 
} 
?>

А вот как выглядит цикл, созданный посредством использования WP_Query:


<?php 
$args = array( 
'category_name' =>'news',
   'posts_per_page' => 3
);

$my_query = new WP_Query( $args );
if ( $my_query->have_posts() ) {
   while ( $my_query->have_posts() ) {
      $my_query->the_post();
      // Вывод данных.
}
}

// Сброс заброса
wp_reset_postdata();

?>

Отличия между ними заключаются вот в чем:

  • Мы задаем ряд аргументов для экземпляра WP_Query,
  • Затем инстанцируем класс WP_Query,
  • Добавляем $my_query-> в начало функций have_posts() и the_post() (в данном случае это методы класса WP_Query),
  • И сбрасываем данные параметра $post для возврата основного запроса.

Теперь вы знаете как создавать цикл с WP_Query и разницу между обычным циклом и циклом, созданным при использовании WP_Query. В каждом из ниже приведенных примеров мы не будем создавать циклы, но если они вам там понадобятся, вы всегда можете вернуться к этой части урока.

Выводим записи автора за текущий год

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

<?php 
// Получение текущего года. 
$current_year = date( 'Y' ); 
// Установка параметров. 
$args = array( 
// Получить автора с логином john. 
'author' =>'john',
   // Получить его сообщения в этом году.
   'year'=> $current_year
);

// Создание нового запроса.
$my_query = new WP_Query( $args );

?>

 

Вам остается только передать этот запрос в цикл.

Выводим записи из текущей категории (за исключением текущей записи)

Предположим, вы хотите создать цикл для каждой записи на соответствующих страницах и вывести список записей из категории, к которой эта запись относится. Очевидно, вам придется исключить из выборки текущую запись, поскольку она может быть одной из последних записей в данной категории. Создаем запрос с параметрами ‘cat’ и ‘post__not_in’:


<?php 
// Получение идентификатора текущей записи. 
$current_post_id = get_the_ID(); 
// Получение первой категории текущей записи. 
$current_post_cats = get_the_category(); 
$current_post_first_cat_id = $current_post_cats[0]->

// Установка параметров запроса.
$args = array(

   // Получить записи из категории текущей записи.
   'cat' => $current_post_first_cat_id,
   // Исключить текущую запись.
   'post__not_in' => array( $current_post_id )
);

// Создание нового запроса.
$my_query = new WP_Query( $args );

?>

Проще простого, не так ли? А если мы создадим пользовательский шаблон страницы с циклом, выполняющим подобный запрос, то получим в результате страницу «Самые комментируемые записи».

Настраиваем простой слайдер

При создании корпоративных сайтов, портфолио или веб-журналов, слайдеры стали своеобразным «мастхэвом», неотъемлемой составляющей подобных проектов. Я не большой фанат слайдеров (считаю, они отрицательно воздействуют на пользовательское восприятие), но в сети они весьма популярны. Если вам нужны слайдеры, используйте простой запрос, созданный с помощью класса WP_Query.


<?php 
// Установка параметров. 
$args = array( 
// Получение записей типа "slider". 
'post_type' =>; 'slider',
   // Получение категории для вывода слайдов.
   'category_name' => 'home-slides',
   // Отключение пагинации.
   'nopaging' => true
);

// Создание нового запроса.
$my_query = new WP_Query( $args );

?>

Аргумент ‘cat’ можно использовать для получения слайдов из различных категорий, что позволит вам поделить слайды на группы и использовать несколько слайдеров на разных страницах. Если же вы предпочитаете наличие лишь одного слайдера на своем сайте, удалите эту строку.

Выводим случайные цитаты в сайдбаре

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


<?php 
/* 
* Создание нового типа записей "Quotes" 
*/ function quote_post_type() { 
$args = array( 'label' => 'Quotes',
      'public' => true
);
   register_post_type( 'quotes', $args );
}
add_action( 'init', 'quote_post_type' );

// Установка параметров.
$args = array(
   // получение записей типа "quotes".
   'post_type' =>'quotes',
   // Случайная Сортировка.
   'orderby' => 'rand',
   // Получение только одной записи.
   'posts_per_page' => 1,
);

// Создание нового запроса.
$my_query = new WP_Query( $args );

?>

Здесь мы создаем тип записи, а затем с помощью запроса создаем цикл в сайдбаре. Простое и элегантное решение.

Выводим список товаров в определенном ценовом диапазоне

Вот этот пример будет самым востребованным среди пользователей. Он более техничен, чем все предыдущие, поскольку его можно успешно применять на сайтах электронной коммерции, созданных на базе WordPress. Если вы хотите вывести спи,сок элементов пользовательского типа записи «Product» и отфильтровать результаты по произвольным полям цены, воспользуйтесь следующим фрагментом:


<?php 
// Установка параметров. 
$args = array( 
// Получение записей типаproduct. 
'post_type' =>'product',
   // установка "meta query".
   'meta_query' => array(
      array(
        // Получение произвольного поля с ключом "price".
        'key' => 'price',
        // Установка значений произвольного поля.
        'value' => array( 100, 200 ),
        // Установка оператора сравнения.
        'compare' => 'BETWEEN',
        // Поиск только по полям значение которых число.
       'type' => 'numeric',
)
)
);

// Создание нового запроса.

$my_query = new WP_Query( $args );

Создаем шорткод для встраивания записей внутрь записей

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


>?php 
/* 
* Использование: 
* 
* [embed_post slug="my-post"] 
* [embed_post slug="my-post" full="false"] 
* [embed_post type="movie" slug="inception"] 
*/ function tutsplus_embedded_post_shortcode( $attributes ) {
 // Получение параметров шорткода. 
extract( 
shortcode_atts( 
array( 
'type' => 'post', 
'slug' =>'', 
'full' => true 
), 
$attributes
 ) 
); 
// Установка параметров. 
$args = array( 
// Get post type ("post" by default). 
'post_type' =>; $type, 
// Get post by slug. 
'name' => $slug ); 
// Создание нового запроса. 
$my_query = new WP_Query( $args ); 
// Проверка наличия результатов запроса. 
if ( $my_query->have_posts() ) { 
// Начало генерации разметки. 
$output = '<section class="embedded-post">'; 
// Запуск цикла по результатам запроса. 
while ( $my_query->have_posts() ) { 
$my_query->the_post(); 
// Добавление заголовка в возвращаемые данные. 
$output .= '<h2 class="embedded-post-title">'; 
$output .= get_the_title(); 
$output .= '</h2>'; 
// Вывод полной записи если `$full` равно true, иначе вывод цитатыt 
if ( 'true' === $full ) { 
// вывод полного контента. 
$output .= '<div class="embedded-post-content">'; 
$output .= get_the_content(); 
$output .= '</div>'; 
} else { 
// вывод цитаты. 
$output .= '<div class="embedded-post-excerpt">'; 
$output .= get_the_excerpt(); 
$output .= '<hellip; <a href="' . get_permalink() . '">' . __( 'See full post', 'tutsplus' ) . ' &raquo;</a>;'; 
$output .= '</div>'; 
} 
} 
// Окончание. 
$output .= '</section>'; 
} else { 
// Вывод сообщения об отсутствии результата запроса. 
$output = '<section class="embedded-post-error">'; 
$output .= '<p>' . __( 'Ничего не найдено.', 'tutsplus' ) . '</p>'; 
$output .= '</section>'; 
} 
wp_reset_postdata(); 
return $output; 
} 
add_shortcode( 'embed_post', 'tutsplus_embedded_post_shortcode' ); 
?>

Выводим список текущих запланированных записей

Почему бы вам не попробовать вывести несколько анонсов будущих записей для своих посетителей? С помощью следующей функции можно вывести список запланированных записей с/без выдержек после заголовков:


<?php
/*
* Использование с Цитатой:
*
* <?php echo tutsplus_show_drafts(); ?>
*
* Использование без Цитаты:
*
* <php echo tutsplus_show_drafts( false ); ?>;
*/
function tutsplus_show_drafts( $show_excerpts = true ) {
// Установка параметров.
$args = array(
'post_status' =>'pending',
'nopaging' => true
);
// Создание нового запроса.
$my_query = new WP_Query( $args );
// Проверка наличия результатов запроса.
if ( $my_query->have_posts() ) {
// Начать генерацию разметки.
$output = '&lt;section class="pending-posts">;';
// Запуск прохода циклом по результатам запроса.
while ( $my_query->;have_posts() ) {
$my_query->the_post();
// Вывод заголовка поста.
$output .= '<div class="pending">';
$output .= '<h3 class="pending-title">' . get_the_title() . '<h3>;';
$output .= get_the_title();
$output .= '<h3>;';
//вывод цитаты, если включена
if ( $show_excerpts ) {
$output .= '
<div class="pending-excerpt">';
$output .= get_the_excerpt();
$output .= '</div>';
}
$output .= '</div>';
}
// Закончить генерацию разметки.
$output .= '</section>';
} else {
// Let user know that nothing was found.
$output = '<section class="drafts-error">';
$output .= '' . __( 'Nothing found', 'tutsplus' ) . '';
$output .= '</section>';
}
wp_reset_postdata();
return $output;
}
?>

Выводим запись годичной давности

Если ваш блог создан более года назад, а его контент актуален во все времена (и в 2015 и в 2025 гг.), то добавление раздела «Записи в этот день год назад» позволит существенно увеличить количество просмотров ваших страниц. Сделать это можно следующим образом:


<?php 
// Установка параметров. 
$args = array( 
// День (1 - 31). 
'day' => date( 'j' ),

// Месяц (1 - 12).
'monthnum' => date( 'n' ),

// Год (минус 1).
'year' => date( 'Y' ) - 1,

// Показать только одну запись.
'posts_per_page' => 1

);

// Создание нового запроса.
$my_query = new WP_Query( $args );

?>

Этот запрос можно использовать для создания цикла, отображающего единичную запись годичной давности.

Выводим дочерние страницы текущей страницы

Вы считаете, что на страницах «Услуги», «Мои работы» и «Мое портфолио» кроме заголовков подстраниц разместить больше нечего? Вы правы, эти страницы обречены на роль «заполнителей». Подстраницы в этом случае – наиболее предпочтительный вариант. А если конкретнее, здесь можно было бы разместить, к примеру, сетку (grid) с миниатюрами квадратной формы и ниже их заголовками. Давайте посмотрим, какой вид запроса можно использовать для создания подобного шаблона страницы:


<?php 
$current_page_id = get_the_ID();
 
// Установка параметров. 
$args = array( 

// Получение дочерних страниц. 
'parent' => $current_page_id,

// Отключение пагинации.
'nopaging' => true

);

// Создание нового запроса.
$my_query = new WP_Query( $args );

?>

Заключение

Надеюсь, в этой статье вы узнали много для себя нового и полезного. В следующем уроке мы поговорим о классе WP_User_Query.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here

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