Interogare meta cu model de început de șir în WordPress
Am o interogare WP_Query personalizată cu următorul 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'
);
}
Problema cu această abordare este că WordPress înfășoară fiecare valoare meta în %%
pentru a fi utilizată ca parte a comparației LIKE
în interogare, de exemplu WHERE meta_value LIKE '%hello@example.com%'
Este posibil să configurezi un meta_query astfel încât să fie utilizat doar un semn procent, pentru a verifica dacă o valoare începe sau se termină cu o anumită frază? De exemplu WHERE meta_value LIKE 'hello@%'

Puteți încerca versiunea cu REGEXP
:
'meta_query' => array(
array(
'key' => 'email_address',
'value' => '^hello@',
'compare' => 'REGEXP',
)
)
unde ^
se potrivește cu începutul unui șir de caractere.
Puteți consulta referința MYSQL despre REGEXP
aici pentru mai multe informații.
Rețineți că acestea sunt valorile posibile ale parametrului compare
din meta:
'=', '!=', '>', '>=', '<', '<=',
'LIKE', 'NOT LIKE','IN', 'NOT IN',
'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS',
'REGEXP', 'NOT REGEXP', 'RLIKE'
conform surselor WordPress 3.9.2.
Din documentația MYSQL:
Nume Descriere
------------------------------------------------------
NOT REGEXP Negarea lui REGEXP
REGEXP Potrivire de tipar folosind expresii regulate
RLIKE Sinonim pentru REGEXP

Lucru excelent, mulțumesc foarte mult. Este păcat că nu listează REGEXP
ca valoare validă de comparare în documentație (Din http://codex.wordpress.org/Class_Reference/WP_Meta_Query Valorile posibile sunt '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (doar în WP >= 3.5), și 'NOT EXISTS' (de asemenea doar în WP >= 3.5). Valoarea implicită este '='.
)

Am actualizat Codex-ul cu acești parametri suplimentari: REGEXP
, NOT REGEXP
și RLIKE
.
