Come usare LIKE per pattern all'inizio o fine stringa in meta_query WordPress

28 ago 2014, 14:43:54
Visualizzazioni: 15.7K
Voti: 12

Ho una custom WP_Query con la seguente 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'
    );
}

Il problema è che WordPress avvolge ogni valore meta con %% per usarli come parte del confronto LIKE nella query, ad esempio WHERE meta_value LIKE '%hello@example.com%'

È possibile configurare una meta_query in modo che venga usato solo un segno di percentuale, per verificare se un valore inizia o finisce con una determinata frase? Ad esempio WHERE meta_value LIKE 'hello@%'

1
Commenti

Tieni presente che le query sui meta dei post sono molto costose e lente, se hai bisogno di filtrare la ricerca o i dati di una query, dovrebbero essere memorizzati usando una tassonomia, non i meta dei post

Tom J Nowell Tom J Nowell
21 dic 2017 20:11:28
Tutte le risposte alla domanda 1
2
21

Potresti provare la versione con REGEXP:

    'meta_query' => array(
        array(
            'key'       => 'email_address',
            'value'     => '^hello@',
            'compare'   => 'REGEXP',
        )
    )

dove ^ corrisponde all'inizio di una stringa.

Puoi consultare il riferimento MYSQL su REGEXP qui per maggiori informazioni.

Nota che questi sono i valori possibili del parametro compare per i meta:

'=', '!=', '>', '>=', '<', '<=', 
'LIKE', 'NOT LIKE','IN', 'NOT IN', 
'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 
'REGEXP', 'NOT REGEXP', 'RLIKE'

secondo il sorgente di WordPress 3.9.2.

Dal riferimento MYSQL:

Nome        Descrizione
------------------------------------------------------
NOT REGEXP  Negazione di REGEXP
REGEXP      Pattern matching usando espressioni regolari
RLIKE       Sinonimo di REGEXP
28 ago 2014 15:49:09
Commenti

Ottimo materiale, grazie mille. È un peccato che non elenchino REGEXP come valore di confronto valido nella documentazione (Da http://codex.wordpress.org/Class_Reference/WP_Meta_Query I valori possibili sono '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (solo in WP >= 3.5), e 'NOT EXISTS' (anche solo in WP >= 3.5). Il valore predefinito è '='.)

Andy Andy
28 ago 2014 16:22:18

Ho aggiornato il Codex con questi parametri aggiuntivi: REGEXP, NOT REGEXP e RLIKE.

birgire birgire
28 ago 2014 20:19:12