WordPress tax_query: использование оператора LIKE

7 февр. 2014 г., 07:23:40
Просмотры: 19.4K
Голосов: 4

У меня есть таксономия "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?

3
Комментарии

Вы пробовали решение из этой ветки: http://wordpress.stackexchange.com/questions/123298/term-begins-with-a-letter?

1fixdotio 1fixdotio
7 февр. 2014 г. 09:50:12

Я попытался получить ID термина, соответствующего поиску, используя функцию get_terms с аргументом name_like и сгенерировать tax_query с оператором IN.

B L Praveen B L Praveen
7 февр. 2014 г. 12:07:30

Поддерживает ли get_posts аргумент operator в tax_query? В справочнике функций ничего не упоминается о tax_query с оператором. Это объясняется только в WP_Query.

B L Praveen B L Praveen
7 февр. 2014 г. 12:11:39
Все ответы на вопрос 4
1

Единственный вариант — написать собственный SQL-запрос, используя фильтр posts_clauses, где вы получаете массив с условиями JOIN, WHERE, ORDER и другими, которые можно изменять, дополнять, удалять и т.д.

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

7 февр. 2014 г. 17:38:51
Комментарии

:) Добавлено примечание о защите вашей базы данных.

Eric Holmes Eric Holmes
7 февр. 2014 г. 18:12:22
2

Как упоминалось в других ответах, вы не можете просто выполнить поиск с помощью 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,
        ],
    ],
]);
23 февр. 2018 г. 14:54:52
Комментарии

это умно и чище, спасибо.

gdaniel gdaniel
30 апр. 2020 г. 17:45:27

В tax_query вам нужно использовать term_id для значения поля.

adamalexanderw adamalexanderw
20 февр. 2023 г. 11:41:53
0

WP_Tax_Query или параметр таксономии в WP_Query и get_posts() принимает только следующие значения для аргумента operator:

'operator' строка (необязательно)
Возможные значения: 'AND', 'IN' или 'NOT IN'.
Значение по умолчанию: 'IN'

Таким образом, вы не можете использовать LIKE в качестве operator.

7 февр. 2014 г. 12:21:08
0

На самом деле вам не нужно использовать операторы сравнения в запросах таксономий (но в запросах метаполей — да).

Таким образом, эта изменённая часть должна работать как 'LIKE' по умолчанию:

foreach($taxonomies as $taxonomy) {
            $tax_query  = array(
                'taxonomy'  =>  $taxonomy;
                'field'     =>  'slug';
                'terms'     =>  $search;
            );
        }
28 мар. 2020 г. 12:56:51