Создание динамических веб-сайтов WordPress во многом зависит от вашей способности извлекать определенный контент. Это руководство посвящено запросам записей – методу извлечения и отображения целевых записей на основе ваших критериев. Мы рассмотрим два метода: WP_Query
или get_posts()
, а также их функции и практические примеры.
Выбор метода запроса WP_Query или get_posts()
WordPress предлагает два способа запросить записи: get_posts()
и WP_Query
. Оба метода эффективны, но выбор зависит от ваших предпочтений и незначительных нюансов производительности.
get_posts()
возвращает массив записей.WP_Query
создает объект запроса, который предоставляет больше гибкости в работе с результатами.
Важно отметить, что использование get_posts()
может повлиять на глобальный цикл запросов WordPress, если не позаботиться о его правильной очистке.
Настоящее волшебство заключается в аргументах, которые вы предоставляете get_posts()
или WP_Query
. Эти аргументы определяют параметры выборки записей. Давайте углубимся в некоторые часто используемые аргументы:
post_type
: Укажите тип записей, которые вы хотите получить, например, “post” (запись), “page” (страница) или пользовательские типы записей.posts_per_page
: Определите количество записей, отображаемых на странице. Используйте-1
для получения всех записей.category__in
: Выберите записи, принадлежащие определенным категориям (список идентификаторов категорий, разделенных запятыми).post__not_in
: Исключите записи с определенными идентификаторами из результатов (массив идентификаторов записей).orderby
: Сортируйте записи по различным критериям, таким как “date” (дата), “title” (заголовок) или пользовательские поля.meta_query
: Выборка записей на основе пользовательских метаданных для расширенной фильтрации.
Для большинства случаев, когда нужна выборка записей по простым критериям, get_posts()
– отличный выбор. Но если вам нужна пагинация, фильтрация или более сложная работа с результатами, WP_Query
предоставит необходимую гибкость.
Глобальный запрос? Не беспокойтесь!
В каждой странице WordPress по умолчанию выполняется один глобальный запрос. Например, при посещении пользователем архива категории, WordPress автоматически выполняет запрос для отображения соответствующих записей. Темы обычно используют цикл (the loop
) для доступа к записям из этого запроса.
Создание нового запроса с собственным циклом внутри глобального цикла требует осторожности, чтобы избежать конфликтов. Однако, если ваша цель – изменить существующий глобальный запрос WordPress, это совсем другая история, которую мы рассмотрим в отдельной статье.
get_posts() – Простота и скорость
get_posts()
– это удобный способ получить массив записей по вашим критериям. Он подходит для ситуаций, когда не требуется сложная фильтрация или пагинация.
Преимущества:
- Простота: Легко использовать и внедрять в код темы.
- Скорость: Работает быстрее
WP_Query
, особенно при большом количестве записей.
Недостатки:
- Ограниченная гибкость: Не подходит для сложных запросов с пагинацией или фильтрацией по мета-полям.
$custom_query = get_posts(array(
// Ваши аргументы выборки
));
foreach ($custom_query as $custom_post) {
// Доступ к свойствам текущей записи (нельзя использовать шаблонные функции типа the_title() и тд..)
}
Если необходимо использовать шаблонные функции, тогда можно использовать следующий код:
$custom_query = get_posts(array(
// Ваши аргументы выборки
));
foreach ($custom_query as $post) {
setup_postdata($post);
// теперь функции будут работать
the_title();
}
wp_reset_postdata();
Вспомогательные функции
setup_postdata($post)
– Устанавливает глобальный объект записи для использования шаблонных функций внутри циклаforeach
.wp_reset_postdata()
– Сбрасывает глобальный объект записи после цикла.
WP_Query – Гибкость и контроль
WP_Query
создает объект запроса, предоставляющий полный контроль над результатами.
Преимущества:
- Гибкость: Позволяет строить сложные запросы с фильтрацией по различным параметрам (категории, теги, мета-поля) и реализовать пагинацию.
- Управление результатами: Предоставляет больше возможностей для работы с полученными записями.
Недостатки:
- Сложность: Требует более глубокого понимания структуры запросов WordPress.
- Производительность: Может работать чуть медленнее
get_posts()
при большом количестве записей.
$custom_query = new WP_Query(array(
// Ваши аргументы выборки
));
if ($custom_query->have_posts()) {
while ($custom_query->have_posts()) : $custom_query->the_post();
// Доступ к свойствам текущей записи
the_title();
endwhile;
wp_reset_postdata();
}
Эксклюзивные курсы на Udemy – это твой ключ к востребованным навыкам и успешной карьере. Я вложил всю душу в их создание, чтобы ты получил знания высочайшего качества по доступной цене.
Аргументы запросов в WordPress (WP_Query)
Для управления выборкой записей в WordPress класс WP_Query
предоставляет множество параметров (аргументов). Полный список аргументов можно найти в документации WP_Query.
Примеры аргументов:
- Поиск по таксономии (категориям, тегам и т.д.)
- Фильтрация по мета-данным записей (дополнительным полям)
- Выбор по типу записей (страницы, посты, товары и т.д.)
- Включение или исключение определенных записей
- Сортировка результатов по различным критериям
Рассмотрим несколько распространенных примеров использования аргументов для выборки записей.
Пример 1: Связанные записи из той же категории
Допустим, вы хотите отобразить блок “Похожие записи” в конце каждой статьи. Он должен показывать случайный выбор из 3-х записей той же категории, что и текущая статья, исключая саму текущую запись.
$post_id = get_the_ID(); // ID текущей записи
$custom_query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 3,
'category__in' => wp_get_post_categories($post_id),
'post__not_in' => [$post_id],
'orderby' => 'rand'
]);
Разберем аргументы:
post_type
– указывает тип записей, которые нужно выбрать (“post” – обычные записи).posts_per_page
– определяет количество записей на странице (3).category__in
– фильтрует записи по категориям. Мы используемwp_get_post_categories
для получения массива идентификаторов категорий текущей записи.post__not_in
– исключает конкретные записи по ID (текущая запись).orderby
– задает порядок сортировки результатов (“rand” – случайный порядок). Документация по возможным вариантам сортировки – здесь: URL orderby query post wordpress.
Пример 2: Все записи кастомного типа с несколькими критериями сортировки
Предположим, у вас есть кастомный тип записей “book” (книги), и на странице шаблона вы хотите отобразить все опубликованные книги. Сортировка должна быть выполнена сначала по “menu_order” (порядку в меню, который можно задать для каждой книги), а затем по названию.
$custom_query = new WP_Query([
'post_type' => 'book',
'posts_per_page' => -1,
'orderby' => ['menu_order' => 'ASC', 'title' => 'DESC']
]);
Разберем аргументы:
post_type
– указывает тип записей (“book”).posts_per_page
– значение “-1” означает выбор всех записей (опубликованных, если не указано иначе в аргументеpost_status
).orderby
– массив для указания критериев сортировки. Сначала сортировка по “menu_order” по возрастанию (ASC), затем по названию (title) по убыванию (DESC).
Пример 3: Записи с определенными мета-данными
Допустим, у вас есть кастомный тип записей “book” (книги), и вы хотите выбрать все книги, которые либо не опубликованы, либо опубликованы между 2000 и 2022 годом. Год храниться как отдельное мета поле для поста.
$custom_query = new WP_Query([
'post_type' => 'book',
'posts_per_page' => -1,
'meta_query' => [
'relation' => 'OR',
[
'key' => 'book_status',
'value' => 'unpublished',
'compare' => '='
],
[
'key' => 'year_published',
'value' => [2000, 2022],
'type' => 'numeric',
'compare' => 'BETWEEN'
]
]
]);
Разберем аргументы:
meta_query
– массив для определения условий по мета-данным записей.relation
– указывает отношение между условиями (“OR” – ИЛИ, “AND” – И).- Вложенные массивы внутри
meta_query
описывают отдельные условия:key
– ключ мета-данных (например, “book_status” или “year_published”).value
– значение мета-данных, с которым нужно сравнить.compare
– оператор сравнения (например, “=”, “!=”, “<“, “>”, “BETWEEN”).type
– тип данных мета-данных (по умолчанию строковый, для числовых значений – “numeric”).
Заключение. WP_Query или get_posts?
В этой статье мы подробно рассмотрели два основных метода запросов записей в WordPress. Узнали как строиться запрос и цикл и в каких случаях какой подход лучше использовать:
get_posts() – простой и быстрый метод, который подходит для простых запросов без сложной фильтрации или пагинации. Он возвращает массив записей.
WP_Query – более гибкий и мощный метод, который позволяет создавать сложные запросы с фильтрацией по различным параметрам и реализовать пагинацию. WP_Query возвращает объект запроса, предоставляющий полный контроль над результатами.