/** * Set up the self::week_days array * * @return void * @see $this->setup_view() */ private function setup_days() { global $wp_query; $week_days = array(); $day = $wp_query->get('start_date'); // Array used for calculation of php strtotime relative dates $weekday_array = array(0 => 'Sunday', 1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday'); // build an array with the "day" elements, // each "day" is an array that contains the date and the associated all day / hourly events // $day_number corresponds to the day of the week in $weekday_array foreach (self::$day_range as $i => $day_number) { // figure out the $date that we're currently looking at if ($day_number >= self::$day_range[0]) { // usually we can just get the date for the next day $date = date('Y-m-d', strtotime($day . "+{$i} days")); } else { // fringe case - someone starts their week in the middle of the week // in this case, the "day number" will be less than the first day of the week once the week has looped around // so we use a relative strtotime() calc $date = date('Y-m-d', strtotime("Next {$weekday_array[$day_number]}", strtotime($day))); } $hourly_events = array(); $all_day_events = array(); if ($wp_query->have_posts()) { // loop through all the wordpress posts and sort them into all day vs hourly for the current $date foreach ($wp_query->posts as $j => $event) { if (tribe_event_is_on_date($date, $event)) { $event->days_between = tribe_get_days_between($event->EventStartDate, $event->EventEndDate, true); if (tribe_event_is_all_day($event)) { $all_day_events[] = $event; } else { // if the event starts after the end of the hour range we're displaying, or ends before the start, skip it $start_hour_today = $date . ' ' . tribe_events_week_get_hours('first-hour'); $end_hour_today = tribe_end_of_day($date, 'Y-m-d ') . tribe_events_week_get_hours('last-hour'); if (tribe_get_start_time($event, 'U') > strtotime($end_hour_today) || tribe_get_end_time($event, 'U') < strtotime($start_hour_today)) { continue; } $hourly_events[] = $event; } } } } $display_format = apply_filters('tribe_events_pro_week_header_date_format', tribe_get_date_option('weekDayFormat', 'D jS')); $formatted_date = date_i18n($display_format, strtotime($date)); $timestamp_date = strtotime($date); $timestamp_today = strtotime(current_time('Y-m-d')); // create the "day" element $week_days[] = array('date' => $date, 'day_number' => $day_number, 'formatted_date' => $formatted_date, 'is_today' => $timestamp_date == $timestamp_today ? true : false, 'is_past' => $timestamp_date < $timestamp_today ? true : false, 'is_future' => $timestamp_date > $timestamp_today ? true : false, 'hourly_events' => $hourly_events, 'all_day_events' => $all_day_events, 'has_events' => $hourly_events || $all_day_events); } self::$week_days = $week_days; }
/** * Gets the event counts for individual days. * * @param array $args * * @return array The counts array. */ public static function getEventCounts($args = array()) { _deprecated_function(__METHOD__, '3.10.1'); global $wpdb; $date = date('Y-m-d'); $defaults = array('post_type' => Tribe__Events__Main::POSTTYPE, 'start_date' => tribe_beginning_of_day($date), 'end_date' => tribe_end_of_day($date), 'display_type' => 'daily', 'hide_upcoming_ids' => null); $args = wp_parse_args($args, $defaults); $args['posts_per_page'] = -1; $args['fields'] = 'ids'; // remove empty args and sort by key, this increases chance of a cache hit $args = array_filter($args, array(__CLASS__, 'filter_args')); ksort($args); $cache = new Tribe__Cache(); $cache_key = 'daily_counts_and_ids_' . serialize($args); $found = $cache->get($cache_key, 'save_post'); if ($found) { return $found; } $cache_key = 'month_post_ids_' . serialize($args); $found = $cache->get($cache_key, 'save_post'); if ($found && is_array($found)) { $post_ids = $found; } else { $post_id_query = new WP_Query(); $post_ids = $post_id_query->query($args); $cache->set($cache_key, $post_ids, Tribe__Cache::NON_PERSISTENT, 'save_post'); } $counts = array(); $event_ids = array(); if (!empty($post_ids)) { switch ($args['display_type']) { case 'daily': default: global $wp_query; $output_date_format = '%Y-%m-%d %H:%i:%s'; $raw_counts = $wpdb->get_results($wpdb->prepare("\n\t\t\t\t\t\t\tSELECT \ttribe_event_start.post_id as ID,\n\t\t\t\t\t\t\t\t\ttribe_event_start.meta_value as EventStartDate,\n\t\t\t\t\t\t\t\t\tDATE_FORMAT( tribe_event_end_date.meta_value, '%1\$s') as EventEndDate,\n\t\t\t\t\t\t\t\t\t{$wpdb->posts}.menu_order as menu_order\n\t\t\t\t\t\t\tFROM {$wpdb->postmeta} AS tribe_event_start\n\t\t\t\t\t\t\t\t\tLEFT JOIN {$wpdb->posts} ON (tribe_event_start.post_id = {$wpdb->posts}.ID)\n\t\t\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} as tribe_event_end_date ON ( tribe_event_start.post_id = tribe_event_end_date.post_id AND tribe_event_end_date.meta_key = '_EventEndDate' )\n\t\t\t\t\t\t\tWHERE tribe_event_start.meta_key = '_EventStartDate'\n\t\t\t\t\t\t\tAND tribe_event_start.post_id IN ( %5\$s )\n\t\t\t\t\t\t\tAND ( (tribe_event_start.meta_value >= '%3\$s' AND tribe_event_start.meta_value <= '%4\$s')\n\t\t\t\t\t\t\t\tOR (tribe_event_start.meta_value <= '%3\$s' AND tribe_event_end_date.meta_value >= '%3\$s')\n\t\t\t\t\t\t\t\tOR ( tribe_event_start.meta_value >= '%3\$s' AND tribe_event_start.meta_value <= '%4\$s')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tORDER BY menu_order ASC, DATE(tribe_event_start.meta_value) ASC, TIME(tribe_event_start.meta_value) ASC;", $output_date_format, $output_date_format, $post_id_query->query_vars['start_date'], $post_id_query->query_vars['end_date'], implode(',', array_map('intval', $post_ids)))); $start_date = new DateTime($post_id_query->query_vars['start_date']); $end_date = new DateTime($post_id_query->query_vars['end_date']); $days = Tribe__Date_Utils::date_diff($start_date->format('Y-m-d'), $end_date->format('Y-m-d')); $term_id = isset($wp_query->query_vars[Tribe__Events__Main::TAXONOMY]) ? $wp_query->query_vars[Tribe__Events__Main::TAXONOMY] : null; $terms = array(); if (is_int($term_id)) { $terms[0] = $term_id; } elseif (is_string($term_id)) { $term = get_term_by('slug', $term_id, Tribe__Events__Main::TAXONOMY); if ($term) { $terms[0] = $term->term_id; } } if (!empty($terms) && is_tax(Tribe__Events__Main::TAXONOMY)) { $terms = array_merge($terms, get_term_children($terms[0], Tribe__Events__Main::TAXONOMY)); } for ($i = 0, $date = $start_date; $i <= $days; $i++, $date->modify('+1 day')) { $formatted_date = $date->format('Y-m-d'); $count = 0; $_day_event_ids = array(); foreach ($raw_counts as $record) { $event = new stdClass(); $event->EventStartDate = $record->EventStartDate; $event->EventEndDate = $record->EventEndDate; $per_day_limit = apply_filters('tribe_events_month_day_limit', tribe_get_option('monthEventAmount', '3')); if (tribe_event_is_on_date($formatted_date, $event)) { if (!empty($terms) && !has_term($terms, Tribe__Events__Main::TAXONOMY, $record->ID)) { continue; } if (count($_day_event_ids) < $per_day_limit) { $_day_event_ids[] = $record->ID; } $count++; } } $event_ids[$formatted_date] = $_day_event_ids; $counts[$formatted_date] = $count; } break; } // get a unique list of the event IDs that will be displayed, and update all their postmeta and term caches at once $final_event_ids = call_user_func_array('array_merge', $event_ids); $final_event_ids = array_unique($final_event_ids); update_object_term_cache($final_event_ids, Tribe__Events__Main::POSTTYPE); update_postmeta_cache($final_event_ids); } // return IDs per day and total counts per day $return = array('counts' => $counts, 'event_ids' => $event_ids); $cache = new Tribe__Cache(); $cache_key = 'daily_counts_and_ids_' . serialize($args); $cache->set($cache_key, $return, Tribe__Cache::NON_PERSISTENT, 'save_post'); return $return; }
/** * This Week Query * * * @return object */ public static function this_week_query($this_week_query_vars) { //Only Get Private Events if user can view $post_status = array('publish'); if (current_user_can('read_private_tribe_events')) { $post_status[] = 'private'; } //Get Events with Hide From Event Listings Checked $hide_upcoming_ids = Tribe__Events__Query::getHideFromUpcomingEvents(); $this_week_widget_args = array('post_type' => Tribe__Events__Main::POSTTYPE, 'tax_query' => $this_week_query_vars['tax_query'], 'eventDisplay' => 'custom', 'start_date' => $this_week_query_vars['start_date'], 'end_date' => $this_week_query_vars['end_date'], 'post_status' => $post_status, 'tribeHideRecurrence' => false, 'post__not_in' => $hide_upcoming_ids, 'tribe_render_context' => 'widget', 'posts_per_page' => -1); /** * Filter This Week Widget args * * @param array $this_week_widget_args Arguments for This Week Widget */ $this_week_widget_args = apply_filters('tribe_events_pro_this_week_widget_query_args', $this_week_widget_args); // Get all the upcoming events for this week $events = tribe_get_events($this_week_widget_args, true); //Days Array to set events for each day $week_days = array(); //Set First Day $day = $this_week_query_vars['start_date']; //Get Day Range $day_range = self::get_day_range(); //Todays Date According to WordPress $timestamp_today = strtotime(current_time(Tribe__Date_Utils::DBDATEFORMAT)); //Date Formats from The Events Calendar $display_date_format = apply_filters('tribe_events_this_week_date_format', 'jS'); $display_day_format = apply_filters('tribe_events_this_week_day_format', 'D '); // Array used for calculation of php strtotime relative dates $weekday_array = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); //Build an Array for Each Day foreach ($day_range as $i => $day_number) { //If Hide Weekends True then skip those days if ($this_week_query_vars['hide_weekends'] === 'true' && ($day_number == 0 || $day_number == 6)) { continue; } // figure out the $date that we're currently looking at if ($day_number >= $day_range[0]) { // usually we can just get the date for the next day $date = date(Tribe__Date_Utils::DBDATEFORMAT, strtotime($day . "+{$i} days")); } else { //Start Day of week in the Middle and not in typical Sunday or Monday $date = date(Tribe__Date_Utils::DBDATEFORMAT, strtotime("Next {$weekday_array[$day_number]}", strtotime($day))); } $this_week_events_sticky = $this_week_events = array(); if ($events->have_posts()) { //loop through all events and sort based on sticky or not foreach ($events->posts as $j => $event) { if (tribe_event_is_on_date($date, $event)) { $event->days_between = tribe_get_days_between($event->EventStartDate, $event->EventEndDate, true); if ($event->menu_order == -1) { $this_week_events_sticky[] = $event; } else { $this_week_events[] = $event; } } } } //Merge the two arrays for the day only if sticky events are included for that day if (!empty($this_week_events_sticky) && is_array($this_week_events_sticky) && is_array($this_week_events)) { $this_week_events = array_merge($this_week_events_sticky, $this_week_events); } $formatted_date = date_i18n($display_date_format, strtotime($date)); $formatted_day = date_i18n($display_day_format, strtotime($date)); $timestamp_date = strtotime($date); // create the "day" element to do display in the template $week_days[] = array('date' => $date, 'day_number' => $day_number, 'formatted_date' => $formatted_date, 'formatted_day' => $formatted_day, 'is_today' => $timestamp_date == $timestamp_today ? true : false, 'is_past' => $timestamp_date < $timestamp_today ? true : false, 'is_future' => $timestamp_date > $timestamp_today ? true : false, 'this_week_events' => $this_week_events, 'has_events' => $this_week_events, 'total_events' => count($this_week_events), 'events_limit' => $this_week_query_vars['count'], 'view_more' => count($this_week_events) > $this_week_query_vars['count'] ? esc_url_raw(tribe_get_day_link($date)) : false); } return $week_days; }