Support

Home Forums Event Espresso Premium Get Event Start Date when looping through events…

Get Event Start Date when looping through events…

Posted: August 17, 2015 at 12:46 pm

Viewing 11 reply threads


Rob

August 17, 2015 at 12:46 pm

I had to write my own function to get the start date/time of events when looping through them in custom loops. There must be an easier (and more reliable) way?


function get_event_start_date( $EVT_ID ) {
  $times = EE_Registry::instance()->load_model('Datetime' )->get_all_event_dates( $EVT_ID );
  $times_obj = current($times);
  $test_obj = new ReflectionClass('EE_Datetime');
  $fields = $test_obj->getProperty('_fields');
  $fields->setAccessible(true);
  $event_start = $fields->getValue($times_obj)['DTT_EVT_start'];
  return $event_start;
}


Dean

August 18, 2015 at 6:51 am

Hi,

In the loop:

$x = $post->EE_Event->first_datetime(); 
echo $x->start_date();

What this does:

The $post object contains the Event object as well as the standard post data, so we use the first_datetime method in that object to extract the first datetime into a variable.

From that variable which now contains an instance of the EE_Datetime object, we can use the start_date method from the EE_Datetime object to display the start date

EE_Event – /wp-content/plugins/event-espresso-core-reg/core/db_classes/EE_Event.class.php

EE_Datetime – /wp-content/plugins/event-espresso-core-reg/core/db_classes/EE_Datetime.class.php


Rob

August 18, 2015 at 5:04 pm

That worked wonderfully. I had to do a bit of custom styling on portions of the date so I’ll post my code here in case someone else is trying to do the same.


    global $post;
    $x = $post->EE_Event->first_datetime(); 
    $event_start = strtotime($x->start_date());
    $day = date('j', $event_start);
    $month = date('M', $event_start);
    $year = date('Y', $event_start);
    $html .= '<span class="day">'.$day.'</span>';
    $html .= '<span class="month">'.$month.'</span>';
    $html .= '<span class="year">'.$year.'</span>';

The last thing I would like to understand is how to keep this custom query from returning events that have already ended. I looked through the code snippets but I wasn’t able to find anything similar.


// returns all events, even events which have ended
$args = array( 'post_type' => 'espresso_events', 'posts_per_page' => 3);
$alternative_coll = new WP_Query( $args );


Dean

August 19, 2015 at 5:11 am

Hi Rob,

A similar thing with this too.

Use the EE_Event object in the $post object, with the is_upcoming method found in the EE_Event class, e.g.:

global $post;
$check = $post->EE_Event->is_upcoming();

if( !$check )  {
continue;
}


Rob

August 20, 2015 at 6:36 am

Hey Dean- that seems like a very useful function to know. However, I’m not sure how to use it inside of the query for my custom loop. Perhaps something like…?


$upcomingEvents = new WP_Query( array(
  'post_type' => 'espresso_events',
  'posts_per_page' => 3,
  'meta_query' => array(
    'key' => 'is_upcoming',
    'value' => 'true',
    'compare' => '='
    )
  ) );


Dean

August 20, 2015 at 7:18 am

Hi,

No. It would need to be used in the loop, not the query (the “if ( have_posts() ) : while ( have_posts() ) : the_post();” bit).

https://codex.wordpress.org/The_Loop

Generally you would put it after the while section


Rob

August 20, 2015 at 7:48 am

I see- thanks!

Right now I need to retrieve a specified number (posts_per_page) of espresso_events which haven’t happened yet. Would this be the only way then:


$upcoming_events = array();
$allEvents = new WP_Query( array(
  'post_type' => 'espresso_events',
  'posts_per_page' => -1,  // to collect all events
  ) );
while($allEvents->have_posts()) { $allEvents->the_post();
  global $post;
  $check = $post->EE_Event->is_upcoming();
  if ($check) array_push($upcoming_events, $post);
}

To phrase it differently- is there anyway to do it using WP_Query?

Thanks for all of your help!


Dean

August 21, 2015 at 1:53 am

Hi,

Change

‘posts_per_page’ => -1,

to

‘posts_per_page’ => 10,

where 10 is the number of posts to display.


Rob

August 21, 2015 at 2:20 am

Thank you. Maybe I’m not asking my question very well, I apologize.

$post->EE_Event->is_upcoming(); takes place after querying. Instead of querying and then filtering events- I would really like to query for upcoming events beforehand (inside of WP_Query). Is it possible?


Dean

August 24, 2015 at 5:27 am

Hi,

I’m not sure if you can do it with WP_Query, but you could use the EE Query function, whihc replicates WP _Query but throws in some EE related stuff:

Found in — /wp-content/plugins/event-espresso-core-reg/shortcodes/espresso_events/EES_Espresso_Events.shortcode.php

Example — https://gist.github.com/joshfeck/e3c9540cd4ccc734e755

You can then use the show_expired parameter.

That’s the closest I can see to what you need.


Tony

  • Support Staff

August 24, 2015 at 5:38 am

Hi Rob,

Although you are free to use WP_Query directly, we recommend using the EE4 Models to query for your events as it does all the hard work for you. For info on the EE4 Models take a look here:

http://developer.eventespresso.com/docs/ee-model-objects-and-custom-post-types/

One of the easiest places to see this in action is the upcoming events widget within \event-espresso-core-reg\widgets\upcoming_events\EEW_Upcoming_Events.widget.php

For example, something like this:

//Setup where conditions
$where = array(
	'status' => 'publish',
	'Datetime.DTT_EVT_end' => array( '>=', EEM_Datetime::instance()->current_time_for_query( 'DTT_EVT_end' ) )
);

//Get events
$events = EE_Registry::instance()->load_model( 'Event' )->get_all( array(
	$where,
	'order_by' => 'Datetime.DTT_EVT_start',
	'order' => 'ASC',
	'group_by' => 'EVT_ID'
));

Will pull in only pull in active and upcoming events.


Tony

  • Support Staff

August 24, 2015 at 5:56 am

I’d opened this page before Dean posted, but the solution he posted works better than mine so I would recommend using that 🙂

EE_Event_List_Query does most of the work for you in this instance.

Viewing 11 reply threads

The support post ‘Get Event Start Date when looping through events…’ is closed to new replies.

Have a question about this support post? Create a new support post in our support forums and include a link to this existing support post so we can help you.

Event Espresso