Класс WP_Tax_Query
в WordPress предназначен для реализации запросов по таксономиям, позволяя фильтровать результаты основной выборки по терминам таксономий. Он генерирует SQL-части, которые затем добавляются к основному запросу, позволяя гибко управлять выводимыми данными.
class WP_Tax_Query {}
WP_Tax_Query
— это вспомогательный класс, который генерирует SQL-запросы с использованием операторов JOIN и WHERE, чтобы фильтровать результаты в зависимости от указанных терминов таксономий. Это делает его незаменимым инструментом при работе с классами, такими как WP_Query
, которые требуют фильтрации данных по терминам.
Основные функции
Класс использует другие компоненты WordPress, такие как WP_Term_Query
, для предварительной обработки параметров запросов, что позволяет минимизировать количество JOIN в SQL-запросах. Таким образом, он оптимизирует производительность и скорость выборки данных.
$taxquery = new WP_Tax_Query( $tax_query );
$sql = $taxquery->get_sql( $primary_table, $primary_id_column );
Параметры запроса
$tax_query
— это массив, содержащий параметры для запроса таксономий, где каждый элемент является массивом с параметрами конкретного запроса. Структура выглядит следующим образом:
$tax_query = [
'relation' => 'OR',
[
'taxonomy' => 'custom_tag',
'terms' => [ 'Innovation', 'Technology' ],
'field' => 'name',
'operator' => 'AND',
],
[
'relation' => 'AND',
[
'taxonomy' => 'custom_category',
'terms' => 'space_exploration',
'field' => 'slug',
],
[
'taxonomy' => 'post_format',
'terms' => [ 'post-format-video', 'post-format-article' ],
'field' => 'slug',
'operator' => 'IN',
],
],
];
Аргументы запроса
- relation (строка): Определяет, как выбираются записи из указанных таксономий. Может быть
'AND'
или'OR'
. По умолчанию —'AND'
. - taxonomy (строка): Название таксономии.
- field (строка): Указывает поле для термина. Может быть:
id
илиterm_id
— для ID терминов.name
— для названий терминов.slug
— для ярлыков терминов.
- terms (число/строка/массив): Список терминов таксономии, по которым нужно фильтровать записи.
- operator (строка): Оператор для сравнения терминов. Может быть:
IN
— записи из указанных терминов (по умолчанию).NOT IN
— записи, не относящиеся к указанным терминам.AND
— записи, относящиеся ко всем указанным терминам.EXISTS
— записи, у которых есть хотя бы один термин таксономии.NOT EXISTS
— записи, у которых нет ни одного термина таксономии.
- include_children (логический): Включать ли записи из дочерних терминов (для иерархических таксономий). По умолчанию —
true
.
Пример 1: Генерация SQL-запроса
Предположим, у нас есть таксономия с названием product_category
, и мы хотим получить записи, относящиеся к терминам с ID 201 и 305.
$tax_query = [
[
'taxonomy' => 'product_category',
'terms' => [ 201, 305 ],
'field' => 'term_id',
'include_children' => true,
]
];
$taxquery = new WP_Tax_Query( $tax_query );
$sql = $taxquery->get_sql( 'wp_products', 'product_id' );
print_r($sql);
Результат может выглядеть так:
Array
(
[join] => LEFT JOIN wp_term_relationships ON (wp_products.product_id = wp_term_relationships.object_id)
[where] => AND ( wp_term_relationships.term_taxonomy_id IN (201, 305) )
)
Пример 2: Обработка отсутствующих терминов
Если один из терминов с ID 201 не существует, результат будет следующим:
$tax_query = [
[
'taxonomy' => 'product_category',
'terms' => [ 999, 305 ], // 999 не существует
'field' => 'term_id',
]
];
$taxquery = new WP_Tax_Query( $tax_query );
$sql = $taxquery->get_sql( 'wp_products', 'product_id' );
print_r($sql);
Результат:
Array
(
[join] => LEFT JOIN wp_term_relationships ON (wp_products.product_id = wp_term_relationships.object_id)
[where] => AND ( wp_term_relationships.term_taxonomy_id IN (305) )
)
Пример 3: Использование ярлыков терминов
Для выполнения запроса по ярлыкам, например, new-products
и best-sellers
, код будет выглядеть так:
$tax_query = [
[
'taxonomy' => 'product_category',
'terms' => [ 'new-products', 'best-sellers' ],
'field' => 'slug',
]
];
$taxquery = new WP_Tax_Query( $tax_query );
$sql = $taxquery->get_sql( 'wp_products', 'product_id' );
print_r($sql);
Результат SQL-запроса будет аналогичным предыдущему примеру, но с использованием ID терминов, связанных с указанными ярлыками.
Заключение
Класс WP_Tax_Query
является мощным инструментом для работы с таксономиями в WordPress. Он позволяет создавать гибкие и оптимизированные запросы, фильтруя данные по терминам таксономий. С правильным использованием этого класса можно значительно повысить производительность и скорость выборки данных из базы данных.