WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have a wp_query that gets all custom post types in ascending order from today, to list some events on a site of mine. While this works fine:

 $args = array( 'post_type'         =>  'events',
                                'posts_per_page'    =>  5,
                                'orderby'           =>  'meta_value', 
                                'order'             =>  'ASC',
                                'meta_key'          =>  'my_special_date',
                                'meta_value'        =>  date('Ymd',strtotime("today")),
                                'meta_compare'      =>  '>=' ); 

I am not getting the same results when I convert this to using meta_query, like so:

array(  'post_type'         =>  'events',
                'posts_per_page'    =>  5,
                'orderby'           =>  'meta_value', 
                'order'             =>  'ASC',
                'meta_query'        =>  array(
                                                        'key'           => 'my_special_date',
                                                        'value'         => date('Ymd',strtotime("today")),
                                                        'compare'       => '>=',
                                                        'type'          => 'NUMERIC'



Note that I'm not comparing dates, I'm comparing numbers, as the date is in the Ymd format. the meta key is in this format. I am having some rather odd results from this - I can't quite work out what's wrong. Anything look obviously wrong to any of you?

share|improve this question

Firstly, there's no point in converting to 'meta_query' if you're dealing with a single custom field.

Secondly, 'meta_query' doesn't handle ordering.

Finally, since your date is in the 'Ymd' format, comparing them as numbers will produce incorrect results. In your initial code, they are compared as strings.

share|improve this answer
Hey scribu, thanks for answering. I know it's pointless with a single custom field. I have a few things to compare, this is all part of an ajax system that brings posts through based on certain options picked by people, hence the change. I've removed the type=numeric, and the compare is still not working. Any idea why? Thanks! – Michael Watson Sep 13 '11 at 21:16
Scrap that scribu - I've worked out what you were saying. Ordering needed to be with meta_key just like the olden days, is all. (and scrapping the numeric as you mentioned). Thanks (and thanks for your writing on it in the first place on your blog!) – Michael Watson Sep 13 '11 at 21:21
up vote 1 down vote accepted

Simple solution:

orderby => meta_key still needs to be set as meta_query does not handle ordering.

Also, I was comparing char data as numeric.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.