Совершенствование запросов в современных версиях WordPress
За прошедший год много статей было посвящено улучшениям и нововведениям в WordPress. Сегодня я хочу рассказать вам об одном из самых интересных изменений для разработчиков: совершенствовании конкретных типов запросов.
Главные изменения:
- Внедрение поддержки вложенных запросов для запросов к метаданным записи, датам и терминам таксономии;
- Дополнительные параметры для запросов к комментариям;
- Несколько исправленных багов.
Вложенные запросы
В предыдущих версиях WordPress в запросах к терминам таксономий, датам и метаданным можно было использовать выражение AND или OR. К примеру, на кулинарном сайте следующие аргументы можно было использовать в запросе для получения рецептов быстрого завтрака:
<?php
$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'speed',
'field' => 'slug',
'terms' => array( 'quick' )
),
array(
'taxonomy' => 'meal',
'field' => 'slug',
'terms' => array( 'breakfast' )
)
)
);
$query = new WP_Query( $args );
?>
Такой запрос осуществляет поиск по таксономиям 'speed' и 'meal', и выдает записи с соответствующими терминами 'quick' и 'breakfast'. Но что если нам нужно создать более комплексный запрос? Предположим, вам нужен рецепт быстрого завтрака, а также рецепты традиционных полдников.
В такой ситуации вы не можете использовать выражение AND, так как в результате получите быстрые и традиционные рецепты, как для обеда, так и для завтрака, а нам это не подходит. И также нельзя использовать выражение OR, которое связывает все искомые термины.
Теперь у нас появилась возможность выполнять подобные комплексные запросы. Чтобы получить рецепты быстрого завтрака и традиционные обеденные рецепты, нужно будет использовать следующий код:
<?php
$query = new WP_Query(
array(
'tax_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'taxonomy' => 'meal',
'field' => 'slug',
'terms' => array( 'breakfast' )
),
array(
'taxonomy' => 'speed',
'field' => 'slug',
'terms' => array( 'quick' )
)
),
array(
'relation' => 'AND',
array(
'taxonomy' => 'meal',
'field' => 'slug',
'terms' => array( 'lunch' )
),
array(
'taxonomy' => 'speed',
'field' => 'slug',
'terms' => array( 'slow' )
)
)
)
)
);
$query = new WP_Query( $args );
?>
Здесь мы использовали два вложенных массива:
- Внешний массив использует выражение OR, так как здесь мы ищем рецепты быстрых завтраков или традиционных полдников;
- Первый вложенный массив ищет рецепты быстрых завтраков при помощи выражения AND, так как нам нужно, чтобы в записях присутствовали оба термина;
- Второй вложенный массив ищет рецепты традиционных полдников при помощи AND.
Конечно, можно изменить эти запросы, указав определенные термины таксономий и значения.
Применяем вложенные запросы: термины таксономий, метаданные и даты
В приведенном выше примере используются термины таксономий, но такие же возможности были реализованы и для запросов, направленных к датам и метаданным.
Синтаксис работает одинаково в запросах и к датам, и к метаданным. В мета-запросах вы заменяете tax_query на meta_query и используете 'key' и 'value' в качестве значений. В запросах к датам вы заменяете tax_query на date_query и используете параметры дат, представленные в кодексе WordPress.
Параметры для комментариев
Чтобы выполнять запросы к комментариям, вместо класса WP_Query следует использовать WP_Comment_Query. Этот класс приобрел 8 новых параметров:
- 'author__in': идентифицирует автора комментария (или массив авторов);
- 'author__not_in': исключить комментарий автора по ID (или массива авторов);
- 'post_author__in': идентифицирует автора (или массив авторов) записи, к которой был оставлен комментарий;
- 'post_author__not_in': исключает комментарии, оставленные к записям конкретного автора или массива авторов;
- 'comment__in': комментарии с конкретным ID или массивом ID;
- 'comment__not_in': исключает комментарии с конкретным ID или массивом ID;
- 'post__in': дочерние комментарии, оставленные к записи или массиву записей (используется ID записи);
- 'post__not_in': исключить дочерние комментарии, оставленные к записи или массиву записей (используется ID записи).
Здесь в качестве значений используются ID автора, комментария или записи.
Учтите, что класс WP_Comment_Query теперь также поддерживает вложенные запросы.
Исправления
- Исправлен баг, который вызывал ошибку запроса, если в нем с date_query использовались tax_query или meta_query;
- Исправлена ошибка запроса ‘orderby' => 'meta_value’ при передаче в WP_Query 'meta_query' с выражением OR.
Более подробно обо всех изменениях можно узнать на сайте WordPress.
В завершение
Возможность использовать вложенные запросы означает, что вы теперь можете получать контент более удобными методами. Было бы интересно увидеть примеры того, как вы будете использовать эти запросы!