Введение в WP_Query: работа с записями в WordPress

# Введение в WP_Query

WP_Query — это класс на PHP, который позволяет получать записи из базы данных по различным критериям. Например, вы можете извлекать записи:

- в определённый временной промежуток;
- из заданной категории или тегов;
- свежие, случайные или популярные записи;
- записи с заданными пользовательскими полями или набором таких полей.

WP_Query используется в WordPress для любых запросов, связанных с записями. Например, при создании любой страницы WordPress запрос WP_Query хранится в глобальной переменной $wp_query, и кроме данных о записях, он также содержит информацию о текущей странице. Без использования WP_Query нельзя создать базовую страницу в WP.

Когда формируется стандартный цикл WordPress, данные берутся из глобальной переменной $wp_query и отображаются на экране с помощью вспомогательных функций: the_permalink(), the_content() и других.

Кроме списка записей в $wp_query, также хранится информация о текущем запросе. На основе этой информации WP определяет, на какой странице мы находимся (запись, архив, тег и т.д.). Информация о текущем запросе имеет смысл только для глобального объекта $wp_query (для объектов в подзапросах эта информация не имеет значения). Вы можете просмотреть, что содержится в глобальном объекте, следующим образом:

```php
print_r( $GLOBALS['wp_query'] );

Часто мы получаем информацию, не работая напрямую с этим классом и глобальными переменными — все это скрыто за кулисами. Мы используем набор готовых функций: условные метки, метки шаблона, связанные с выводом данных внутри цикла, и другие функции. Почти все условные метки ссылаются на этот класс.

Простое использование WP_Query

Вот как можно создать простой запрос:

$query = new WP_Query( [ 'category_name' => 'news' ] );

Таким образом, WordPress сделает запрос к базе данных, чтобы извлечь записи из категории "новости".

Теперь переменная $query содержит объект с результатами запроса. Давайте обработаем результат с помощью специальных методов:

while ( $query->have_posts() ) {
    $query->the_post();

    the_title(); // выводим заголовок записи
}
wp_reset_postdata(); // ВАЖНО: восстанавливаем глобальную $post

Если используется the_post() в цикле, обязательно вызовите функцию wp_reset_postdata() после цикла.

Функция have_posts() проверяет, есть ли записи в цикле (в объекте $query). Функция the_post() устанавливает глобальную переменную $post — в ней будет следующая запись из цикла, а также устанавливаются другие глобальные переменные. Все это позволяет использовать знакомые функции WP в цикле без передачи параметров: the_title(), the_content() и др.

Чтобы узнать более детально, как это работает, прочитайте о have_posts() и the_post().

Как не влиять на глобальную переменную $post

Если вам не нужны стандартные функции, работающие с глобальной переменной $post, вы можете использовать $query->next_post() вместо $query->the_post(). В этом случае глобальная переменная $post не будет изменена:

while ( $query->have_posts() ) {
    $my_post = $query->next_post();

    $url = get_permalink( $my_post );
}

Использование WP_Query с помощью foreach

Если параметры не передаются, запроса не будет, и будет создан только объект WP_Query.

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

// создаем экземпляр
$my_posts = new WP_Query;

// выполняем запрос
$myposts = $my_posts->query( [
    'post_type' => 'page'
] );

// обрабатываем результат
foreach( $myposts as $pst ) {
    echo esc_html( $pst->post_title );
}

Для лучшего понимания функций запросов изучите изображение ниже:

Изображение для понимания WP_Query


Заметка: Используйте класс WP_Query для получения и обработки записей с помощью гибкой и мощной системы запросов WordPress.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *