Interogare meta cu model de început de șir în WordPress

28 aug. 2014, 14:43:54
Vizualizări: 15.7K
Voturi: 12

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@%'

1
Comentarii

Ține minte că interogările de metadate ale postărilor sunt foarte costisitoare și lente, dacă ai nevoie să filtrezi datele de căutare sau interogare, acestea ar trebui stocate folosind o taxonomie, nu metadatele postării

Tom J Nowell Tom J Nowell
21 dec. 2017 20:11:28
Toate răspunsurile la întrebare 1
2
21

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
28 aug. 2014 15:49:09
Comentarii

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 '='.)

Andy Andy
28 aug. 2014 16:22:18

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

birgire birgire
28 aug. 2014 20:19:12