Skip to content

Instantly share code, notes, and snippets.

@barryhughes
Last active October 9, 2015 16:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save barryhughes/a8b5c074b6931f1a226d to your computer and use it in GitHub Desktop.
Save barryhughes/a8b5c074b6931f1a226d to your computer and use it in GitHub Desktop.
Revision for 'fast forward the calendar widget' code
<?php
/**
* Tries to force the minicalendar widget to show the month of the next upcoming event by default, rather
* than simply showing the current month (which might be empty).
*/
class Tribe_Advance_Minical
{
protected $target_date = false;
/**
* Sets up auto advance for minicalendar widgets. If an optional target date is provided that will be used to
* set the month.
*
* @param bool $target_date
*/
public function __construct( $target_date = false ) {
if ( is_admin() ) return;
$this->target_date = $target_date;
add_action( 'wp_loaded', array( $this, 'set_target_date' ) );
add_filter( 'widget_display_callback', array( $this, 'advance_minical' ), 20, 2 );
}
/**
* Basic check to help filter out spurious date formats or automatically determine
* the next most appropriate date to use.
*/
public function set_target_date() {
if ( ! is_string($this->target_date) || 1 !== preg_match( '#^\d{4}-\d{2}(-\d{2})?$# ', $this->target_date ) )
$this->target_date = $this->next_upcoming_date();
}
public function advance_minical( $instance, $widget ) {
if ( 'tribe-mini-calendar' !== $widget->id_base || isset( $instance['eventDate'] ) ) return $instance;
if ( date( 'Y-m' ) === $this->target_date) return;
add_action( 'tribe_before_get_template_part', array( $this, 'modify_list_query' ), 5 );
$instance['eventDate'] = $this->target_date;
return $instance;
}
public function modify_list_query( $template ) {
if ( false === strpos( $template, 'mini-calendar/list.php' ) ) return;
add_action( 'parse_query', array( $this, 'amend_list_query' ) );
}
public function amend_list_query( $query ) {
remove_action( 'parse_query', array( $this, 'amend_list_query' ) ); // Run this once only
$the_query = $query->query_vars;
$the_query['start_date'] = $this->target_date . '-01';
$last_day = TribeDateUtils::getLastDayOfMonth( strtotime( $the_query['start_date'] ) );
$the_query['end_date'] = substr_replace( $the_query['start_date'], $last_day, -2 );
$the_query['end_date'] = TribeDateUtils::endOfDay( $the_query['end_date'] );
$query->query_vars = $the_query;
}
protected function next_upcoming_date() {
$next_event = tribe_get_events( array(
'eventDisplay' => 'list',
'posts_per_page' => 1,
'start_date' => date( 'Y-m-d' )
));
$start_date = date( 'Y-m' );
if ( !empty( $next_event ) || isset( $next_event[0] ) ) {
$next_event_date = tribe_get_start_date( $next_event[0]->ID, false, 'Y-m' );
// Prevent calendar from rewinding to the start of a currently ongoing event
$start_date = ( $next_event_date > $start_date ) ? $next_event_date : $start_date;
}
return $start_date;
}
}
/**
* If we don't pass a parameter it will try to advance the calendar to the same month as the next upcoming event.
* However, we can also pass in a specific month:
*
* new Tribe_Advance_Minical( '2014-12' ); // Set it to December 2014
*/
new Tribe_Advance_Minical();
@michaelwclark
Copy link

One suggestion. Change lines 47-49 to following

 $today = new DateTime('now');
 $today = $today->format('d');  

 $the_query['start_date'] = $this->target_date .'-'. $today;

This will ensure that events with a start date before today but still in this month don't show up.

I also commented out line 34. If I didn't remove that check then my taxonomy filters were not being applied for this months events. The above code and removing/commenting out 34 fixed this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment