Мета-запрос с шаблоном LIKE для строк, начинающихся с определенного значения
У меня есть пользовательский WP_Query со следующим meta_query:
$meta_query = array();
$meta_query['relation'] = 'AND';
if(!empty($postcode)) {
$meta_query[] = array(
'key' => 'postcode',
'value' => $postcode,
'compare' => 'LIKE'
);
}
if(!empty($email)) {
$meta_query[] = array(
'key' => 'email_address',
'value' => $email,
'compare' => 'LIKE'
);
}
Проблема в том, что WordPress оборачивает каждое meta_value в %%
для использования в сравнении LIKE
в запросе, например: WHERE meta_value LIKE '%hello@example.com%'
Можно ли настроить meta_query так, чтобы использовался только один знак процента, и мы могли проверять, начинается или заканчивается ли значение с определенной фразы? Например: WHERE meta_value LIKE 'hello@%'

Вы можете попробовать версию с REGEXP
:
'meta_query' => array(
array(
'key' => 'email_address',
'value' => '^hello@',
'compare' => 'REGEXP',
)
)
где ^
соответствует началу строки.
Вы можете проверить документацию MYSQL по REGEXP
здесь для получения дополнительной информации.
Обратите внимание, что это возможные значения параметра compare
в метазапросе:
'=', '!=', '>', '>=', '<', '<=',
'LIKE', 'NOT LIKE','IN', 'NOT IN',
'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS',
'REGEXP', 'NOT REGEXP', 'RLIKE'
согласно исходному коду WordPress 3.9.2.
Из документации MYSQL:
Название Описание
------------------------------------------------------
NOT REGEXP Отрицание REGEXP
REGEXP Сопоставление шаблонов с использованием регулярных выражений
RLIKE Синоним для REGEXP

Отличная работа, большое спасибо. Жаль, что в документации не указано REGEXP
в качестве допустимого значения для сравнения (Из http://codex.wordpress.org/Class_Reference/WP_Meta_Query Возможные значения: '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (только в WP >= 3.5) и 'NOT EXISTS' (также только в WP >= 3.5). Значение по умолчанию — '='.
)

Я обновил Codex, добавив дополнительные параметры: REGEXP
, NOT REGEXP
и RLIKE
.
