WordPress tax_query: использование оператора LIKE
У меня есть таксономия "color", связанная с пользовательским типом записи. Я вывожу все метаданные записей и таксономии в таблице. В таблице есть возможность поиска записей по введенному значению.
При вводе поискового запроса выполняется AJAX-запрос для получения соответствующих записей.
Вот запрос для получения всех записей, соответствующих поисковой строке:
function get_query_posts_custom($post_id,$start,$length) {
// Аргументы для get_posts
$args = array(
'post_type' => 'custom_post',
'post_status' => array('publish'),
'numberposts' => $length,
'offset' => $start,
'orderby' => 'menu_order',
'order' => 'asc',
'post_parent' => $_product->id
);
// Получаем таксономии пользовательского типа записи
$taxonomies = (array) maybe_unserialize(get_post_meta($post_id, 'post_taxonomy', true));
if(empty($attributes)) {
$taxonomies = array();
}
$meta_keys = array('type','code','key');
if(!empty($search)) {
foreach($meta_keys as $meta_key) {
$meta_query[] = array(
'key' => $meta_key,
'value' => $search,
'compare' => 'LIKE'
);
}
$args['meta_query'] = $meta_query;
$tax_query = array();
foreach($taxonomies as $taxonomy) {
$tax_query = array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $search,
'operator' => 'LIKE'
);
}
if(count($tax_query)) {
$args['tax_query'] = $tax_query;
}
}
$results = get_posts($args);
return $results;
}
Как получить записи, соответствующие поисковой строке для таксономии?
Я проверил справочник функций WordPress - там указано, что для tax_query допустимы только операторы 'IN', 'NOT IN', 'OR' и 'AND'. Можно ли использовать оператор LIKE?

Единственный вариант — написать собственный SQL-запрос, используя фильтр posts_clauses
, где вы получаете массив с условиями JOIN
, WHERE
, ORDER
и другими, которые можно изменять, дополнять, удалять и т.д.
ОЧЕНЬ ВАЖНОЕ ЗАМЕЧАНИЕ: всегда используйте функцию prepare
глобального объекта $wpdb
, которая санирует все ваши данные. Нельзя допускать возможность инъекций через кастомные запросы с поисковыми терминами. :)

Как упоминалось в других ответах, вы не можете просто выполнить поиск с помощью LIKE
используя tax_query
.
Что вы можете сделать, так это либо изменить SQL-запрос с помощью фильтров, как предложил @Eric Holmes (это продвинутая техника, и вы должны понимать, что делаете), либо сначала выполнить отдельный запрос для загрузки таксономических терминов (используя LIKE
), а затем загрузить сами записи.
Вот простой пример загрузки записей, связанных с любыми терминами, соответствующими условию LIKE
для переменной $search
.
// Загружаем термины с использованием LIKE
$termIds = get_terms([
'name__like' => $search, // Поиск по названию термина
'fields' => 'ids' // Возвращаем только ID терминов
]);
// Загружаем записи, используя найденные ID терминов
$posts = get_posts([
'tax_query' => [
'relation' => 'OR', // Используем OR для объединения условий
[
'taxonomy' => 'yourtaxonomy', // Указываем название таксономии
'field' => 'id', // Сравниваем по ID термина
'terms' => $termIds, // Передаем найденные ID терминов
],
[
'taxonomy' => 'othertaxonomy', // Вторая таксономия для поиска
'field' => 'id',
'terms' => $termIds,
],
],
]);

WP_Tax_Query или параметр таксономии в WP_Query
и get_posts()
принимает только следующие значения для аргумента operator
:
'operator' строка (необязательно)
Возможные значения: 'AND', 'IN' или 'NOT IN'.
Значение по умолчанию: 'IN'
Таким образом, вы не можете использовать LIKE
в качестве operator
.

На самом деле вам не нужно использовать операторы сравнения в запросах таксономий (но в запросах метаполей — да).
Таким образом, эта изменённая часть должна работать как 'LIKE' по умолчанию:
foreach($taxonomies as $taxonomy) {
$tax_query = array(
'taxonomy' => $taxonomy;
'field' => 'slug';
'terms' => $search;
);
}
