Meta_query, как искать, используя оба отношения OR & AND?
Решено: см. ответ ниже.
У меня есть пользовательский тип сообщения, КНИГИ. Он имеет несколько настраиваемых полей, а именно: TITLE, AUTHOR, GENRE, RATING. Как исправить мой код meta_query ниже, чтобы только книги, в которых есть слово поиска в пользовательских полях; название, автор, жанр; С ТОЧНОСТЬЮ рейтинг, указанный в моей форме поиска, отображается в результатах?
Я создал специальную форму поиска; текстовую область, которая будет искать по названию, автору и жанру; и раскрывающийся список, который будет искать рейтинг. Meta_query, который я сделал ниже, просматривает только название, автор и жанр. Но теперь я не понимаю, как добавить код для рейтинга.
Вот как я визуально представлял это с отношением meta_query:
(название ИЛИ автор ИЛИ жанр) И рейтинг
$args = array(
'relation' => 'OR',
array(
'key' => 'title',
'value' => $searchvalue,
'compare' => 'LIKE'
);
array(
'key' => 'author',
'value' => $searchvalue,
'compare' => 'LIKE'
);
array(
'key' => 'genre',
'value' => $searchvalue,
'compare' => 'LIKE'
);
),
array(
'relation' => 'AND',
array(
'key' => 'rating',
'value' => $ratingvalue,
'compare' => '=',
'type' => 'NUMERIC'
));
Я очень благодарен за вашу помощь и советы.
Ответы
Ответ 1
Я нашел решение с некоторой помощью.
Код ниже работал отлично.
$args => array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => 'title',
'value' => $searchvalue,
'compare' => 'LIKE'
),
array(
'key' => 'author',
'value' => $searchvalue,
'compare' => 'LIKE'
),
array(
'key' => 'genre',
'value' => $searchvalue,
'compare' => 'LIKE'
)
),
array(
'key' => 'rating',
'value' => $ratingvalue,
'compare' => '=',
'type' => 'NUMERIC'
)
)
);
Ответ 2
После нескольких проб и ошибок я нахожу решение этого. Это логично, я имею в виду, что meta_query не поддерживает массив для "ключа" поля, но давая массив в "ключ", я получаю идеальное решение. Я могу быть сумасшедшим, но он работает как шарм.
$args => array(
'relation' => 'AND',
array(
'key' => array('title','author','genre',),
'value' => $searchvalue,
'compare' => '='
),
array(
'key' => 'rating',
'value' => $ratingvalue,
'compare' => '=',
'type' => 'NUMERIC'
)
)
Вы получите предупреждение только для "trim()", поскольку мы передаем массив вместо строки. Подавите это предупреждение или добавьте что-нибудь, если найдете лучшее решение.