Объяснение операторов сравнения meta_query
Я заметил, что существует множество операторов, которые можно использовать для сравнения в meta_query.
Однако я не совсем уверен, какой оператор следует использовать, иногда это вызывает путаницу, например, операторы =
и LIKE
.
Я хотел бы узнать, что точно означает каждый оператор и в каких случаях их следует использовать.
= // Точное совпадение
!= // Не равно
> // Больше чем
>= // Больше или равно
< // Меньше чем
<= // Меньше или равно
LIKE // Частичное совпадение текста
NOT LIKE // Исключение частичного совпадения
IN // Значение находится в массиве
NOT IN // Значение не находится в массиве
BETWEEN // Значение находится между двумя числами
NOT BETWEEN // Значение не находится между двумя числами
NOT EXISTS // Метаполе не существует
Спасибо.

Первые несколько операторов работают так, как вы ожидаете:
= равно
!= не равно
> больше чем
>= больше или равно
< меньше чем
<= меньше или равно
LIKE и NOT LIKE
LIKE
и NOT LIKE
— это SQL-операторы, которые позволяют использовать подстановочные символы, поэтому вы можете создать мета-запрос, который выглядит так:
array(
'key' => 'name',
'value' => 'Pat',
'compare' => 'LIKE'
)
Это вернет все записи, где мета-значение "name" содержит строку "Pat". В этом случае будут возвращены записи с "Pat", "Patricia" и "Patrick". Подробное объяснение (не связанное с WordPress) можно найти здесь.
Добавлять подстановочный символ %
не обязательно, так как он добавляется по умолчанию, как упомянул @Herb в своем ответе. Вот так: $meta_value = '%' . like_escape( $meta_value ) . '%';
— см. источник.
IN и NOT IN
IN
и NOT IN
выбирают совпадения, которые находятся (или не находятся) в заданном массиве. Например, можно сделать так:
array(
'key' => 'color',
'value' => array('red', 'green', 'blue')
'compare' => 'IN'
)
Это вернет все записи, где цвет установлен в red, green или blue. Использование 'NOT IN' даст обратный результат — любые записи, у которых значение отличается от указанных в массиве.
Сгенерированный SQL для этого запроса будет выглядеть примерно так:
SELECT * FROM posts_meta WHERE value IN ("red", "green", "blue")
BETWEEN и NOT BETWEEN
BETWEEN
и NOT BETWEEN
позволяют определить диапазон допустимых значений и требуют указания двух значений в массиве внутри meta_query:
array(
'key' => 'price',
'value' => array(20,30)
'compare' => 'BETWEEN'
)
Это вернет все записи, где цена находится в диапазоне от 20 до 30. Здесь можно найти пример с датами.
NOT EXISTS
NOT EXISTS
работает так, как звучит — мета-значение не установлено или равно null. Для такого запроса нужны только ключ и оператор сравнения:
array(
'key' => 'price',
'compare' => 'NOT EXISTS'
)
Вот пример, где нужно было запросить отсутствующие мета-значения и интегрировать их с другими запросами.
Надеюсь, это поможет!

Примечание: Если вы используете массив meta_query
, ваши ключи не должны содержать префикс meta_
. Если вы используете $query->meta_key
, $query->meta_value
и т.д., то эти префиксы должны оставаться.

Не могу найти объяснение, что делает опция сравнения "IN". Кто-нибудь знает, как это работает?

@Joe, не знаю, почему я не добавил ничего про "IN" и "NOT IN". Я отредактировал и обновил ответ с этими вариантами сравнений.

Это отличный ответ, но сейчас доступно ещё несколько вариантов: https://codex.wordpress.org/Class_Reference/WP_Meta_Query

есть ли информация об этом в документации где-нибудь, Herb? Следует ли изменить пример, убрав %
?

Да, следует, я как раз сейчас это сделал, посмотрите исходный код, тогда становится совершенно ясно, что Herb прав. @guiniveretoo
