Skip to content

Instantly share code, notes, and snippets.

@barryhughes
Created August 13, 2013 17:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save barryhughes/6223742 to your computer and use it in GitHub Desktop.
Save barryhughes/6223742 to your computer and use it in GitHub Desktop.
/**
* 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