/** * Parses through an array of lines (of an ICAL file), creates events and inserts them as they are found. * @since 1.1.0 * * @param array - $lines, array of lines of an ICAL file */ function import_events($lines) { global $EO_Errors; $state = "NONE"; $error = false; $error_count = 0; $event_count = 0; $event_array = array(); $event_array['event'] = array(); $event_array['event_post'] = array(); $event_array['event_meta'] = array(); //Get Blog timezone, set Calendar timezone to this by default $blog_tz = eo_get_blog_timezone(); $cal_tz = $blog_tz; $output = ""; //Record number of venues / categories created global $eventorganiser_venues_created, $eventorganiser_cats_created; $eventorganiser_venues_created = 0; $eventorganiser_cats_created = 0; //Read through each line for ($n = 0; $n < count($lines) && !$error; $n++) { $buff = trim($lines[$n]); if (!empty($buff)) { $line = explode(':', $buff, 2); //On the right side of the line we may have DTSTART;TZID= or DTSTART;VALUE= $modifiers = explode(';', $line[0]); $property = array_shift($modifiers); $value = isset($line[1]) ? trim($line[1]) : ''; //If we are in EVENT state if ($state == "VEVENT") { //If END:VEVENT, insert event into database if ($property == 'END' && $value == 'VEVENT') { $state = "VCALENDAR"; $event_array['event']['YmdFormated'] = true; $event_array['event']['dateObjects'] = true; //Insert new post from objects $post_id = EO_Event::insertNewEvent($event_array['event_post'], $event_array['event']); if (!$post_id) { $error_count++; } } else { //Otherwise, parse event property try { $event_array = $this->parse_Event_Property($event_array, $property, $value, $modifiers, $blog_tz, $cal_tz); } catch (Exception $e) { $error_count++; $preamble = sprintf(__('Line: %1$d', 'eventorganiser'), $n + 1); $EO_Errors->add('eo_error', $preamble . ' ' . $e->getMessage()); //Abort parsing event $state = "VCALENDAR"; } } // If we are in CALENDAR state } elseif ($state == "VCALENDAR") { //Begin event if ($property == 'BEGIN' && $value == 'VEVENT') { $state = "VEVENT"; $event_count++; $event_array['event'] = array(); $event_array['event_post'] = array(); $event_array['event_meta'] = array(); } elseif ($property == 'END' && $value == 'VCALENDAR') { $state = "NONE"; } elseif ($property == 'X-WR-TIMEZONE') { try { $cal_tz = self::parse_TZID($value); } catch (Exception $e) { $preamble = sprintf(__('Line: %1$d', 'eventorganiser'), $n + 1); $EO_Errors->add('eo_error', $preamble . ' ' . $e->getMessage()); break; } } } elseif ($state == "NONE" && $property == 'BEGIN' && $value == 'VCALENDAR') { $state = "VCALENDAR"; } } //If line is not empty } //For each line //Display message if ($event_count == 0) { $EO_Errors->add('eo_error', __("No events were imported.", 'eventorganiser')); } elseif ($error_count > 0) { $EO_Errors->add('eo_error', sprintf(__('There was an error with %1$d of %2$d events in the ical file'), $error_count, $event_count)); } else { if ($event_count == 1) { $message = __("1 event was successfully imported", 'eventorganiser') . "."; } else { $message = sprintf(__("%d events were successfully imported", 'eventorganiser'), $event_count) . "."; } if ($eventorganiser_venues_created == 1) { $message .= " " . __("1 venue was created", 'eventorganiser') . "."; } elseif ($eventorganiser_venues_created > 1) { $message .= " " . sprintf(__("%d venues were created", 'eventorganiser'), $eventorganiser_venues_created) . "."; } if ($eventorganiser_cats_created == 1) { $message .= " " . __("1 category was created", 'eventorganiser') . "."; } elseif ($eventorganiser_cats_created > 1) { $message .= " " . sprintf(__("%d categories were created", 'eventorganiser'), $eventorganiser_cats_created) . "."; } $EO_Errors->add('eo_notice', $message); } return true; }
function page_actions() { global $wpdb, $eventorganiser_events_table; //Check action if (!empty($_REQUEST['save']) || !empty($_REQUEST['publish'])) { //Check nonce check_admin_referer('eventorganiser_calendar_save'); //authentication checks if (!current_user_can('edit_events')) { wp_die(__('You do not have sufficient permissions to create events')); } $input = $_REQUEST['eo_event']; //Retrieve input from posted data //Set the status of the new event if (!empty($_REQUEST['save'])) { $status = 'draft'; } else { if (current_user_can('publish_events')) { $status = 'publish'; } else { $status = 'pending'; } } //Set post and event details $input['occurrence'] = 'once'; $input['YmdFormated'] = true; $venue = (int) $input['venue_id']; $post_input = array('post_title' => $input['event_title'], 'post_status' => $status, 'post_content' => $input['event_content'], 'post_type' => 'event', 'tax_input' => array('event-venue' => array($venue))); //Insert event $post_id = EO_Event::insertNewEvent($post_input, $input); if ($post_id) { //If event was successfully inserted, redirect and display appropriate message $redirect = get_edit_post_link($post_id, ''); if ($status == 'publish') { $redirect = add_query_arg('message', 6, $redirect); } else { $redirect = add_query_arg('message', 7, $redirect); } //Redirect to event admin page & exit wp_redirect($redirect); exit; } } elseif (isset($_REQUEST['action']) && ($_REQUEST['action'] == 'delete_occurrence' || $_REQUEST['action'] == 'break_series') && isset($_REQUEST['series']) && isset($_REQUEST['event'])) { $post_id = intval($_REQUEST['series']); $event_id = intval($_REQUEST['event']); $action = $_REQUEST['action']; if ($action == 'break_series') { //Check nonce check_admin_referer('eventorganiser_break_series_' . $event_id); //Check permissions if (!current_user_can('edit_event', $post_id) || !current_user_can('delete_event', $post_id)) { wp_die(__('You do not have sufficient permissions to edit this event', 'eventorganiser')); } //Get current event $query_array = array('event_occurrence_id' => $event_id, 'posts_per_page' => -1, 'post_type' => 'event', 'showpastevents' => true, 'perm' => 'readable'); $query = new WP_Query($query_array); global $post; if ($query->have_posts()) { $query->the_post(); //Assign new event taxonomy terms $taxs = array('event-category', 'event-tag', 'event-venue'); $tax_input = array(); foreach ($taxs as $tax) { $terms = get_the_terms($post->ID, $tax); if ($terms && !is_wp_error($terms)) { $tax_input[$tax] = array_map('intval', wp_list_pluck($terms, 'term_id')); } } //Post details $post_array = array('post_title' => $post->post_title, 'post_name' => $post->post_name, 'post_author' => $post->post_author, 'post_content' => $post->post_content, 'post_status' => $post->post_status, 'post_date' => $post->post_date, 'post_date_gmt' => $post->post_date_gmt, 'post_excerpt' => $post->post_excerpt, 'post_password' => $post->post_password, 'post_type' => 'event', 'tax_input' => $tax_input, 'comment_status' => $post->comment_status, 'ping_status' => $post->ping_status); //Event details $tz = EO_Event::get_timezone(); //blog timzone $event_array = array('dateObjects' => true, 'start' => new DateTIme($post->StartDate . ' ' . $post->StartTime, $tz), 'end' => new DateTIme($post->EndDate . ' ' . $post->FinishTime, $tz), 'allday' => $post->event_allday, 'schedule' => 'once', 'frequency' => 1, 'venue' => $post->Venue); //Create new event with duplicated details $new_event_id = EO_Event::insertNewEvent($post_array, $event_array); //delete occurrence, if ($new_event_id) { $del = $wpdb->get_results($wpdb->prepare("DELETE FROM {$eventorganiser_events_table} WHERE post_id=%d AND event_id=%d", $post_id, $event_id)); $post_custom = get_post_custom($post->ID); foreach ($post_custom as $meta_key => $meta_values) { $unique = $meta_key[0] == '_' ? true : false; foreach ($meta_values as $meta_value) { add_post_meta($new_event_id, $meta_key, $meta_value, $unique); } } } //Redirect to prevent resubmisson $redirect = add_query_arg(array('post_type' => 'event', 'page' => 'calendar'), admin_url('edit.php')); wp_redirect($redirect); } } elseif ($action == 'delete_occurrence') { //Check nonce check_admin_referer('eventorganiser_delete_occurrence_' . $event_id); //Check permissions if (!current_user_can('delete_event', $post_id)) { wp_die(__('You do not have sufficient permissions to delete this event', 'eventorganiser')); } $del = $wpdb->get_results($wpdb->prepare("DELETE FROM {$eventorganiser_events_table} WHERE post_id=%d AND event_id=%d", $post_id, $event_id)); global $EO_Errors; $EO_Errors = new WP_Error(); $EO_Errors->add('eo_notice', '<strong>' . __("Occurrence deleted.", 'eventorganiser') . '</strong>'); } } }