query_posts -usando meta_compare / donde el valor meta es menor o mayor o igual

3

Estoy usando query_posts( $args ) para filtrar el Loop. Quiero filtrar publicaciones según su meta_value "voto", a veces más pequeño que, a veces igual y así sucesivamente ...

¡Definitivamente quiero usar la función query_posts() y pasar mi filtro a través de $args ! No quiero usar add_filter('posts_where', 'filter_where'); y luego agregar una declaración AND a la consulta.

Quiero usar la funcionalidad dada de WordPress para filtrar publicaciones con meta_key , meta_value y meta_compare como esto:

$args = array( 'meta_key'=>'vote', 'meta_compare'=>'>=', 'meta_value'=>5, 'posts_per_page'=>100 ) )

query_posts( $args );

El resultado de esto es:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND wp_postmeta.meta_key = 'vote' AND wp_postmeta.meta_value >= '5' GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 100

El problema de eso es:

wp_postmeta.meta_value >= '5' 

Debería ser:

wp_postmeta.meta_value >= 5

Entonces funcionaría bien.

No entiendo por qué WordPress agrega citas.

Estoy usando el parámetro predefinido de WordPress ( < , > , <= , >= ) y es obvio que esto solo funcionará con números y no con cadenas que deberían estar entre comillas.

La documentación dice:

  

Devuelve publicaciones con clave de campo personalizada de   'millas' con un valor de campo personalizado que   es MENOR QUE O IGUAL A 22

     

query_posts('meta_key=miles&meta_compare=<=&meta_value=22');

    
pregunta EAMann 22.09.2010 - 22:18

3 respuestas

11

Desde WP 3.1, puedes convertir el valor meta en cualquier cosa que desees utilizando el argumento 'tipo' en 'meta_query':

$args = array(
  'meta_query'=> array(
    array(
      'key' => 'vote',
      'compare' => '>=',
      'value' => 5,
      'type' => 'numeric',
    )
  )
  'posts_per_page' => 100
) );

query_posts( $args );
    
respondido por el scribu 16.03.2011 - 16:57
3

De la revisión rápida de la documentación, meta_value parece estar destinado a cadenas y para valores numéricos hay meta_value_num .

Consulte Orderby Parameters

Actualizar

Hice algunas excavaciones.

De hecho,

meta_value_num se ignora con el fin de filtrar. Creo que simplemente se olvidaron de agregar esa parte. :)

El problema es que WP_Query recibe correctamente el número como int (pasar como matriz no importa), pero pasa la condición meta_compare generada a través de $wpdb->prepare() y marca explícitamente el valor como %s string. En cuyo caso, prepare lo pone a comillas.

Parece que tendrás que filtrar posts_where después de todo. Puede intentar simplemente dejar de citar esa cadena específica en lugar de generar la condición manualmente.

    
respondido por el Rarst 22.09.2010 - 22:31
0

Recomendaría analizar su matriz $args y convertirla en una cadena antes de pasarla a query_posts . Cuando crea la matriz $args , el sistema convertirá automáticamente el número 5 en una cadena "5" cuando la matriz se vuelva a convertir en una cadena.

Entonces usa esto en su lugar:

query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100');

Eso sigue pasando la misma información a query_posts, pero debería pasar el número 5 en lugar de una cadena "5".

Actualizar

Ya que ahora hemos descubierto que meta_value almacena cadenas en lugar de números, y no se puede hacer una comparación mayor o menor que con las cadenas. Sin embargo, después de un poco más de investigación encontré la marca de consulta meta_value_num .

Si ejecuta la siguiente llamada query_posts :

query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100&orderby=meta_value_num');

Entonces deberías tener el comportamiento que quieras. meta_value_num le dice a WordPress que evalúe su meta_value s como números en lugar de cadenas.

    
respondido por el EAMann 22.09.2010 - 22:29

Lea otras preguntas en las etiquetas