Взгляд внутрь: создание собственных запросов в 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, который упростит выполнение этой задачи.

Надеюсь, статья оказалась для вас полезной!

РедакцияПеревод статьи «A Look Into: Creating Custom WordPress Query»