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
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 );