Создание динамических веб-сайтов 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 возвращает объект запроса, предоставляющий полный контроль над результатами.