public function iCalFeed($post = null, $eventCatSlug = null, $eventDate = null) { $tribeEvents = TribeEvents::instance(); $postId = $post ? $post->ID : null; $getstring = isset($_GET['ical']) ? $_GET['ical'] : null; $wpTimezoneString = get_option('timezone_string'); $postType = TribeEvents::POSTTYPE; $events = ''; $lastBuildDate = ''; $eventsTestArray = array(); $blogHome = get_bloginfo('url'); $blogName = get_bloginfo('name'); $includePosts = $postId ? '&include=' . $postId : ''; $eventsCats = $eventCatSlug ? '&' . TribeEvents::TAXONOMY . '=' . $eventCatSlug : ''; if ($post) { $eventPosts = array(); $eventPosts[] = $post; } else { $eventPosts = get_posts('posts_per_page=-1&post_type=' . $postType . $includePosts . $eventsCats); } foreach ($eventPosts as $eventPost) { if ($eventDate) { $duration = TribeDateUtils::timeBetween($eventPost->EventStartDate, $eventPost->EventEndDate); $startDate = TribeDateUtils::addTimeToDate($eventDate, TribeDateUtils::timeOnly($eventPost->EventStartDate)); $endDate = TribeDateUtils::dateAndTime(strtotime($startDate) + $duration, true); } else { $startDate = $eventPost->EventStartDate; $endDate = $eventPost->EventEndDate; } // convert 2010-04-08 00:00:00 to 20100408T000000 or YYYYMMDDTHHMMSS $startDate = str_replace(array('-', ' ', ':'), array('', 'T', ''), $startDate); $endDate = str_replace(array('-', ' ', ':'), array('', 'T', ''), $endDate); if (get_post_meta($eventPost->ID, '_EventAllDay', true) == 'yes') { $startDate = substr($startDate, 0, 8); $endDate = substr($endDate, 0, 8); // endDate bumped ahead one day to counter iCal's off-by-one error $endDateStamp = strtotime($endDate); $endDate = date('Ymd', $endDateStamp + 86400); $type = 'DATE'; } else { $type = 'DATE-TIME'; } $description = preg_replace("/[\n\t\r]/", ' ', strip_tags($eventPost->post_content)); // add fields to iCal output $item = array(); $item[] = "DTSTART;VALUE={$type}:" . $startDate; $item[] = "DTEND;VALUE={$type}:" . $endDate; $item[] = 'DTSTAMP:' . date('Ymd\\THis', time()); $item[] = 'CREATED:' . str_replace(array('-', ' ', ':'), array('', 'T', ''), $eventPost->post_date); $item[] = 'LAST-MODIFIED:' . str_replace(array('-', ' ', ':'), array('', 'T', ''), $eventPost->post_modified); $item[] = 'UID:' . $eventPost->ID . '-' . strtotime($startDate) . '-' . strtotime($endDate) . '@' . $blogHome; $item[] = 'SUMMARY:' . $eventPost->post_title; $item[] = 'DESCRIPTION:' . str_replace(',', '\\,', $description); $item[] = 'LOCATION:' . html_entity_decode($tribeEvents->fullAddressString($eventPost->ID), ENT_QUOTES); $item[] = 'URL:' . get_permalink($eventPost->ID); $item = apply_filters('tribe_ical_feed_item', $item, $eventPost); $events .= "BEGIN:VEVENT\n" . implode("\n", $item) . "\nEND:VEVENT\n"; } header('Content-type: text/calendar'); header('Content-Disposition: attachment; filename="iCal-TribeEvents.ics"'); $content = "BEGIN:VCALENDAR\n"; $content .= "VERSION:2.0\n"; $content .= 'PRODID:-//' . $blogName . ' - ECPv' . TribeEvents::VERSION . "//NONSGML v1.0//EN\n"; $content .= "CALSCALE:GREGORIAN\n"; $content .= "METHOD:PUBLISH\n"; $content .= 'X-WR-CALNAME:' . apply_filters('tribe_ical_feed_calname', $blogName) . "\n"; $content .= 'X-ORIGINAL-URL:' . $blogHome . "\n"; $content .= 'X-WR-CALDESC:Events for ' . $blogName . "\n"; if ($wpTimezoneString) { $content .= 'X-WR-TIMEZONE:' . $wpTimezoneString . "\n"; } $content = apply_filters('tribe_ical_properties', $content); $content .= $events; $content .= 'END:VCALENDAR'; echo $content; exit; }