public function where($where, $wp_query) { global $ecp_apm, $wpdb; // run once remove_filter('posts_where', array($this, 'where'), 10, 2); foreach ($this->active as $key => $active) { $field = ''; if ($key === 'ecp_start_date') { $field = 'eventStart.meta_value'; } if ($key === 'ecp_end_date') { $field = 'eventEnd.meta_value'; } if (empty($field)) { continue; } $value = $active['value']; switch ($active['is']) { case 'is': $where .= $wpdb->prepare(" AND {$field} BETWEEN %s AND %s ", tribe_event_beginning_of_day($value), tribe_event_end_of_day($value)); break; case 'not': $where .= $wpdb->prepare(" AND {$field} NOT BETWEEN %s AND %s ", tribe_event_beginning_of_day($value), tribe_event_end_of_day($value)); break; case 'gte': $where .= $wpdb->prepare(" AND {$field} >= %s ", tribe_event_beginning_of_day($value)); break; case 'lte': $where .= $wpdb->prepare(" AND {$field} <= %s ", tribe_event_end_of_day($value)); break; } } return $where; }
/** * End Date * * Returns the event end date * * @param int $event (optional) * @param bool $displayTime If true shows date and time, if false only shows date * @param string $dateFormat Allows date and time formating using standard php syntax (http://php.net/manual/en/function.date.php) * @return string Date * @since 2.0 */ function tribe_get_end_date($event = null, $displayTime = true, $dateFormat = '') { if (is_null($event)) { global $post; $event = $post; } if (is_numeric($event)) { $event = get_post($event); } if (tribe_event_is_all_day($event)) { $displayTime = false; } if (empty($event->EventEndDate) && is_object($event)) { $event->EventEndDate = tribe_get_event_meta($event->ID, '_EventEndDate', true); } if (isset($event->EventEndDate)) { if (tribe_event_is_all_day($event) && empty($event->_end_date_fixed) && TribeDateUtils::timeOnly($event->EventEndDate) != '23:59:59' && TribeDateUtils::timeOnly(tribe_event_end_of_day()) != '23:59') { // set the event end date to be one day earlier, if it's an all day event and the cutoff is past midnight // @todo remove this once we can have all day events without a start / end time $event->EventEndDate = date_create($event->EventEndDate); $event->EventEndDate->modify('-1 day'); $event->EventEndDate = $event->EventEndDate->format(TribeDateUtils::DBDATEFORMAT); $event->_end_date_fixed = true; } $date = strtotime($event->EventEndDate); } else { return; // '—'; } return tribe_event_format_date($date, $displayTime, $dateFormat); }
/** * 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_event_beginning_of_day($date), 'end_date' => tribe_event_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__Events__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__Events__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__Events__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)) { if (!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__Events__Cache(); $cache_key = 'daily_counts_and_ids_' . serialize($args); $cache->set($cache_key, $return, Tribe__Events__Cache::NON_PERSISTENT, 'save_post'); return $return; }
/** * Gets the event counts for individual days. * * @param array $args * * @return array The counts array. */ public static function getEventCounts($args = array()) { global $wpdb; do_action('log', 'getEventCounts() $args', 'tribe-events-query', $args); $date = date('Y-m-d'); $defaults = array('post_type' => TribeEvents::POSTTYPE, 'start_date' => tribe_event_beginning_of_day($date), 'end_date' => tribe_event_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 TribeEventsCache(); $cache_key = 'daily_counts_and_ids_' . serialize($args); $found = $cache->get($cache_key, 'save_post'); if ($found) { do_action('log', 'cache hit ' . __LINE__, 'tribe-events-cache', $args); return $found; } do_action('log', 'no cache hit ' . __LINE__, 'tribe-events-cache', $args); $cache_key = 'month_post_ids_' . serialize($args); $found = $cache->get($cache_key, 'save_post'); if ($found && is_array($found)) { do_action('log', 'cache hit ' . __LINE__, 'tribe-events-cache', $args); $post_ids = $found; } else { do_action('log', 'no cache hit ' . __LINE__, 'tribe-events-cache', $args); $post_id_query = new WP_Query(); $post_ids = $post_id_query->query($args); do_action('log', 'final args for month view post ids', 'tribe-events-query', $post_id_query->query_vars); do_action('log', 'Month view getEventCounts SQL', 'tribe-events-query', $post_id_query->request); $cache->set($cache_key, $post_ids, TribeEventsCache::NON_PERSISTENT, 'save_post'); } do_action('log', 'Month view post ids found', 'tribe-events-query', $post_ids); $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'; do_action('log', 'raw counts args', 'tribe-events-query', $args); $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)))); do_action('log', 'raw counts query', 'tribe-events-query', $wpdb->last_query); $start_date = new DateTime($post_id_query->query_vars['start_date']); $end_date = new DateTime($post_id_query->query_vars['end_date']); $days = TribeDateUtils::dateDiff($start_date->format('Y-m-d'), $end_date->format('Y-m-d')); $term_id = isset($wp_query->query_vars[TribeEvents::TAXONOMY]) ? $wp_query->query_vars[TribeEvents::TAXONOMY] : null; if (is_int($term_id)) { $term = get_term_by('id', $term_id, TribeEvents::TAXONOMY); } elseif (is_string($term_id)) { $term = get_term_by('slug', $term_id, TribeEvents::TAXONOMY); } for ($i = 0, $date = $start_date; $i <= $days; $i++, $date->modify('+1 day')) { $formatted_date = $date->format('Y-m-d'); $start_of_day = strtotime(tribe_event_beginning_of_day($formatted_date)); $end_of_day = strtotime(tribe_event_end_of_day($formatted_date)) + 1; $count = 0; $_day_event_ids = array(); foreach ($raw_counts as $record) { $record_start = strtotime($record->EventStartDate); $record_end = strtotime($record->EventEndDate); /** * conditions: * event starts on this day (event start time is between start and end of day) * event ends on this day (event end time is between start and end of day) * event starts before start of day and ends after end of day (spans across this day) * note: * events that start exactly on the EOD cutoff will count on the following day * events that end exactly on the EOD cutoff will count on the previous day */ $event_starts_today = $record_start >= $start_of_day && $record_start < $end_of_day; $event_ends_today = $record_end > $start_of_day && $record_end <= $end_of_day; $event_spans_across_today = $record_start < $start_of_day && $record_end > $end_of_day; if ($event_starts_today || $event_ends_today || $event_spans_across_today) { if (isset($term->term_id)) { if (!has_term($term, TribeEvents::TAXONOMY, $record->ID)) { continue; } } if (count($_day_event_ids) < apply_filters('tribe_events_month_day_limit', tribe_get_option('monthEventAmount', '3'))) { $_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 = array(); $final_event_ids = call_user_func_array('array_merge', $event_ids); $final_event_ids = array_unique($final_event_ids); do_action('log', 'updating term and postmeta caches for events', 'tribe-events-cache', $final_event_ids); update_object_term_cache($final_event_ids, TribeEvents::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 TribeEventsCache(); $cache_key = 'daily_counts_and_ids_' . serialize($args); $cache->set($cache_key, $return, TribeEventsCache::NON_PERSISTENT, 'save_post'); do_action('log', 'final event counts result', 'tribe-events-query', $return); return $return; }
public function ajax_select_day_set_date($query) { if (isset($_POST['eventDate']) && $_POST['eventDate']) { $query->set('eventDate', $_POST['eventDate']); $query->set('eventDisplay', 'day'); $query->set('start_date', tribe_event_beginning_of_day($_POST['eventDate'])); $query->set('end_date', tribe_event_end_of_day($_POST['eventDate'])); $query->set('hide_upcoming', false); } return $query; }
/** * Returns the end of a given day. * * @deprecated since 3.10 - use tribe_event_end_of_day() * @todo remove in 4.1 * * @param int|string $date The date (timestamp or string). * @param bool $isTimestamp Is $date in timestamp format? * * @return string The date and time of the end of a given day */ public static function endOfDay($date, $isTimestamp = false) { _deprecated_function(__METHOD__, '3.10', 'tribe_event_end_of_day'); if ($isTimestamp) { $date = date(self::DBDATEFORMAT, $date); } return tribe_event_end_of_day($date, self::DBDATETIMEFORMAT); }
/** * Add custom query modification to the pre_get_posts hook as necessary for PRO. * * @param WP_Query $query The current query object. * @return WP_Query The modified query object. * @author Timothy Wood * @since 3.0 */ public function pre_get_posts($query) { $pro_query = false; $query->tribe_is_week = false; $query->tribe_is_day = false; $query->tribe_is_photo = false; $query->tribe_is_map = false; if (!empty($query->query_vars['eventDisplay'])) { $pro_query = true; switch ($query->query_vars['eventDisplay']) { case 'week': $week = tribe_get_first_week_day($query->get('eventDate')); $query->set('start_date', $week); $query->set('eventDate', $week); $query->set('end_date', tribe_get_last_week_day($week)); $query->set('orderby', 'event_date'); $query->set('order', 'ASC'); $query->set('posts_per_page', -1); // show ALL week posts $query->set('hide_upcoming', false); $query->tribe_is_week = true; break; case 'day': // a little hack to prevent 404 from happening on day view add_filter('tribe_events_templates_is_404', '__return_false'); $event_date = $query->get('eventDate') != '' ? $query->get('eventDate') : Date('Y-m-d'); $query->set('start_date', tribe_event_beginning_of_day($event_date)); $query->set('end_date', tribe_event_end_of_day($event_date)); $query->set('eventDate', $event_date); $query->set('orderby', 'event_date'); $query->set('order', 'ASC'); $query->set('posts_per_page', -1); // show ALL day posts $query->set('hide_upcoming', false); $query->tribe_is_day = true; break; case 'photo': $tribe_event_display = !empty($_REQUEST['tribe_event_display']) ? $_REQUEST['tribe_event_display'] : ''; $tribe_paged = !empty($_REQUEST['tribe_paged']) ? $_REQUEST['tribe_paged'] : 0; $event_date = $query->get('eventDate') != '' ? $query->get('eventDate') : Date('Y-m-d'); $query->set('start_date', tribe_event_beginning_of_day($event_date)); $query->set('eventDate', $event_date); $query->set('orderby', 'event_date'); $query->set('order', 'ASC'); $query->set('hide_upcoming', false); $query->set('paged', $tribe_paged); $query->tribe_is_photo = true; if ($tribe_event_display === 'past') { add_filter('tribe_events_pre_get_posts', array($this, 'set_past_events_query'), 20); } break; case 'map': /* * Query setup for the map view is located in * TribeEventsGeoLoc->setup_geoloc_in_query() */ $query->tribe_is_map = true; } } $query->tribe_is_event_pro_query = $pro_query; return $query->tribe_is_event_pro_query ? apply_filters('tribe_events_pro_pre_get_posts', $query) : $query; }
/** * Account for :30 EOD cutoffs, which break week view * * @param $date * @param string $format * * @return bool|string */ protected static function get_rounded_end_of_day($date, $format = 'U') { $end_of_day = (int) tribe_event_end_of_day($date, 'U') + 1; end(self::$hour_range); $date = min($end_of_day, strtotime($date . ' ' . tribe_events_week_get_hours('last-hour'))); $date = date('Y-m-d H:00:00', $date); $date = date($format, strtotime($date)); return $date; }
/** * Adds a style chooser to the write post page * * @param WP_Post $event * @return void */ public function EventsChooserBox($event = null) { $saved = false; if (!$event) { global $post; if (isset($_GET['post']) && $_GET['post']) { $saved = true; } } else { $post = $event; //echo $post->ID; if ($post->ID) { $saved = true; } else { $saved = false; } } $options = ''; $style = ''; if (isset($post->ID)) { $postId = $post->ID; } else { $postId = 0; } foreach ($this->metaTags as $tag) { if ($postId && $saved) { //if there is a post AND the post has been saved at least once. // Sort the meta to make sure it is correct for recurring events $meta = get_post_meta($postId, $tag); sort($meta); if (isset($meta[0])) { ${$tag} = $meta[0]; } } else { $cleaned_tag = str_replace('_Event', '', $tag); //allow posted data to override default data if (isset($_POST['Event' . $cleaned_tag])) { ${$tag} = stripslashes_deep($_POST['Event' . $cleaned_tag]); } else { ${$tag} = class_exists('TribeEventsPro') && $this->defaultValueReplaceEnabled() ? tribe_get_option('eventsDefault' . $cleaned_tag) : ""; } } } if (isset($_EventOrganizerID) && $_EventOrganizerID) { foreach ($this->organizerTags as $tag) { ${$tag} = get_post_meta($_EventOrganizerID, $tag, true); } } else { foreach ($this->organizerTags as $tag) { $cleaned_tag = str_replace('_Organizer', '', $tag); if (isset($_POST['organizer'][$cleaned_tag])) { ${$tag} = stripslashes_deep($_POST['organizer'][$cleaned_tag]); } } } if (isset($_EventVenueID) && $_EventVenueID) { foreach ($this->venueTags as $tag) { ${$tag} = get_post_meta($_EventVenueID, $tag, true); } } else { $defaults = $this->venueTags; $defaults[] = '_VenueState'; $defaults[] = '_VenueProvince'; foreach ($defaults as $tag) { $cleaned_tag = str_replace('_Venue', '', $tag); //echo $tag.' | '.$cleaned_tag.'<BR>'; $var_name = '_Venue' . $cleaned_tag; if ($cleaned_tag != 'Cost') { ${$var_name} = class_exists('TribeEventsPro') && $this->defaultValueReplaceEnabled() ? tribe_get_option('eventsDefault' . $cleaned_tag) : ""; } if (isset($_POST['venue'][$cleaned_tag])) { ${$var_name} = stripslashes_deep($_POST['venue'][$cleaned_tag]); } } if (isset($_VenueState) && !empty($_VenueState)) { $_VenueStateProvince = $_VenueState; } elseif (isset($_VenueProvince)) { $_VenueStateProvince = $_VenueProvince; } else { $_VenueStateProvince = null; } if (isset($_POST['venue']['Country'])) { if ($_POST['venue']['Country'] == 'United States') { $_VenueStateProvince = stripslashes_deep($_POST['venue']['State']); } else { $_VenueStateProvince = stripslashes_deep($_POST['venue']['Province']); } } } $_EventAllDay = isset($_EventAllDay) ? $_EventAllDay : false; $_EventStartDate = isset($_EventStartDate) ? $_EventStartDate : null; if (isset($_EventEndDate)) { if ($_EventAllDay && TribeDateUtils::timeOnly($_EventEndDate) != '23:59:59' && TribeDateUtils::timeOnly(tribe_event_end_of_day()) != '23:59:59') { // If it's an all day event and the EOD cutoff is later than midnight // set the end date to be the previous day so it displays correctly in the datepicker // so the datepickers will match. we'll set the correct end time upon saving // @todo: remove this once we're allowed to have all day events without a start/end time $_EventEndDate = date_create($_EventEndDate); $_EventEndDate->modify('-1 day'); $_EventEndDate = $_EventEndDate->format(TribeDateUtils::DBDATETIMEFORMAT); } } else { $_EventEndDate = null; } $isEventAllDay = $_EventAllDay == 'yes' || !TribeDateUtils::dateOnly($_EventStartDate) ? 'checked="checked"' : ''; // default is all day for new posts $startMonthOptions = TribeEventsViewHelpers::getMonthOptions($_EventStartDate); $endMonthOptions = TribeEventsViewHelpers::getMonthOptions($_EventEndDate); $startYearOptions = TribeEventsViewHelpers::getYearOptions($_EventStartDate); $endYearOptions = TribeEventsViewHelpers::getYearOptions($_EventEndDate); $startMinuteOptions = TribeEventsViewHelpers::getMinuteOptions($_EventStartDate, true); $endMinuteOptions = TribeEventsViewHelpers::getMinuteOptions($_EventEndDate); $startHourOptions = TribeEventsViewHelpers::getHourOptions($_EventAllDay == 'yes' ? null : $_EventStartDate, true); $endHourOptions = TribeEventsViewHelpers::getHourOptions($_EventAllDay == 'yes' ? null : $_EventEndDate); $startMeridianOptions = TribeEventsViewHelpers::getMeridianOptions($_EventStartDate, true); $endMeridianOptions = TribeEventsViewHelpers::getMeridianOptions($_EventEndDate); if ($_EventStartDate) { $start = TribeDateUtils::dateOnly($_EventStartDate); } $EventStartDate = isset($start) && $start ? $start : date('Y-m-d'); if (!empty($_REQUEST['eventDate'])) { $EventStartDate = esc_attr($_REQUEST['eventDate']); } if ($_EventEndDate) { $end = TribeDateUtils::dateOnly($_EventEndDate); } $EventEndDate = isset($end) && $end ? $end : date('Y-m-d'); $recStart = isset($_REQUEST['event_start']) ? esc_attr($_REQUEST['event_start']) : null; $recPost = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : null; if (!empty($_REQUEST['eventDate'])) { $duration = get_post_meta($postId, '_EventDuration', true); $start_time = isset($_EventStartDate) ? TribeDateUtils::timeOnly($_EventStartDate) : TribeDateUtils::timeOnly(tribe_get_start_date($post->ID)); $EventEndDate = TribeDateUtils::dateOnly(strtotime($_REQUEST['eventDate'] . ' ' . $start_time) + $duration, true); } $events_meta_box_template = $this->pluginPath . 'admin-views/events-meta-box.php'; $events_meta_box_template = apply_filters('tribe_events_meta_box_template', $events_meta_box_template); include $events_meta_box_template; }
/** * Retrieves beginning/end times for a given date * * @param string $date Y-m-d date string * @param string $key Key of cached data to retrieve * * return string|int */ private function get_cutoff_details($date, $key) { static $beginnings_and_ends = array(); if (empty($beginnings_and_ends[$date])) { $beginnings_and_ends[$date] = array('beginning' => tribe_event_beginning_of_day($date), 'end' => tribe_event_end_of_day($date)); $beginnings_and_ends[$date]['beginning_timestamp'] = strtotime($beginnings_and_ends[$date]['beginning']); $beginnings_and_ends[$date]['end_timestamp'] = strtotime($beginnings_and_ends[$date]['end']); } return $beginnings_and_ends[$date][$key]; }
/** * Add custom query modification to the pre_get_posts hook as necessary for PRO. * * @param WP_Query $query The current query object. * @return WP_Query The modified query object. * @author Timothy Wood * @since 3.0 */ public function pre_get_posts($query) { if ($query->is_single() && $query->get('eventDate')) { $this->set_post_id_for_recurring_event_query($query); } if (!empty($query->tribe_is_event_pro_query)) { switch ($query->query_vars['eventDisplay']) { case 'week': $week = tribe_get_first_week_day($query->get('eventDate')); $query->set('eventDate', $week); $query->set('start_date', $week); $query->set('end_date', tribe_get_last_week_day($week)); $query->set('posts_per_page', -1); // show ALL week posts $query->set('hide_upcoming', false); break; case 'day': $event_date = $query->get('eventDate') != '' ? $query->get('eventDate') : Date('Y-m-d', current_time('timestamp')); $query->set('eventDate', $event_date); $query->set('start_date', tribe_event_beginning_of_day($event_date)); $query->set('end_date', tribe_event_end_of_day($event_date)); $query->set('posts_per_page', -1); // show ALL day posts $query->set('hide_upcoming', false); break; case 'photo': $query->set('hide_upcoming', false); break; case 'all': $slug = $query->get('name'); if (empty($slug)) { break; // we shouldn't be here } unset($query->query_vars['name']); unset($query->query_vars['tribe_events']); $all_ids = TribeEventsRecurrenceMeta::get_events_by_slug($slug); if (empty($all_ids)) { $query->set('p', -1); } else { $query->set('post__in', $all_ids); } break; } apply_filters('tribe_events_pro_pre_get_posts', $query); } }
/** * given a set of meta data, prepare date data if it exists * * @param $data array Associative array of event meta data * * @return array */ protected static function prepare_event_date_meta($event_id, $data) { $date_provided = false; if (isset($data['EventAllDay'])) { if (Tribe__Events__Date_Utils::is_all_day($data['EventAllDay'])) { $data['EventAllDay'] = 'yes'; } else { $data['EventAllDay'] = 'no'; } } $datepicker_format = Tribe__Events__Date_Utils::datepicker_formats(tribe_get_option('datepickerFormat')); if (isset($data['EventStartDate'])) { $data['EventStartDate'] = Tribe__Events__Date_Utils::datetime_from_format($datepicker_format, $data['EventStartDate']); } if (isset($data['EventEndDate'])) { $data['EventEndDate'] = Tribe__Events__Date_Utils::datetime_from_format($datepicker_format, $data['EventEndDate']); } if (isset($data['EventAllDay']) && 'yes' === $data['EventAllDay']) { $date_provided = true; $data['EventStartDate'] = tribe_event_beginning_of_day($data['EventStartDate']); $data['EventEndDate'] = tribe_event_end_of_day($data['EventEndDate']); } elseif (isset($data['EventStartDate']) && isset($data['EventEndDate'])) { $date_provided = true; delete_post_meta($event_id, '_EventAllDay'); $start_date_string = "{$data['EventStartDate']} {$data['EventStartHour']}:{$data['EventStartMinute']}:00"; $end_date_string = "{$data['EventEndDate']} {$data['EventEndHour']}:{$data['EventEndMinute']}:00"; if (isset($data['EventStartMeridian'])) { $start_date_string .= " {$data['EventStartMeridian']}"; } if (isset($data['EventEndMeridian'])) { $end_date_string .= " {$data['EventEndMeridian']}"; } $data['EventStartDate'] = date(Tribe__Events__Date_Utils::DBDATETIMEFORMAT, strtotime($start_date_string)); $data['EventEndDate'] = date(Tribe__Events__Date_Utils::DBDATETIMEFORMAT, strtotime($end_date_string)); } if (!$date_provided) { $data['EventStartDate'] = get_post_meta($event_id, '_EventStartDate', true); $data['EventEndDate'] = get_post_meta($event_id, '_EventEndDate', true); return $data; } // If a specific timezone was not specified, default to the sitewide timezone if (!isset($data['EventTimezone'])) { $data['EventTimezone'] = Tribe__Events__Timezones::wp_timezone_string(); } // Additionally store datetimes in UTC $data['EventStartDateUTC'] = Tribe__Events__Timezones::to_utc($data['EventStartDate'], $data['EventTimezone']); $data['EventEndDateUTC'] = Tribe__Events__Timezones::to_utc($data['EventEndDate'], $data['EventTimezone']); $data['EventTimezoneAbbr'] = Tribe__Events__Timezones::abbr($data['EventStartDate'], $data['EventTimezone']); // sanity check that start date < end date $start_timestamp = strtotime($data['EventStartDate']); $end_timestamp = strtotime($data['EventEndDate']); if ($start_timestamp > $end_timestamp) { $data['EventEndDate'] = $data['EventStartDate']; } $data['EventDuration'] = strtotime($data['EventEndDate']) - $start_timestamp; return $data; }
/** * Given a date and an event, returns true or false if the event is happening on that date * This function properly adjusts for the EOD cutoff and multi-day events * * @param null $date * @param null $event * * @return mixed|void */ function tribe_event_is_on_date($date = null, $event = null) { if (null === $date) { $date = current_time('mysql'); } if (null === $event) { global $post; $event = $post; if (empty($event)) { _doing_it_wrong(__FUNCTION__, __('The function needs to be passed an $event or used in the loop.', 'tribe-events-calendar')); return false; } } $event_is_on_date = false; $start_of_day = tribe_event_beginning_of_day($date, 'U'); $end_of_day = tribe_event_end_of_day($date, 'U'); $event_start = tribe_get_start_date($event, null, 'U'); $event_end = tribe_get_end_date($event, null, 'U'); // kludge if (!empty($event->_end_date_fixed)) { // @todo remove this once we can have all day events without a start / end time $event_end = date_create(date(Tribe__Events__Date_Utils::DBDATETIMEFORMAT, $event_end)); $event_end->modify('+1 day'); $event_end = $event_end->format('U'); } /** * conditions: * event starts on this day (event start time is between start and end of day) * event ends on this day (event end time is between start and end of day) * event starts before start of day and ends after end of day (spans across this day) * note: * events that start exactly on the EOD cutoff will count on the following day * events that end exactly on the EOD cutoff will count on the previous day */ $event_starts_today = $event_start >= $start_of_day && $event_start < $end_of_day; $event_ends_today = $event_end > $start_of_day && $event_end <= $end_of_day; $event_spans_across_today = $event_start < $start_of_day && $event_end > $end_of_day; if ($event_starts_today || $event_ends_today || $event_spans_across_today) { $event_is_on_date = true; } return apply_filters('tribe_event_is_on_date', $event_is_on_date, $date, $event); }
private static function getRecurrenceForEvent($event_id) { /** @var string $recType */ /** @var string $recEndType */ /** @var string $recEnd */ /** @var int $recEndCount */ extract(self::getRecurrenceMeta($event_id)); if ($recType == 'None') { return new Tribe__Events__Pro__Null_Recurrence(); } $rules = self::getSeriesRules($event_id); $recStart = strtotime(get_post_meta($event_id, '_EventStartDate', true) . '+00:00'); switch ($recEndType) { case 'On': $recEnd = strtotime(tribe_event_end_of_day($recEnd)); break; case 'Never': $recEnd = Tribe__Events__Pro__Recurrence::NO_END; break; case 'After': default: $recEnd = $recEndCount - 1; // subtract one because event is first occurrence break; } $recurrence = new Tribe__Events__Pro__Recurrence($recStart, $recEnd, $rules, $recEndType == 'After', get_post($event_id)); return $recurrence; }
/** * Get the events for a single day * * @param string $date * * @return WP_Query */ private function get_daily_events($date) { $args = wp_parse_args(array('start_date' => tribe_event_beginning_of_day($date), 'end_date' => tribe_event_end_of_day($date), 'posts_per_page' => $this->events_per_day, 'post__in' => $this->events_in_month, 'orderby' => 'menu_order'), self::$args); $result = tribe_get_events($args, true); return $result; }
/** * Add custom query modification to the pre_get_posts hook as necessary for PRO. * * @param WP_Query $query The current query object. * @return WP_Query The modified query object. * @author Timothy Wood * @since 3.0 */ public function pre_get_posts($query) { if (!empty($query->tribe_is_event_pro_query)) { switch ($query->query_vars['eventDisplay']) { case 'week': $week = tribe_get_first_week_day($query->get('eventDate')); $query->set('eventDate', $week); $query->set('start_date', $week); $query->set('end_date', tribe_get_last_week_day($week)); $query->set('posts_per_page', -1); // show ALL week posts $query->set('hide_upcoming', false); break; case 'day': $event_date = $query->get('eventDate') != '' ? $query->get('eventDate') : Date('Y-m-d', current_time('timestamp')); $query->set('eventDate', $event_date); $query->set('start_date', tribe_event_beginning_of_day($event_date)); $query->set('end_date', tribe_event_end_of_day($event_date)); $query->set('posts_per_page', -1); // show ALL day posts $query->set('hide_upcoming', false); break; case 'photo': $query->set('hide_upcoming', false); break; } apply_filters('tribe_events_pro_pre_get_posts', $query); } }
/** * Multi-day Event Test * * Returns true if the event spans multiple days * * @category Events * @param int $postId (optional) * * @return bool true if event spans multiple days */ function tribe_event_is_multiday($postId = null) { $postId = Tribe__Events__Main::postIdHelper($postId); $start = tribe_get_start_date($postId, true, Tribe__Events__Date_Utils::DBDATETIMEFORMAT); $end = tribe_get_end_date($postId, true, Tribe__Events__Date_Utils::DBDATETIMEFORMAT); $end = strtotime($end); $output = $end > strtotime(tribe_event_end_of_day($start)); return apply_filters('tribe_event_is_multiday', $output, $postId, $start, $end); }
protected static function get_rounded_end_of_day($date, $format = 'U') { $date = (int) tribe_event_end_of_day($date, 'U') + 1; $date = date('Y-m-d H:00:00', $date); return date($format, strtotime($date)); }
/** * Used by createEvent and updateEvent - saves all the various event meta * * @param int $event_id The event ID we are modifying meta for. * @param array $data The meta fields we want saved. * @param WP_Post The event itself. * * @return void */ public static function saveEventMeta($event_id, $data, $event = null) { if (isset($data['EventAllDay']) && ($data['EventAllDay'] == 'yes' || $data['EventAllDay'] == true || !isset($data['EventStartDate']))) { $data['EventStartDate'] = tribe_event_beginning_of_day($data['EventStartDate']); $data['EventEndDate'] = tribe_event_end_of_day($data['EventEndDate']); } else { delete_post_meta($event_id, '_EventAllDay'); if (isset($data['EventStartMeridian'])) { $data['EventStartDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventStartDate'] . " " . $data['EventStartHour'] . ":" . $data['EventStartMinute'] . ":00 " . $data['EventStartMeridian'])); $data['EventEndDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventEndDate'] . " " . $data['EventEndHour'] . ":" . $data['EventEndMinute'] . ":00 " . $data['EventEndMeridian'])); } else { $data['EventStartDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventStartDate'] . " " . $data['EventStartHour'] . ":" . $data['EventStartMinute'] . ":00")); $data['EventEndDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventEndDate'] . " " . $data['EventEndHour'] . ":" . $data['EventEndMinute'] . ":00")); } } if (empty($data['EventHideFromUpcoming'])) { delete_post_meta($event_id, '_EventHideFromUpcoming'); } // sanity check that start date < end date $startTimestamp = strtotime($data['EventStartDate']); $endTimestamp = strtotime($data['EventEndDate']); if ($startTimestamp > $endTimestamp) { $data['EventEndDate'] = $data['EventStartDate']; } $data['EventDuration'] = strtotime($data['EventEndDate']) - $startTimestamp; update_post_meta($event_id, '_EventShowMapLink', isset($data['venue']['EventShowMapLink'])); update_post_meta($event_id, '_EventShowMap', isset($data['venue']['EventShowMap'])); if (isset($data['post_status'])) { $post_status = $data['post_status']; } else { $post_status = get_post_status($event_id); } if (isset($data["Organizer"])) { if (!empty($data["Organizer"]["OrganizerID"])) { $organizer_post_status = get_post($data["Organizer"]['OrganizerID'])->post_status; } else { $organizer_post_status = $post_status; } $data['EventOrganizerID'] = TribeEventsAPI::saveEventOrganizer($data["Organizer"], $event, $organizer_post_status); } if (isset($data["Venue"])) { if (!empty($data['Venue']["VenueID"])) { $venue_post_status = get_post($data['Venue']['VenueID'])->post_status; } else { $venue_post_status = $post_status; } $data['EventVenueID'] = TribeEventsAPI::saveEventVenue($data["Venue"], $event, $venue_post_status); } $cost = isset($data['EventCost']) ? $data['EventCost'] : ''; $data['EventCost'] = $cost; do_action('tribe_events_event_save', $event_id); $cost = isset($data['EventCost']) ? $data['EventCost'] : ''; $data['EventCost'] = $cost; //update meta fields foreach (TribeEvents::instance()->metaTags as $tag) { $htmlElement = ltrim($tag, '_'); if (isset($data[$htmlElement]) && $tag != TribeEvents::EVENTSERROROPT) { if (is_string($data[$htmlElement])) { $data[$htmlElement] = filter_var($data[$htmlElement], FILTER_SANITIZE_STRING); } update_post_meta($event_id, $tag, $data[$htmlElement]); } } // Set sticky state for calendar view. if (isset($data['EventShowInCalendar']) && $data['EventShowInCalendar'] == 'yes' && $event->menu_order != '-1') { $update_event = array('ID' => $event_id, 'menu_order' => '-1'); wp_update_post($update_event); } elseif ((!isset($data['EventShowInCalendar']) || $data['EventShowInCalendar'] != 'yes') && $event->menu_order == '-1') { $update_event = array('ID' => $event_id, 'menu_order' => '0'); wp_update_post($update_event); } do_action('tribe_events_update_meta', $event_id, $data); }
public static function get_recurrence_for_event($event_id) { /** @var string $recType */ /** @var string $recEndType */ /** @var string $recEnd */ /** @var int $recEndCount */ $recurrence_meta = self::getRecurrenceMeta($event_id); $recurrences = array('rules' => array(), 'exclusions' => array()); if (!$recurrence_meta['rules']) { $recurrences[] = new Tribe__Events__Pro__Null_Recurrence(); return $recurrences; } foreach (array('rules', 'exclusions') as $rule_type) { foreach ($recurrence_meta[$rule_type] as &$recurrence) { $rule = self::get_series_rule($recurrence, $rule_type); $custom_type = 'none'; $start_time = null; $duration = (int) get_post_meta($event_id, '_EventDuration', true); if (isset($recurrence['custom']['type'])) { $custom_type = self::custom_type_to_key($recurrence['custom']['type']); } if (empty($recurrence['custom'][$custom_type]['same-time']) && isset($recurrence['custom']['start-time']) && isset($recurrence['custom']['duration'])) { $start_time = "{$recurrence['custom']['start-time']['hour']}:{$recurrence['custom']['start-time']['minute']}:00 {$recurrence['custom']['start-time']['meridian']}"; $duration = self::get_duration_in_seconds($recurrence['custom']['duration']); } $start = strtotime(get_post_meta($event_id, '_EventStartDate', true) . '+00:00'); $is_after = false; if ('rules' === $rule_type) { switch ($recurrence['end-type']) { case 'On': $end = strtotime(tribe_event_end_of_day($recurrence['end'])); break; case 'Never': $end = Tribe__Events__Pro__Recurrence::NO_END; break; case 'After': default: $end = $recurrence['end-count'] - 1; // subtract one because event is first occurrence $is_after = true; break; } } else { $end = Tribe__Events__Pro__Recurrence::NO_END; } $recurrences[$rule_type][] = new Tribe__Events__Pro__Recurrence($start, $end, $rule, $is_after, get_post($event_id), $start_time, $duration); } } return $recurrences; }
/** * Bump the :30 min EOD cutoff option to the next full hour * * @return void */ public function remove_30_min_eod_cutoffs() { $eod_cutoff = tribe_event_end_of_day(); if (Tribe__Events__Date_Utils::minutes_only($eod_cutoff) == '29') { $eod_cutoff = date_create('@' . (strtotime($eod_cutoff) + 1)); $eod_cutoff->modify('+30 minutes'); tribe_update_option('multiDayCutoff', $eod_cutoff->format('h:i')); } }
/** * Used by createEvent and updateEvent - saves all the various event meta * * @param int $event_id The event ID we are modifying meta for. * @param array $data The meta fields we want saved. * @param WP_Post The event itself. * * @return void */ public static function saveEventMeta($event_id, $data, $event = null) { $tec = TribeEvents::instance(); if (isset($data['EventAllDay']) && ($data['EventAllDay'] == 'yes' || $data['EventAllDay'] == true || !isset($data['EventStartDate']))) { $data['EventStartDate'] = tribe_event_beginning_of_day($data['EventStartDate']); $data['EventEndDate'] = tribe_event_end_of_day($data['EventEndDate']); } else { delete_post_meta($event_id, '_EventAllDay'); if (isset($data['EventStartMeridian'])) { $data['EventStartDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventStartDate'] . " " . $data['EventStartHour'] . ":" . $data['EventStartMinute'] . ":00 " . $data['EventStartMeridian'])); $data['EventEndDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventEndDate'] . " " . $data['EventEndHour'] . ":" . $data['EventEndMinute'] . ":00 " . $data['EventEndMeridian'])); } else { $data['EventStartDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventStartDate'] . " " . $data['EventStartHour'] . ":" . $data['EventStartMinute'] . ":00")); $data['EventEndDate'] = date(TribeDateUtils::DBDATETIMEFORMAT, strtotime($data['EventEndDate'] . " " . $data['EventEndHour'] . ":" . $data['EventEndMinute'] . ":00")); } } if (empty($data['EventHideFromUpcoming'])) { delete_post_meta($event_id, '_EventHideFromUpcoming'); } // sanity check that start date < end date $startTimestamp = strtotime($data['EventStartDate']); $endTimestamp = strtotime($data['EventEndDate']); if ($startTimestamp > $endTimestamp) { $data['EventEndDate'] = $data['EventStartDate']; } $data['EventDuration'] = strtotime($data['EventEndDate']) - $startTimestamp; update_post_meta($event_id, '_EventShowMapLink', isset($data['venue']['EventShowMapLink'])); update_post_meta($event_id, '_EventShowMap', isset($data['venue']['EventShowMap'])); if (isset($data['post_status'])) { $post_status = $data['post_status']; } else { $post_status = get_post_status($event_id); } if (isset($data["Organizer"])) { if (!empty($data["Organizer"]["OrganizerID"])) { $organizer_post_status = get_post($data["Organizer"]['OrganizerID'])->post_status; } else { $organizer_post_status = $post_status; } $data['EventOrganizerID'] = TribeEventsAPI::saveEventOrganizer($data["Organizer"], $event, $organizer_post_status); } if (isset($data["Venue"])) { if (!empty($data['Venue']["VenueID"])) { $venue_post_status = get_post($data['Venue']['VenueID'])->post_status; } else { $venue_post_status = $post_status; } $data['EventVenueID'] = TribeEventsAPI::saveEventVenue($data["Venue"], $event, $venue_post_status); } // Ordinarily there is a single cost value for each event, but addons (ie, ticketing plugins) may need // to record a number of different pricepoints for the same event $event_cost = isset($data['EventCost']) ? (array) $data['EventCost'] : array(); $data['EventCost'] = (array) apply_filters('tribe_events_event_costs', $event_cost, $event_id); do_action('tribe_events_event_save', $event_id); //update meta fields foreach ($tec->metaTags as $tag) { $htmlElement = ltrim($tag, '_'); if (isset($data[$htmlElement]) && $tag != TribeEvents::EVENTSERROROPT) { if (is_string($data[$htmlElement])) { $data[$htmlElement] = filter_var($data[$htmlElement], FILTER_SANITIZE_STRING); } // Fields with multiple values per key if (is_array($data[$htmlElement])) { delete_post_meta($event_id, $tag); foreach ($data[$htmlElement] as $value) { add_post_meta($event_id, $tag, $value); } } else { update_post_meta($event_id, $tag, $data[$htmlElement]); } } } // Set sticky state for calendar view. if (isset($data['EventShowInCalendar']) && $data['EventShowInCalendar'] == 'yes' && $event->menu_order != '-1') { $update_event = array('ID' => $event_id, 'menu_order' => '-1'); wp_update_post($update_event); } elseif ((!isset($data['EventShowInCalendar']) || $data['EventShowInCalendar'] != 'yes') && $event->menu_order == '-1') { $update_event = array('ID' => $event_id, 'menu_order' => '0'); wp_update_post($update_event); } do_action('tribe_events_update_meta', $event_id, $data); }
/** * Multi-day Event Test * * Returns true if the event spans multiple days * * @category Events * @param int $postId (optional) * * @return bool true if event spans multiple days */ function tribe_event_is_multiday($postId = null) { $postId = Tribe__Events__Main::postIdHelper($postId); $start = (array) tribe_get_event_meta($postId, '_EventStartDate', false); sort($start); $start = $start[0]; $end = strtotime(tribe_get_event_meta($postId, '_EventEndDate', true)); $output = $end > strtotime(tribe_event_end_of_day($start)); return apply_filters('tribe_event_is_multiday', $output, $postId, $start, $end); }
/** * Gets the event counts for individual days. * * @param array $args * @return array The counts array. */ public static function getEventCounts($args = array()) { global $wpdb; $date = date('Y-m-d'); $defaults = array('post_type' => TribeEvents::POSTTYPE, 'start_date' => tribe_event_beginning_of_day($date), 'end_date' => tribe_event_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'; $post_id_query = new WP_Query(); $post_ids = $post_id_query->query($args); if (empty($post_ids)) { return array(); } $counts = array(); switch ($args['display_type']) { case 'daily': default: global $wp_query; $output_date_format = '%Y-%m-%d'; $raw_counts = $wpdb->get_results(sprintf("\n\t\t\t\t\t\tSELECT tribe_event_start.post_id as ID, \n\t\t\t\t\t\t\tDATE_FORMAT( tribe_event_start.meta_value, '%1\$s') as EventStartDate, \n\t\t\t\t\t\t\tIF (tribe_event_duration.meta_value IS NULL, DATE_FORMAT( tribe_event_end_date.meta_value, '%1\$s'), DATE_FORMAT(DATE_ADD(CAST(tribe_event_start.meta_value AS DATETIME), INTERVAL tribe_event_duration.meta_value SECOND), '%1\$s')) as EventEndDate\n\t\t\t\t\t\tFROM {$wpdb->postmeta} AS tribe_event_start\n\t\t\t\t\t\tLEFT JOIN {$wpdb->postmeta} as tribe_event_duration ON ( tribe_event_start.post_id = tribe_event_duration.post_id AND tribe_event_duration.meta_key = '_EventDuration' )\n\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\tWHERE tribe_event_start.meta_key = '_EventStartDate'\n\t\t\t\t\t\tAND tribe_event_start.post_id IN ( %5\$s )\n\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\tOR (tribe_event_start.meta_value <= '%3\$s' AND DATE_ADD(CAST( tribe_event_start.meta_value AS DATETIME), INTERVAL tribe_event_duration.meta_value SECOND) >= '%3\$s')\n\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\tOR ( tribe_event_start.meta_value >= '%3\$s' AND tribe_event_start.meta_value <= '%4\$s')\n\t\t\t\t\t\t)\n\t\t\t\t\t\tORDER BY DATE(tribe_event_start.meta_value) ASC, TIME(tribe_event_start.meta_value) ASC;", $output_date_format, $output_date_format, $args['start_date'], $args['end_date'], implode(',', array_map('intval', $post_ids)))); // echo $wpdb->last_query; $start_date = new DateTime($args['start_date']); $end_date = new DateTime($args['end_date']); $days = self::dateDiff($start_date->format('Y-m-d'), $end_date->format('Y-m-d')); $term_id = isset($wp_query->query_vars[TribeEvents::TAXONOMY]) ? $wp_query->query_vars[TribeEvents::TAXONOMY] : null; if (is_int($term_id)) { $term = get_term_by('id', $term_id, TribeEvents::TAXONOMY); } elseif (is_string($term_id)) { $term = get_term_by('slug', $term_id, TribeEvents::TAXONOMY); } for ($i = 0, $date = $start_date; $i <= $days; $i++, $date->modify('+1 day')) { $formatted_date = $date->format('Y-m-d'); $count = 0; foreach ($raw_counts as $record) { $record_start = $record->EventStartDate; $record_end = $record->EventEndDate; if ($record_start <= $formatted_date && $record_end >= $formatted_date) { if (isset($term->term_id)) { $record_terms = get_the_terms($record->ID, TribeEvents::TAXONOMY); if (!$record_terms || $record_terms && !in_array($term, $record_terms)) { $count--; } } $count++; } } $counts[$formatted_date] = $count; } break; } return $counts; }
/** * @param string $date * * @return WP_Query */ private function get_daily_events($date) { $args = wp_parse_args(array('post__in' => self::$event_daily_ids[$date], 'post_type' => Tribe__Events__Main::POSTTYPE, 'start_date' => tribe_event_beginning_of_day($date), 'end_date' => tribe_event_end_of_day($date), 'eventDisplay' => 'custom', 'no_found_rows' => true, 'posts_per_page' => self::$posts_per_page_limit), self::$args); $result = Tribe__Events__Query::getEvents($args, true); return $result; }
/** * Given a date and an event, returns true or false if the event is happening on that date * This function properly adjusts for the EOD cutoff and multi-day events * * @param null $date * @param null $event * * @return mixed|void */ function tribe_event_is_on_date($date = null, $event = null) { if (null === $date) { $date = current_time('mysql'); } if (null === $event) { global $post; $event = $post; if (empty($event)) { _doing_it_wrong(__FUNCTION__, esc_html__('The function needs to be passed an $event or used in the loop.', 'the-events-calendar')); return false; } } $start_of_day = tribe_event_beginning_of_day($date, 'U'); $end_of_day = tribe_event_end_of_day($date, 'U'); $event_start = tribe_get_start_date($event, null, 'U'); $event_end = tribe_get_end_date($event, null, 'U'); // kludge if (!empty($event->_end_date_fixed)) { // @todo remove this once we can have all day events without a start / end time $event_end = date_create(date(Tribe__Events__Date_Utils::DBDATETIMEFORMAT, $event_end)); $event_end->modify('+1 day'); $event_end = $event_end->format('U'); } /* note: * events that start exactly on the EOD cutoff will count on the following day * events that end exactly on the EOD cutoff will count on the previous day */ $event_is_on_date = Tribe__Events__Date_Utils::range_coincides($start_of_day, $end_of_day, $event_start, $event_end); return apply_filters('tribe_event_is_on_date', $event_is_on_date, $date, $event); }
/** * @param string $date * @return WP_Query */ private function get_daily_events($date) { global $wp_query; $tribe_ecp = TribeEvents::instance(); $post_status = is_user_logged_in() ? array('publish', 'private') : 'publish'; $args = wp_parse_args(array('post__in' => self::$event_daily_ids[$date], 'post_type' => TribeEvents::POSTTYPE, 'start_date' => tribe_event_beginning_of_day($date), 'end_date' => tribe_event_end_of_day($date), 'eventDisplay' => 'custom', 'no_found_rows' => true, 'posts_per_page' => self::$posts_per_page_limit), self::$args); $result = TribeEventsQuery::getEvents($args, true); return $result; }
/** * If it's an all day event and the EOD cutoff is later than midnight * set the end date to be the previous day so it displays correctly in the datepicker * so the datepickers will match. we'll set the correct end time upon saving * * @todo remove this once we're allowed to have all day events without a start/end time */ protected function eod_correction() { $all_day = $this->vars['_EventAllDay']; $end_date = $this->vars['_EventEndDate']; $ends_at_midnight = '23:59:59' === Tribe__Events__Date_Utils::time_only($end_date); $midnight_cutoff = '23:59:59' === Tribe__Events__Date_Utils::time_only(tribe_event_end_of_day()); if (!$all_day || $ends_at_midnight || $midnight_cutoff) { return; } $end_date = date_create($this->vars['_EventEndDate']); $end_date->modify('-1 day'); $this->vars['_EventEndDate'] = $end_date->format(Tribe__Events__Date_Utils::DBDATETIMEFORMAT); }
/** * set internal mechanism for setting event id for retrieval with other tags * * @since 3.0 * @author tim@imaginesimplicty.com * @param int $event_id * @return boolean */ function tribe_events_week_setup_event($event_id = null) { do_action('tribe_events_week_pre_setup_event', $event_id); switch (Tribe_Events_Pro_Week_Template::$loop_type) { case 'allday': Tribe_Events_Pro_Week_Template::set_event_id($event_id); return true; case 'hourly': $event = Tribe_Events_Pro_Week_Template::get_hourly_event($event_id); if (empty($event->EventStartDate)) { return false; } $calendar_date = tribe_events_week_get_the_date(false); // use rounded beginning/end of day because calendar grid only starts on the hour $beginning_of_day = tribe_event_beginning_of_day($calendar_date, 'Y-m-d H:00:00'); $end_of_day = tribe_event_end_of_day($calendar_date, 'Y-m-d H:00:00'); if ($event->EventStartDate > $end_of_day) { return false; } if ($event->EventEndDate <= $beginning_of_day) { return false; } Tribe_Events_Pro_Week_Template::set_event_id($event_id); return true; } return false; }
/** * @param string $date * @return WP_Query */ private function get_daily_events($date) { global $wp_query; $tribe_ecp = TribeEvents::instance(); $post_status = is_user_logged_in() ? array('publish', 'private') : 'publish'; $args = wp_parse_args(array('eventDate' => $date, 'start_date' => tribe_event_beginning_of_day($date), 'end_date' => tribe_event_end_of_day($date), 'post__not_in' => self::$hide_upcoming_ids, 'hide_upcoming' => false, 'posts_per_page' => self::$posts_per_page_limit, 'orderby' => 'menu_order', 'order' => 'ASC', 'post_status' => $post_status, 'eventDisplay' => 'custom', 'no_found_rows' => true), self::$args); if (is_tax($tribe_ecp->get_event_taxonomy())) { $cat = get_term_by('slug', get_query_var('term'), $tribe_ecp->get_event_taxonomy()); $args['eventCat'] = (int) $cat->term_id; } $cache = new TribeEventsCache(); $cache_key = 'daily_events_' . serialize($args); $found = $cache->get($cache_key, 'save_post'); if ($found && is_a($found, 'WP_Query')) { // return $found; } $result = TribeEventsQuery::getEvents($args, true); $cache->set($cache_key, $result, self::$cache_expiration, 'save_post'); return $result; }