query_posts ->using meta_compare / where meta value is smaller or greater or equals

I am using query_posts( $args ) to filter the Loop.
I want to filter posts based on their meta_value “vote”, sometimes smaller than, sometimes equals and so on….

I definitly want to use the query_posts() function and pass my filter through $args!
I don’t want to use add_filter('posts_where', 'filter_where'); and then add an AND statement to the query.

I want to use the given functionality of WordPress to filter posts with meta_key, meta_value and meta_compare like this:

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

query_posts( $args );

The result of this is:

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

The problem of that is:

wp_postmeta.meta_value >= '5' 

It should be:

wp_postmeta.meta_value >= 5

Then it would work fine.

I don’t understand why WordPress adds quotes.

I’m using the predefined parameter from WordPress (<, >, <=, >=) and it’s obvious that this will only work with numbers and not strings which would need to be in quotes.

The documentation says:

Returns posts with custom field key of
‘miles’ with a custom field value that
is LESS THAN OR EQUAL TO 22

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

3 Answers
3

Since WP 3.1, you can cast the meta value to anything you want using the ‘type’ argument in ‘meta_query’:

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

query_posts( $args );

Leave a Comment