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.