Himanshu Jain
Himanshu Jain

Reputation: 444

Custom Post Type: Event - Display Upcoming Events for Next 30 Days

I need to display the upcoming events for next 30 Days and sort the same based on custom date field.

Below is the code I am using right now but not got any success in hiding old Events and restricting events to 30 Days.

<?php 
    $todayDate = date('d F, Y');
    $futureDate = strtotime ( '+30 days' , strtotime ( $todayDate ) ) ;
    $futureDate = date ( 'd F, Y' , $futureDate );
    $eventsOpt = array(         
        'post_type' => 'ptype_events',
        'posts_per_page' => -1,
        'meta_key' => 'ptype_event_date',
        'meta_compare' => '>=',
        //'meta_value' => $todayDate,
        'orderby' => 'meta_value',
        'order' => 'ASC',
    );
    $events_query = new WP_Query($eventsOpt);
?>
<div class="eventsPosts">
  <?php while ($events_query->have_posts()) : $events_query->the_post(); 
            $date = get_post_meta($post->ID, 'ptype_event_date', true);
        ?>
  <div class="eventsPost clearfix">
    <h3 class="title">
      <?php the_title()?>
    </h3>
    Date: <?php echo $date ?> </div>
  <?php endwhile; ?>
  <?php wp_reset_query() ?>
</div>

Note: Date saved in database is in this format date('d F, Y') and I cannot change it to timestamp while saving because creating meta-fields using a plugin.

Please help me out.

Regards

Upvotes: 0

Views: 701

Answers (1)

cpilko
cpilko

Reputation: 11852

If dates are stored as a formatted text string, you'll need to convert them back to a date, then filter and sort them. My guess is that when you run this code, an event on 03 June will show before a date on 30 January.

Here's how I would approach this:

<?php 
//Get all the events
$eventsOpt = array(         
    'post_type' => 'ptype_events',
    'posts_per_page' => -1,
    'meta_key' => 'ptype_event_date',
    'orderby' => 'meta_value',
    'order' => 'ASC',
);
$events_query = new WP_Query($eventsOpt);

//Loop through them and filter out events before today and events in more than 1 month
$events_out = array();
while ($events_query->have_posts()) : $events_query->the_post(); 
   $ed = strtotime( get_post_meta($post->ID, 'ptype_event_date', true) );
   $temp = array();
   if ( $ed !== FALSE && $ed >= time() && $ed <= strtotime('+1 month') ) :
      $temp['date'] = date('d F, Y', $ed);
      $temp['title'] = get_the_title();
      $events_out[$ed] = $temp;
   endif;
endwhile;
wp_reset_query();

//Sort the events by date
ksort( $events_out );

//Write the output
$format = <<<EOF
<div class="eventsPost clearfix">
   <h3 class="title">
      %s
   </h3>
   Date: %s </div>
EOF;

foreach ($events_out as $event) {
   printf ($format, $event['title'], $event['date']);
} ?>

Upvotes: 1

Related Questions