Мета-запрос с шаблоном LIKE для строк, начинающихся с определенного значения

28 авг. 2014 г., 14:43:54
Просмотры: 15.7K
Голосов: 12

У меня есть пользовательский 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@%'

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

Имейте в виду, что запросы к метаданным записей очень ресурсоемкие и медленные. Если вам нужно фильтровать поиск или запрашивать данные, их следует хранить с помощью таксономии, а не метаданных записи

Tom J Nowell Tom J Nowell
21 дек. 2017 г. 20:11:28
Все ответы на вопрос 1
2
21

Вы можете попробовать версию с 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
28 авг. 2014 г. 15:49:09
Комментарии

Отличная работа, большое спасибо. Жаль, что в документации не указано 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). Значение по умолчанию — '='.)

Andy Andy
28 авг. 2014 г. 16:22:18

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

birgire birgire
28 авг. 2014 г. 20:19:12