Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?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' => 'upcoming',
- '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();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement