Last active
October 9, 2015 16:17
-
-
Save barryhughes/a8b5c074b6931f1a226d to your computer and use it in GitHub Desktop.
Revision for 'fast forward the calendar widget' code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
One suggestion. Change lines 47-49 to following
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.