SebWeo
В сегодняшней 10-й, заключительной части серии уроков по запросам WP_Query в ВордПресс мы наконец-то закрепим полученные теоретические знания на практике, и рассмотрим 10 наиболее полезных примеров. Это будет десять разных сценариев использования класса WP_Query, а также связанных с ним функций. Надеюсь, что они будут полезны для вас!
Данный прием очень популярен на блогах, — он позволяет лучше привлекать посетителей сайтов. Когда они прочитали определенную публикацию, при заинтересованности к теме, они могли бы продолжить чтение «родственных по теме», то есть похожих (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();
?>
Когда мы хотим получить все дочерние страницы к текущей (типа перечень подстраниц), вот как мог бы выглядеть подобный запрос:
<?php $current_page_id = get_the_ID(); // получаем ID текущей страницы // устанавливаем нужные аргументы для запроса $args = array( 'parent' => $current_page_id, // получаем дочерние страницы для текущей 'nopaging' => true // получить все имеющиеся страницы и не разбивать их на отдельные (без пагинации) ); // создаем новый экземпляр класса для нашего кастомного запроса $my_query = new WP_Query( $args ); // ... и далее по привычной схеме прорабатываем цикл // ... ?>
Предположим, вы хотите создать под каждым постом список последних публикаций из категории, в которую входит текущая публикация. И, конечно, нужно исключить текущий пост. Для этого запроса нам понадобятся только параметры 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 ); // ... и далее по привычной схеме прорабатываем цикл // ... ?>
Это похожий пример, но реализованный несколько по-другому, к первому практическому примеру. То есть одну и ту же задачу можно решать по-разному.
CMS WordPress не имеет встроенной системы подсчета просмотров публикаций, для этого требуются отдельные плагины (функции). Но это может замедлять работу сайта, поскольку при каждом просмотре публикации данный функционал будет взаимодействовать с базой данных (запись/чтение количества просмотров). Однако эту задачу можно решить другой реализацией: на основе количества комментариев. Чем больше комментариев — тем более популярной кажется публикация. А количество комментариев уже записано в базу данных — поэтому с классом WP_Query мы можем очень легко это задействовать:
<?php $args = array( 'orderby' => 'comment_count' // сортировка полученных постов по количеству комментариев ); // создаем новый экземпляр класса для нашего кастомного запроса $my_query = new WP_Query( $args ); // ... и далее по привычной схеме прорабатываем цикл // ... ?>
Как видите, это довольно легкое и простое решение. Вы можете немного усложнить его и, например, создать кастомный шаблон страницы под наиболее комментируемые публикации. Или что-то типа того.
Скажем, вы хотите сделать список постов определенного автора, и которые были опубликованы в текущем году. Для этого нам нужно только два параметра 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();
?>
Если вы посмотрите на современные шаблоны сайтов на 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(). Но этот вопрос не есть темой данного урока, поэтому детали я опущу.
Если вы увлекаетесь мудрыми высказываниями известных людей, вы могли бы их показывать в боковой панели сайта — сайдбаре. Как и в предыдущем примере, на вашем сайте должен быть зарегистрирован отдельный тип публикаций, например, под названием «quotes«, под нужды данного функционала. Итак, чтобы показывать цитаты в сайдбаре, да еще и в случайном порядке, воспользуйтесь следующим фрагментом кода в качестве примера:
<?php // устанавливаем нужные аргументы для запроса $args = array( 'post_type' => 'quotes', // нам нужны посты отдельного типа — quotes (цитаты) 'orderby' => 'rand', // условие функционала — рандомная сортировка 'posts_per_page' => 1, // будем показывать только одну цитату за один раз (за одно посещение страницы) ); // создаем новый экземпляр класса для нашего кастомного запроса $my_query = new WP_Query( $args ); // ... и далее по привычной схеме прорабатываем цикл // ... ?>
Простое и элегантное решение.
Это уже несколько более сложный пример применения класса 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 );
// ... и далее по привычной схеме прорабатываем цикл
// ...
?>
Вот такая идея: почему бы не показывать посетителям вашего сайта анонсы своих будущих публикаций? Для этого вы можете воспользоваться следующим образцом кода:
<?php // устанавливаем нужные аргументы для запроса $args = array( 'post_status' => 'future', // нам нужны публикации, имеющие статус запланированных (future) 'nopaging' => true // это не обязательно, но не разбивать результаты на страницы ); // создаем новый экземпляр класса для нашего кастомного запроса $my_query = new WP_Query( $args ); // ... и далее по привычной схеме прорабатываем цикл // ... ?>
Как видите, все просто! Фактически нам нужен только один параметр аргументов — 'post_status' => 'future'.
И напоследок давайте выведем все посты, отмеченные как прилепленные. Прилепленные — это означает, что таким публикациям дан больший приоритет среди других. Такие посты начинают отображаться на сайте (главная страница и при использовании второстепенных запросов) первыми, но кроме страниц категорий и тегов. Если «прилепленных» 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.
Спасибо за внимание!
В нашем путешествии по миру сокетов мы начали с "верхнего этажа" — WebSocket в браузере,…
В предыдущей статье мы говорили о WebSockets — технологии, позволяющей создавать интерактивные чаты в браузере.…
Кожа младенца – тонкая и нежная. Еще не справляется с защитой организма от внешних факторов.…
Представьте себе телефонный разговор. Вы звоните другу, он поднимает трубку, и вы можете говорить одновременно,…
Долгое время планшеты воспринимались исключительно как устройства для потребления контента: посмотреть YouTube, полистать ленту новостей…
Вы внесли правки в CSS, исправили критический баг в JavaScript, загрузили файлы на сервер и…