Как сделать частичное совпадение в Wordpress tax_query для пользовательской таксономии - PullRequest
2 голосов
/ 17 июня 2020

Мы ищем в таксономиях определенные термины. Поисковая фраза $search_data (в нашем примере: 4000342) берется из поля формы поиска.

Запрос выглядит так и уже работает в целом, когда поисковая фраза точно соответствует условиям:

$search_data = 4000342;
$args =  array (
    'post_type' => 'product',
    'tax_query' => array(
          array(
              'taxonomy' => 'pa_version',
              'field' => 'slug',
              'terms' => $search_data
          )
      ),
 ); 

В этом поиске отображаются все продукты с термином таксономии 4000342.

Но есть много разных терминов, которые содержат поисковую фразу (4000342) как часть термина, например: X C -KK-4000342-8.

Мы хотим показать все продукты, в которых термин таксономии содержит поисковую фразу.

Мы пробовали разные операторы в tax_query, но ни один из них, похоже, не работать в этом случае. Как сделать частичное совпадение, используя tax_query?

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

WP_Query не позволяет проводить сравнение LIKE для поиска по таксономии, поэтому вам нужно будет выполнить 2 шага:

  1. Сначала получить список всех слагов, которые частично соответствуют ваш поисковый запрос.
  2. Затем используйте этот список в вашем tax_query для поиска всех слагов, которые точно соответствуют слагам в этом списке.

1. Получить все краткие совпадения, которые частично совпадают

Используйте get_terms, чтобы получить список всех терминов, которые включают ваш поисковый запрос $search_data.

Вам не нужно регулярное выражение - get_terms уже имеет аргумент name__like, который будет выполнять частичное совпадение вместо полного совпадения.

$matching_terms = get_terms( array(
    'taxonomy' => 'pa_version',
    'fields' => 'slugs', // searches in the slug and returns an array of matching slugs
    'name__like' => $search_data, 
) );

Это вернет массив всех слагов, которые частично соответствуют вашему поисковому запросу, например ('4000342', 'XC-KK-4000342-8', '123440003425').

( Примечание: get_terms не возвращает пустые термины по умолчанию. Если вы хотите включить пустые термины, вы можете включить 'hide_empty' => false в аргументы.)

2. Используйте это в своем tax_query для поиска всех слагов, которые есть в этом списке

$args =  array (
    'post_type' => 'product',
    'tax_query' => array(
          array(
              'taxonomy' => 'pa_version',
              'field' => 'slug',
              'terms' => $matching_terms
          )
      ),
 ); 

Подробнее об этом и других параметрах WP__Term_Query можно узнать здесь , которые можно передать в get_terms

1 голос
/ 17 июня 2020

Вы можете сделать это с помощью регулярного выражения. Сначала вам нужно получить все термины:

$terms = get_terms( array(
    'taxonomy' => 'pa_version',
    'field' => 'slug',
) );

Затем получить результат регулярного выражения:

$filtered_terms = preg_grep('/' . $search_data . '/gm', $terms);

И использовать его в своем налоговом запросе:

$args =  array (
    'post_type' => 'product',
    'tax_query' => array(
        array(
            'taxonomy' => 'pa_version',
            'field' => 'slug',
            'terms' => $filtered_terms
        )
    ),
); 

Надеюсь, это поможет.

0 голосов
/ 17 июня 2020

Вам необходимо использовать отношение «ИЛИ» для отображения продуктов из обеих таксономий или отношение «И» для отображения продуктов из обеих таксономий, например:

$args =  array (
    'post_type' => 'product',
    'tax_query' => array(
          'relation' => 'OR',
          array(
              'taxonomy' => 'pa_version',
              'field' => 'slug',
              'terms' => 4000342,
          ),
          array(
              'taxonomy' => 'pa_version',
              'field' => 'slug',
              'terms' => 'XC-KK-4000342-8',
          )
      ),
 ); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...