В сегодняшней 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.
Спасибо за внимание!
Когда ты умер, ты об этом не знаешь. Только другим тяжело. То же самое, когда…
Как для человека, который прошел каждую из 3 оригинальных игр серии, и на относительно слабеньком…
Если вы закончили школу и хотите посвятить себя процессу управления бизнесом (любого уровня), тогда перед…
В сегодняшней части серии уроков по запросам WP_Query в ВордПресс мы будем рассматривать аргументы, которые…
Сегодняшняя часть серии уроков по запросам WP_Query в ВордПрессе будет посвящена рассмотрению аргументов, которые можно…
Этот практический урок будет посвящен рассмотрению аргументов, которые можно использовать для получения публикаций определенных категорий…