Consulta Meta LIKE %...%

8 feb 2013, 17:56:02
Vistas: 40.6K
Votos: 4

Tengo un array serializado como valor meta y estoy tratando de ejecutar WP Query donde encuentre un valor específico en el array serializado.

Aquí hay un ejemplo del campo del array serializado:

a:6:{i:0;s:3:"173";i:1;s:3:"172";i:2;s:3:"171";i:3...

Aquí está mi consulta, pero no funciona: Los IDs son numéricos por los que estoy realizando la búsqueda también.

$practiceArgs = array(
    'post_type' => 'attorney',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'meta_query' => array(
                        array(
                              'key' => 'practice_area',
                              'value' => $post->ID,
                              'compare' => 'LIKE',
                              'type' => 'NUMERIC'
                              )
                        )
);

He intentado usar 'value' => '%'.$post->ID.'%' en mis consultas, pero tampoco parece funcionar.

¿Alguien ha tenido experiencia trabajando en esto?

0
Todas las respuestas a la pregunta 4
0
15

Me encontré con este mismo problema hoy. En ambas situaciones, de hecho existe una buena solución. Debido a que los datos serializados que estamos buscando son simplemente IDs, y siempre están envueltos entre comillas, solo necesitamos incluir las comillas como parte de la consulta. Esto elimina el problema de encontrar falsos positivos en los resultados de búsqueda.

Solo necesitas modificar la meta query de la siguiente manera:

array(
    'key' => 'practice_area',
    'value' => '"'.$post->ID.'"',
    'compare' => 'LIKE',
)

De esta forma, busca el ID completo, incluyendo las comillas dobles antes y después dentro del array serializado. No se incluirán falsos positivos.

13 may 2014 19:52:31
0

Me encontré con este problema una vez, pero definitivamente no es un lugar agradable. La forma en que lo estás abordando nunca tendrás un resultado consistente: tu búsqueda arrojará muchos falsos positivos (por ejemplo, buscar el ID de publicación 43 devolverá 143, 243, 1431, 1432, etc.).

Desde mi punto de vista, tienes dos opciones:

  • Replantear la forma en que guardas tus metadatos; usa arrays para datos que solo se necesitan al renderizar la publicación, pero no para datos que necesitas consultar para filtrar publicaciones. Para esto último, usa claves meta individuales en tu base de datos: es mucho más rápido, las consultas son más fáciles de codificar y puedes estar seguro de que tendrás control total sobre lo que devuelven las consultas. No te preocupes por usar demasiadas filas en la tabla postmeta: para eso están ahí.
  • Si por alguna razón debes tener múltiples campos empaquetados en una fila de la base de datos, no dependas de la serialización predeterminada: opta por CSV, preferiblemente con algún tipo de prefijo, algo que no devuelva falsos positivos. Algo como "id:43,id:54,foo:bar,id:57,", luego busca 'id:{post_ID},' (nota que todos los valores deben terminar con comas para usar comodines dobles de manera segura en una búsqueda LIKE. Es un poco un hack, pero es más confiable que lo que estás haciendo ahora mismo.

Por si sirve de algo, respecto a la pregunta original, WP ya añade ambos comodines cuando hace comparaciones LIKE usando query_posts, así que no tienes que hacer nada.

9 feb 2013 16:22:27
0

El LIKE de WordPress no es como el LIKE de MySQL, por lo que 'value' => '%'.$post-ID.'%' no funciona.

Podrías probar con la versión REGEXP. Por ejemplo:

'meta_query' => array(
    array(
        'key'       => 'attorney',
        'value'     => '^'.$post-ID,
        'compare'   => 'REGEXP',
    )
)

Debería buscar todos los elementos donde attorney comience con el valor de $post-ID.

4 dic 2019 00:20:21
3

No puedes usar LIKE con numeric (al menos estoy bastante seguro de que no se puede). numeric intentará convertir todo el value a un número. Eso fallará, ya que no es un número. Ese es el primer error.

En segundo lugar, para obtener un % literal, necesitas duplicarlo a %%. Nota: No recuerdo exactamente cómo funciona con meta_query estrictamente hablando. Estoy extrapolando de lo que se necesita para que un % pase a través de $wpdb->prepare. Creo que es lo mismo. Edición: Esto parece ser cierto solo con $wpdb->prepare. El código ha sido editado.

No he probado esto, ya que necesitaría configurar algunas cosas en mi base de datos y no tengo tiempo ahora, pero creo que funcionará.

$practiceArgs = array(
    'post_type' => 'attorney',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'meta_query' => array(
      array(
        'key' => 'practice_area',
        'value' => $post->ID,
        'compare' => 'LIKE'
      )
    )
);

Espero que ese sea el empujón que necesitas. Si no funciona, lo revisaré de nuevo.

Edición: Inserté tu array serializado (roto) en mi base de datos y ejecuté el código anterior. Si configuro todo correctamente (los meta_fields, los tipos de post, etc.), el código anterior funciona. Si no funciona para ti, hay algo más que está pasando, tal vez crees que debería haber una coincidencia donde no la hay.

Estoy asumiendo que tendrás un array como ese para cada uno de tus posts de 'attorney'. Si es así, debería funcionar. Personalmente, preferiría usar múltiples filas de practice_area en lugar de un array serializado. = es una consulta más eficiente que LIKE, especialmente cuando tienes comodines, y tus resultados deberían ser más precisos. Además, el indexado (en la base de datos MySQL) funcionaría mejor.

8 feb 2013 18:11:50
Comentarios

Desafortunadamente, aún devuelve NIL. ¿Alguna otra idea?

Troy Troy
8 feb 2013 20:59:49

Tu comentario sobre '%' solo es cierto cuando se usa $wpdb->prepare. Cuando usas query_posts, usar '%' es innecesario: WP los agrega por ti, lo quieras o no.

Tomas Buteler Tomas Buteler
9 feb 2013 16:25:00

@tbuteler WP también escapará automáticamente % a %% en ese caso.

Robbert Robbert
10 dic 2013 09:31:17