Using WP_Query() to sort datetime meta_value

assorted-color container lot

Just like the title suggests, I’ve spent the last several hours struggling with meta_query to return CPTs based on some datetime picker meta_value. Let me explain my setup.

I’m writing a plugin that stores data from a custom_post_type for gym classes with a handful of custom fields put into place using ACF. One of those custom fields is gym_class_date which contains the output from a jQuery datetime picker. Here’s a look at my broken code:

 $today = date(‘Ymd H:i:s’);

 


 $MJCalendar = new WP_Query(array(

 ‘post_type’ => ‘gym_class’,

 ‘posts_per_page’ => –1,

 ‘meta_key’ => ‘gym_class_date’,

 ‘orderby’ => ‘meta_value’,

 ‘order’ => ‘ASC’,

 //only return upcoming classes, not classes in the past

 ‘meta_query’ => array(

 array(

 ‘key’ => ‘gym_class_date’,

 ‘compare’ => ‘>=’,

 ‘value’ => $today,

 )

 )

 ));

 


 while($MJCalendar->have_posts()) {

 $MJCalendar->the_post();

When I ran the code, the resulting output was… nothing. So what gives?

I burned an entire Sunday scratching my head over this and I finally figured it out. Here was my problem:

ACF always stores datetime values in an EXTREMELY specific way: 'YYYY-MM-DD HH:ii:ss'. And I mean specific. Even though earlier in my code, I defined $today = date('Ymd H:i:s');… it was just wrong enough to break literally everything. Turns out, 20210116 16:37:24 does NOT equal 2021-01-16 16:37:24.

Adding some simple dashes to my $today = date('Y-m-d H:i:s'); declaration made everything magically start working again.

That’s gonna do it for this post, I know it’s a bit of a short one, but it took me FOREVER to figure out this stupid detail. Note to self, and hopefully to you, when you’re comparing two  datetime values with a meta_query, for Pete’s sake, make absolutely sure that your format is perfectly the exact same as the format coming from the database. Otherwise, none of your comparison operators will work.