Вложенные мета-запросы с WP_Meta_Query

Опубликовано: 05.09.2018

Если вы работаете со сложной структурой данных в WordPress, то вас приятно удивят новые возможности вложенных запросов с WP_Meta_Query в версии 4.1.

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

В новой версии WordPress 4.1 (которая выйдет в декабре 2014) данный параметр позволяет выполнять вложенные запросы для более сложной выборки данных. Чтобы понять как это работает, легче всего рассмотреть пример.

Предположим что мы выбираем автомобиль. Если цена автомобиля более $5000, то мы согласны только на красный цвет кузова, но если автомобиль дешевле $5000, то мы готовы рассмотреть и другие цвета: красный, зеленый, синий и желтый. С помощью вложенных структур в WP_Meta_Query наш запрос будет выглядеть следующим образом:

$query = new WP_Query( array( 'meta_query' => array( 'relation' => 'OR', array( 'relation' => 'AND', array( 'key' => 'price', 'value' => 5000, 'type' => 'numeric', 'compare' => '>=', ), array( 'key' => 'color', 'value' => 'red', ), ), array( 'relation' => 'AND', array( 'key' => 'price', 'value' => '5000', 'type' => 'numeric', 'compare' => '<', ), array( 'key' => 'color', 'value' => array( 'red', 'green', 'blue', 'yellow' ), 'compare' => 'IN', ), ), ), ) );

Здесь в параметре meta_query мы указываем два вложенных запроса с отношением (relation) OR. Это означает, что в выборку попадут записи, которые удовлетворяют требованиям хотя бы одного из двух запросов указанных далее в массивах.

Первый запрос:

array( 'relation' => 'AND', array( 'key' => 'price', 'value' => 5000, 'type' => 'numeric', 'compare' => '>=', ), array( 'key' => 'color', 'value' => 'red', ), ),

Он имеет вложенную структуру с двумя подзапросами и отношением AND, т.е. для вхождения в выборку данного запроса, должны выполниться оба его подзапроса: цена автомобиля равна или более 5000, и цвет равен красному.

Второй запрос:

array( 'relation' => 'AND', array( 'key' => 'price', 'value' => '5000', 'type' => 'numeric', 'compare' => '<', ), array( 'key' => 'color', 'value' => array( 'red', 'green', 'blue', 'yellow' ), 'compare' => 'IN', ), ),

Он также имеет вложенную структуру и два подзапроса с отношением AND, выбирает все автомобили стоимостью менее 5000 и красным, зеленым, синим или желтым цветом кузова.

Таким образом, вложенные структуры в WP_Meta_Query дают нам возможность выполнять более сложную выборку по мета-полям в базе данных WordPress. Стоит отметить, что подобный синтаксис доступен также для классов WP_Tax_Query и WP_Date_Query. До версии 4.1 подобные запросы приходилось строить самостоятельно на языке SQL, например с помощью фильтра posts_clauses.

Несмотря на расширенные возможности запросов по мета-данным в 4.1, не стоит забывать о производительности базы данных. Ведь тип поля meta_value в таблице wp_postmeta является текстовым, а его преобразование в числовой или любой другой тип во время поиска и сравнения означает, что серверу MySQL необходимо просканировать все строки с определенным ключом, без возможности использования дополнительных вспомогательных индексов.

Для большого количества данных подобные запросы могут стать медленными, и мы рекомендуем смотреть в сторону внешних систем индексирования и поиска данных, например Sphinx или Elasticsearch .

rss