Использование запросов WP_Query в WordPress — 10 практик применения

В сегодняшней 10-й, заключительной части серии уроков по запросам WP_Query в ВордПресс мы наконец-то закрепим полученные теоретические знания на практике, и рассмотрим 10 наиболее полезных примеров. Это будет десять разных сценариев использования класса WP_Query, а также связанных с ним функций. Надеюсь, что они будут полезны для вас!

 

10 практических примеров применения WP_Query в WordPress

 

Практический пример №1: вывести похожие посты из той же категории

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

<?php
// получаем ID всех категорий, к которым относится текущий пост
$cats = wp_get_object_terms( $post->ID, 'category', array( 'fields' => 'ids' ) );
// устанавливаем нужные аргументы для запроса
$args = array(
  'posts_per_page' => 10, // количество схожих публикаций для запроса
  'tax_query' => array(
    array(
      'taxonomy' => 'category', // указываем, что нам нужны посты родственные по категории
      'field' => 'id', // выбирать по полю ID
      'terms' => $cats // значение ID-шек
      'include_children' => false, // не включаем посты от дочерних категорий
      'operator' => 'IN' // если пост принадлежит хотя бы одной категории к текущему посту
    )
  )
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
if ($my_query->have_posts()) {
  echo '<h3>Похожие посты из данной категории</h3>';
  while ($my_query->have_posts()) : $my_query->the_post();
    echo '<p><a href="' . get_permalink($my_query->post->ID) . '">' . $my_query->post->post_title . '</a></p>';
  endwhile;
}
wp_reset_postdata();
?>

 

Практический пример №2: выборка дочерних страниц к текущей

Когда мы хотим получить все дочерние страницы к текущей (типа перечень подстраниц), вот как мог бы выглядеть подобный запрос:

<?php
$current_page_id = get_the_ID(); // получаем ID текущей страницы
// устанавливаем нужные аргументы для запроса
$args = array(
  'parent' => $current_page_id, // получаем дочерние страницы для текущей
  'nopaging' => true // получить все имеющиеся страницы и не разбивать их на отдельные (без пагинации)
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

 

Практический пример №3: последние публикации из этой категории (кроме текущей публикации)

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

<?php
$current_post_id = get_the_ID(); // получаем ID текущего поста
$current_post_cats = get_the_category(); // получаем категорию текущего поста (если больше одной — первую)
$current_post_first_cat_id = $current_post_cats[0]->term_id;
// устанавливаем нужные аргументы для запроса
$args = array(
  'cat' => $current_post_first_cat_id // запрос базируется на аргументе категорий
  'post__not_in' => array( $current_post_id ) // исключить из запроса текущую публикацию
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

Это похожий пример, но реализованный несколько по-другому, к первому практическому примеру. То есть одну и ту же задачу можно решать по-разному.

 

Практический пример №4: самые популярные публикации (по количеству комментариев)

CMS WordPress не имеет встроенной системы подсчета просмотров публикаций, для этого требуются отдельные плагины (функции). Но это может замедлять работу сайта, поскольку при каждом просмотре публикации данный функционал будет взаимодействовать с базой данных (запись/чтение количества просмотров). Однако эту задачу можно решить другой реализацией: на основе количества комментариев. Чем больше комментариев — тем более популярной кажется публикация. А количество комментариев уже записано в базу данных — поэтому с классом WP_Query мы можем очень легко это задействовать:

<?php
$args = array(
  'orderby' => 'comment_count' // сортировка полученных постов по количеству комментариев
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

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

 

Практический пример №5: выборка всех постов автора в текущем году

Скажем, вы хотите сделать список постов определенного автора, и которые были опубликованы в текущем году. Для этого нам нужно только два параметра WP_Query, author и year:

<?php
$current_year = date('Y'); // получаем числовое значение текущего года
// устанавливаем нужные аргументы для запроса
$args = array(
  'author' => 'petr', // в данном примере мы хотим посты автора с найснеймом (nicename) "petr"
  'year'  => $current_year // и опубликованные исключительно в этом году
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// передаем данные запроса для обработки в цикл
if ( $my_query->have_posts() ) {
  while ( $my_query->have_posts() ) {
    $my_query->the_post();
    // здесь работаем с данными одной публикации
  }
}
// очищаем данные глобального $post для основного запроса
wp_reset_postdata();
?>

 

Практический пример №6: простое получение из базы данных слайдеров

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

<?php
// устанавливаем нужные аргументы для запроса
$args = array(
  'post_type' => 'slider', // в данном случае мы используем специальный тип постов — слайдер
  'category_name' => 'home-sliders', // если требуются слайды из специальной категории
  'nopaging' => true // получить все имеющиеся слайды и не разбивать их на страницы
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

Здесь следует отметить, что важным условием для этого примера является то, что ваш сайт должен иметь такой тип публикаций (slider) и публикации с ним. То есть, сначала вы должны создать новый тип публикаций под названием «slider» с помощью функции register_post_type(). Но этот вопрос не есть темой данного урока, поэтому детали я опущу.

 

Практический пример №7: случайная цитата в сайдбаре

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

<?php
// устанавливаем нужные аргументы для запроса
$args = array(
  'post_type' => 'quotes', // нам нужны посты отдельного типа — quotes (цитаты)
  'orderby' => 'rand', // условие функционала — рандомная сортировка
  'posts_per_page' => 1, // будем показывать только одну цитату за один раз (за одно посещение страницы)
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

Простое и элегантное решение.

 

Практический пример №8: запрос из базы товаров в определенном диапазоне цен

Это уже несколько более сложный пример применения класса WP_Query, нежели предыдущие. К тому же здесь условием является использование на WordPress сайте функционала электронной коммерции (например, с WooCommerce). Фрагмент кода ниже будет запрашивать список товаров (тип публикаций product) и фильтровать результаты с помощью специальных полей (мета-данных) цены:

<?php
// устанавливаем нужные аргументы для запроса
$args = array(
  'post_type' => 'product', // нам нужны посты отдельного типа — "product" (товар)
  'meta_query' => array( // настройка параметров для запроса мета-данных
    array(
      'key' => 'price', // работаем с метаданными с ключом "price"
      'value' => array( 1500, 1750 ), // нам нужны следующие значения цен
      'compare' => 'BETWEEN', // указываем значение оператору compare — то есть цены должны быть в данном промежутке
      'type' => 'numeric', // и да, нам нужны только числовые значения
    )
  )
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

 

Практический пример №9: анонс запланированных (будущих) публикаций

Вот такая идея: почему бы не показывать посетителям вашего сайта анонсы своих будущих публикаций? Для этого вы можете воспользоваться следующим образцом кода:

<?php
// устанавливаем нужные аргументы для запроса
$args = array(
  'post_status' => 'future', // нам нужны публикации, имеющие статус запланированных (future)
  'nopaging' => true // это не обязательно, но не разбивать результаты на страницы
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

Как видите, все просто! Фактически нам нужен только один параметр аргументов — 'post_status' => 'future'.

 

Практический пример №10: запрос прилепленных публикаций

И напоследок давайте выведем все посты, отмеченные как прилепленные. Прилепленные — это означает, что таким публикациям дан больший приоритет среди других. Такие посты начинают отображаться на сайте (главная страница и при использовании второстепенных запросов) первыми, но кроме страниц категорий и тегов. Если «прилепленных» sticky постов больше одного, — тогда они будут сортироваться между собой по дате публикации. Вот только такие параметры для аргументов запроса нам нужны:

<?php
// устанавливаем нужные аргументы для запроса
$args = array(
  'post__in' => get_option( 'sticky_posts' ), ​​// получаем массив ID-ишек всех прилепленных публикаций
  'posts_per_page' => -1, // снимаем ограничения по количеству на страницу, — то есть показывать все
  'ignore_sticky_posts' => 1 // игнорировать "повышенный" приоритет таких постов (необязательно)
);
// создаем новый экземпляр класса для нашего кастомного запроса
$my_query = new WP_Query( $args );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>

 

 

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

Спасибо за внимание!

 

Recent Posts

Зигмунд Фрейд

Когда ты умер, ты об этом не знаешь. Только другим тяжело. То же самое, когда…

5 дней ago

Подбор игрового ноутбука для комфортного прохождения S.T.A.L.K.E.R 2

Как для человека, который прошел каждую из 3 оригинальных игр серии, и на относительно слабеньком…

7 дней ago

Как научиться менеджменту в Украине?

Если вы закончили школу и хотите посвятить себя процессу управления бизнесом (любого уровня), тогда перед…

1 неделя ago

Использование запросов WP_Query в WordPress — часть 9 (аргументы для метаданных)

В сегодняшней части серии уроков по запросам WP_Query в ВордПресс мы будем рассматривать аргументы, которые…

2 недели ago

Использование запросов WP_Query в WordPress — часть 8 (аргументы для таксономий)

Сегодняшняя часть серии уроков по запросам WP_Query в ВордПрессе будет посвящена рассмотрению аргументов, которые можно…

2 недели ago

Использование запросов WP_Query в WordPress — часть 7 (аргументы для получения категорий, тегов)

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

2 недели ago