Created
August 13, 2013 17:48
-
-
Save barryhughes/6223742 to your computer and use it in GitHub Desktop.
This file contains 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
/** | |
* 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_string($target_date)) $this->set_target_date($target_date); | |
add_filter('widget_display_callback', array($this, 'advance_minical'), 20, 2); | |
} | |
/** | |
* Basic check to help filter out spurious date formats. | |
* | |
* @param $date | |
*/ | |
protected function set_target_date($date) { | |
if (1 === preg_match('#^\d{4}-\d{2}(-\d{2})?$#', $date)) | |
$this->target_date = $date; | |
} | |
public function advance_minical($instance, $widget) { | |
if ('tribe-mini-calendar' !== $widget->id_base || isset($instance['eventDate'])) return $instance; | |
add_action('tribe_events_before_view', array($this, 'modify_list_query'), 5); | |
$instance['eventDate'] = $this->determine_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->determine_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 determine_date() { | |
return (false !== $this->target_date) ? $this->target_date : $this->next_upcoming_date(); | |
} | |
protected function next_upcoming_date() { | |
$next_event = tribe_get_events(array( | |
'eventDisplay' => 'upcoming', | |
'posts_per_page' => 1 | |
)); | |
if (empty($next_event) || ! isset($next_event[0]->EventStartDate)) return date('Y-m'); | |
return substr($next_event[0]->EventStartDate, 0, 7); | |
} | |
} | |
/** | |
* 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