Query date array to display future events only – PHP

In WordPress, I have created a custom post type called “Events” and added in custom fields using Advanced Custom Fields. I have just basic fields since our need for a calendar is basic in itself.

Fields are: Start Date, End Date, Start Time, End Time, Location, Title

Read More

I am trying to query posts with an array that is basically “If End Date is greater than todays’s date, Then show posts”.

The issue is Advanced Custom Fields has a built in DatePicker which formats dates as YYYYMMDD and not YYYY-MM-DD as PHP does. Here is my code as it is today:

if (isset($_GET['_m'])) {

    $current_month = $_GET['_m'];
    $current_day = date('d'); // the actual day
    $current_year = $_GET['_y'];
    $future_year = 2016;

    $startday = $current_year.$current_month.$current_day;
    $endday = $future_year.$current_month.$current_day;

    echo $startday;
    echo $endday;

}
    $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_key' => 'event_date_ends',
    'meta_query' => array( 
                'key' => 'event_date_ends',
                'compare' => '>=',
                'value' => $startday,
                'type' => 'DATE'
            ), 
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);

I’ve tried at least 20 variations and techniques with the end result being either A) all “Events” that are published are returned or B) No “Events” published are returned.

I’m trying to steer away from using a calendar plugin for various reasons mainly since most are bulky in resources and also the client wants the return values laid out particularly and I haven’t been able to find a calendar plugin that was that customizable. Visually it’s approved as it is now but past events will not automatically be removed on their own.

UPDATE:

I was able to convert the Advanced Custom Fields date to YYYY-MM-DD and used this code however it’s returning all “Events”

$args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_query' => array(
                'key' => 'event_date_ends',
                'compare' => '>=',
                'value' => date(Y-m-d),
                'type' => 'DATE'
            ),
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);

Related posts

Leave a Reply

2 comments

  1. Turns out I just had to convert this via functions.php to unix timestamp and it worked.

    functions.php

    function custom_unixtimesamp ( $post_id ) {
        if ( get_post_type( $post_id ) == 'events' ) {
        $startdate = get_post_meta($post_id, 'event_date_begins', true);
    
            if($startdate) {
                $dateparts = explode('/', $startdate);
                $newdate1 = strtotime(date('d.m.Y H:i:s', strtotime($dateparts[1].'/'.$dateparts[0].'/'.$dateparts[2])));
                update_post_meta($post_id, 'unixstartdate', $newdate1  );
            }
        }
    }
    add_action( 'save_post', 'custom_unixtimesamp', 100, 2);
    

    then query

    $today = time();    
    
        $args = array(
            'post_type' => 'events',
        'post_status' => 'publish',
        'posts_per_page' => '10',
        'meta_query' => array(
            array(
                'key' => 'unixstartdate',
                'compare' => '>=',
                'value' => $today,
                )
                ),
        'meta_key' => 'event_date_begins',
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
    );
    

    Hopefully someone else can find this useful.

  2. I found the actual issue so I thought I’d update.

    ACF documentation says to use $today = date (‘Ymd’) to compare dates but you really need to use current_time(‘Ymd’) so I removed the functions.php code that I added and fixed the problem rather than work around it.

    Here’s my query now

    $event1 = current_time('Ymd');
        $args = array(
            'post_type' => 'events',
        'post_status' => 'publish',
        'posts_per_page' => '10',
        'meta_query' => array(
            array(
                'key' => 'event_date_ends',
                'compare' => '>=',
                'value' => $event1,
                )
                ),
        'meta_key' => 'event_date_ends',
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
    );