Взгляд внутрь: создание собственных запросов в WordPress
В данной статье мы затронем вопрос создания запросов в WordPress. Несмотря на то, что в WordPress имеется хорошо задокументированная функция Query, она описана достаточно сложно, чтобы с ходу полностью в ней разобраться.
Ниже представлен пример её использования.

Мы обсудим некоторые практические моменты по реализации запросов в WordPress, которые часто бывают нужны при создании собственных тем.
Основы WP_Query
Если кратко, то WP_Query это класс, который запрашивает записи и страницы WordPress. Мы можем создать новый класс WP_Query в своей теме, чтобы запрашивать записи (или страницы) в собственном формате.
Сначала, давайте взглянем на файл index.php внутри папки с темой.
Там вы найдете следующий кусок кода:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Извините, отсутствуют записи, удовлетворяющие указанным критериям.'); ?></p>
<?php endif; ?>
Это называется цикл, который по умолчанию отображает все записи, которые были опубликованы.
Посмотрим, как мы можем настроить WP_Query по своему желанию. В этом примере, мы исключим записи из определенной категории.
Для начала, создадим экземпляр класса WP_Query в переменной:
$my_query = new WP_Query();
Также, мы можем указать ID категорий, которые мы хотим исключить при создании класса.
Например:
$my_query = new WP_Query('cat=-1,-5'); //исключаем категории 1 и 5
Затем, мы ссылаемся на переменную внутри цикла следующим образом.
<?php if ( $my_custom_query->have_posts() ) : while ( $my_custom_query->have_posts() ) : $my_custom_query->the_post(); ?>
<div class="title">
<a href="<?php the_permalink() ;?>"><?php the_title() ;?></a>
</div>
<?php endwhile; else: ?>
<p>
<?php _e('Извините, отсутствуют записи, удовлетворяющие указанным критериям.'); ?>
</p>
<?php endif; ?>
Заметьте, что когда имеются множественные запросы внутри одной страницы, вам нужно заключить их внутрь функции wp_reset_postdata().
Согласования запросов с постраничной навигацией WP-PageNavi
WP-PageNavi это возможно самый популярный плагин для добавления постраничной навигации в WordPress. Однако у большинства людей возникает ошибка при использовании данного плагина и кастомной функции WP_Query. Постраничная навигация просто не работает.
Начиная с версии 2.74, плагин WP-PageNavi содержит опцию, с помощью которой вы можете назначить свой собственный запрос.
Взяв за основу запрос, написанный выше, попробуем сделать следующее:
wp_pagenavi( array( 'query' => $my_query ) );
… и это должно решить проблему.
Кэш запроса
Следует заметить, что когда у вас несколько запросов на одной странице, это приведет к увеличенной загрузке сервера и негативно скажется на производительности сайта.
Одним из способов оптимизации является использование Transient API. В данном случае, мы используем его для кэширования запрошенных из WP_Query объектов.
Таким образом, можно ускорить обработку запросов путем использования кэшированной информации вместо постоянного выполнения этих запросов заново.
Ниже дан пример с реализацией кэширования на 24 часа:
if ( ! ( $my_query = get_transient( 'my_query_cache' ) ) ) {
$my_query = new WP_Query('cat=-1,-5');
set_transient( 'my_query_cache', $my_query, DAY_IN_SECONDS );
}
Заключение
С помощью WP_Query, мы можем создавать как простые, так и достаточно сложные запросы. Если написание собственного варианта функции WP_Query кажется вам слишком сложным, то имеется инструмент под названием WP_Query Generator, который упростит выполнение этой задачи.
Надеюсь, статья оказалась для вас полезной!