Consulta meta con patrón de inicio de cadena

28 ago 2014, 14:43:54
Vistas: 15.7K
Votos: 12

Tengo una consulta WP_Query personalizada con el siguiente 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'
    );
}

El problema con esto es que WordPress envuelve cada valor meta en %% para usarlo como parte de la comparación LIKE en la consulta, por ejemplo WHERE meta_value LIKE '%hello@example.com%'

¿Es posible configurar un meta_query para que solo se use un signo de porcentaje, para poder verificar si un valor comienza o termina con una frase? Por ejemplo WHERE meta_value LIKE 'hello@%'

1
Comentarios

Ten en cuenta que las consultas de metadatos de publicaciones son muy costosas y lentas. Si necesitas filtrar búsquedas o consultar datos, deberían almacenarse usando una taxonomía, no metadatos de publicación

Tom J Nowell Tom J Nowell
21 dic 2017 20:11:28
Todas las respuestas a la pregunta 1
2
21

Podrías probar la versión con REGEXP:

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

donde ^ coincide con el inicio de una cadena.

Puedes consultar la referencia de MYSQL sobre REGEXP aquí para más información.

Ten en cuenta que estos son los valores posibles del parámetro compare en meta queries:

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

según el código fuente de WordPress 3.9.2.

De la referencia de MYSQL:

Nombre      Descripción
------------------------------------------------------
NOT REGEXP  Negación de REGEXP  
REGEXP      Coincidencia de patrones usando expresiones regulares
RLIKE       Sinónimo de REGEXP
28 ago 2014 15:49:09
Comentarios

Excelente material, muchas gracias. Es una pena que no incluyan REGEXP como un valor de comparación válido en la documentación (De http://codex.wordpress.org/Class_Reference/WP_Meta_Query Los valores posibles son '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (solo en WP >= 3.5), y 'NOT EXISTS' (también solo en WP >= 3.5). El valor predeterminado es '='.)

Andy Andy
28 ago 2014 16:22:18

Actualicé el Codex con estos parámetros adicionales: REGEXP, NOT REGEXP y RLIKE.

birgire birgire
28 ago 2014 20:19:12