Archive by custom post type and custom date field

Thanks to Milo for helping me through this. Here is the code that worked for me.

function custom_events_query( $query ) {

    if (  $query->is_main_query() && $query->is_archive && !is_admin()&& is_post_type_archive('events') && $query->query_vars['m']!='') {

        $query->set( 'post_type', 'events' );
        $query->set( 'meta_key', 'event_date' );
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'DESC' );
        $query->set( 'post_per_page', 10 );
        unset($query->query_vars['year']);
        unset($query->query_vars['monthnum']);
        unset($query->query_vars['day']);

        $meta_query = array(
            array(
                'key' => 'event_date',
                'value' =>  array(date('Y-m-d',strtotime($query->query_vars['m'].'01')),date('Y-m-d',strtotime($query->query_vars['m'].'31'))) ,
                'compare' => 'BETWEEN'
            )
        );
        unset($query->query_vars['m']);
        $query->set( 'meta_query', $meta_query );
    }

    return $query;
}
add_filter( 'pre_get_posts', 'custom_events_query' );

All I had to do is unset the query_vars[‘m’]. Since I needed it to construct my meta_query I unset it only after I was done using it i.e just before $query->set( 'meta_query', $meta_query );

I hope this helps someone.

Leave a Comment