/** * Check that the upgrade routine run for users updating EO after * updating to WP 4.2 is able to recover 'lost' data. */ public function testPostSplitTermsUpgrade() { global $wpdb; if (version_compare(get_bloginfo('version'), '4.2-alpha-31007-src', '<')) { $this->markTestSkipped(sprintf('This test applies only to 4.2-alpha-31007-src+, running %s', get_bloginfo('version'))); return; } remove_action('split_shared_term', '_eventorganiser_handle_split_shared_terms', 10); register_taxonomy('wptests_tax', 'event'); //Create terms - they'll have unique term IDs $t1 = wp_insert_term('Foo', 'wptests_tax'); $t2 = eo_insert_venue('Foo', array('address' => 'Edinburgh Castle', 'city' => 'Edinburgh', 'country' => 'UK')); $t3 = wp_insert_term('Foo', 'event-category'); //Manually modify the terms so they share term IDs $wpdb->update($wpdb->term_taxonomy, array('term_id' => $t1['term_id']), array('term_taxonomy_id' => $t2['term_taxonomy_id']), array('%d'), array('%d')); $wpdb->update($wpdb->term_taxonomy, array('term_id' => $t1['term_id']), array('term_taxonomy_id' => $t3['term_taxonomy_id']), array('%d'), array('%d')); //Insert/move data so it is assigned to 'pre-split ID'. update_option('eo-event-category_' . $t1['term_id'], array('colour' => '#ff0000')); $wpdb->update($wpdb->eo_venuemeta, array('eo_venue_id' => $t1['term_id']), array('eo_venue_id' => $t2['term_id'])); //Create event and assign terms so we can retrieve term IDs $events = $this->factory->event->create_many(3); wp_set_object_terms($events[0], array('Foo'), 'wptests_tax'); wp_set_object_terms($events[1], array('Foo'), 'event-venue'); wp_set_object_terms($events[2], array('Foo'), 'event-category'); // Verify that the term IDs are shared. $t1_terms = wp_get_object_terms($events[0], 'wptests_tax'); $t2_terms = wp_get_object_terms($events[1], 'event-venue'); $t3_terms = wp_get_object_terms($events[2], 'event-category'); $this->assertSame($t1_terms[0]->term_id, $t2_terms[0]->term_id); $this->assertSame($t1_terms[0]->term_id, $t3_terms[0]->term_id); //Split by updating venue eo_update_venue($t2_terms[0]->term_id, array('name' => 'Venue Foo')); wp_update_term($t3_terms[0]->term_id, 'event-category', array('name' => 'Category Foo')); //Check meta data is "lost" $t2_terms = wp_get_object_terms($events[1], 'event-venue'); $t3_terms = wp_get_object_terms($events[2], 'event-category'); $address = eo_get_venue_address($t2_terms[0]->term_id); $this->assertEquals('', ''); $meta = get_option('eo-event-category_' . $t3_terms[0]->term_id); $this->assertEquals(false, $meta); //Run upgrade routine eventorganiser_021200_update(); //Check data is recovered $t2_terms = wp_get_object_terms($events[1], 'event-venue'); $t3_terms = wp_get_object_terms($events[2], 'event-category'); $address = eo_get_venue_address($t2_terms[0]->term_id); $this->assertEquals('Edinburgh', $address['city']); $meta = get_option('eo-event-category_' . $t3_terms[0]->term_id); $this->assertEquals('#ff0000', $meta['colour']); add_action('split_shared_term', '_eventorganiser_handle_split_shared_terms', 10, 4); }
function page_actions() { global $EO_Errors; add_action('admin_notices', array($this, 'admin_notices')); //Determine action if any $action = $this->current_action(); $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false; if ($action && $venue || $action == 'add') { if (!current_user_can('manage_venues')) { wp_die(__('You do not have permission to manage venues', 'eventorganiser')); } switch ($action) { case 'update': if (!check_admin_referer('eventorganiser_update_venue_' . $venue)) { wp_die(__('You do not have permission to edit this venue.', 'eventorganiser')); } $venue = get_term_by('slug', esc_attr($venue), 'event-venue'); $return = eo_update_venue($venue->term_id, $_POST['eo_venue']); if (is_wp_error($return)) { $EO_Errors->add('eo_error', __('Venue <strong>was not</strong> updated', 'eventorganiser') . ': ' . $return->get_error_message()); } else { $term_id = (int) $return['term_id']; $venue = get_term($term_id, 'event-venue'); $url = add_query_arg(array('page' => 'venues', 'action' => 'edit', 'event-venue' => $venue->slug, 'message' => 2), admin_url('edit.php?post_type=event')); wp_redirect(esc_url_raw($url)); exit; } break; case 'add': if (!check_admin_referer('eventorganiser_add_venue')) { wp_die(__('You do not have permission to edit this venue.', 'eventorganiser')); } $args = $_POST['eo_venue']; $name = isset($args['name']) ? $args['name'] : ''; //Venue may already exist in database since it may have been added via ajax (by pro plug-in); if (!empty($args['venue_id']) && ($_venue = eo_get_venue_by('id', $args['venue_id']))) { //Since we're updating, need to explicitly provide slug to update it. Slug will be 'new-venue'. $args['slug'] = sanitize_title($args['name']); $return = eo_update_venue($_venue->term_id, $args); } else { $return = eo_insert_venue($name, $args); } if (is_wp_error($return)) { $EO_Errors->add('eo_error', __('Venue <strong>was not</strong> created', 'eventorganiser') . ': ' . $return->get_error_message()); $_REQUEST['action'] = 'create'; } else { $term_id = (int) $return['term_id']; $venue = get_term($term_id, 'event-venue'); $url = add_query_arg(array('page' => 'venues', 'action' => 'edit', 'event-venue' => $venue->slug, 'message' => 1), admin_url('edit.php?post_type=event')); wp_redirect(esc_url_raw($url)); exit; } break; case 'delete': if (is_array($_REQUEST['event-venue'])) { $nonce = 'bulk-venues'; } else { $nonce = 'eventorganiser_delete_venue_' . $venue; } if (!check_admin_referer($nonce)) { wp_die(__('You do not have permission to delete this venue', 'eventorganiser')); } $venues = (array) $venue; //Count the number of deleted venues $deleted = 0; foreach ($venues as $venue) { $venue = get_term_by('slug', esc_attr($venue), 'event-venue'); $resp = eo_delete_venue($venue->term_id); if (!is_wp_error($resp) && true === $resp) { $deleted++; } } if ($deleted > 0) { $url = add_query_arg(array('page' => 'venues', 'message' => 3), admin_url('edit.php?post_type=event')); wp_redirect(esc_url_raw($url)); exit; } else { $EO_Errors = new WP_Error('eo_error', __('Venue(s) <strong>were not </strong> deleted', 'eventorganiser')); } break; } } $action = $this->current_action(); if (in_array($action, array('edit', 'update', 'create'))) { $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false; //Venued edit page add_meta_box('submitdiv', __('Save', 'eventorganiser'), 'eventorganiser_venue_submit', 'event_page_venues', 'side', 'high'); /** * Fires after all built-in meta boxes for venues have been added. * * @param Object $venue Venue (term object) */ do_action('add_meta_boxes_event_page_venues', $venue); /** * @ignore */ do_action('add_meta_boxes', 'event_page_venues', $venue); add_screen_option('layout_columns', array('max' => 2, 'default' => 2)); } else { //Venue admin list require_once 'classes/class-eo-venue-list-table.php'; add_filter('manage_event_page_venues_columns', 'eventorganiser_venue_admin_columns'); add_screen_option('per_page', array('option' => 'edit_event_venue_per_page', 'label' => __('Venues', 'eventorganiser'), 'default' => 20)); } }
/** * Saves the event data posted from the event metabox. * Hooked to the 'save_post' action * * @since 1.0.0 * * @param int $post_id the event post ID * @return int $post_id the event post ID */ function eventorganiser_details_save($post_id) { //make sure data came from our meta box if (!isset($_POST['_eononce']) || !wp_verify_nonce($_POST['_eononce'], 'eventorganiser_event_update_' . $post_id . '_' . get_current_blog_id())) { return; } //verify this is not an auto save routine. if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } //authentication checks if (!current_user_can('edit_event', $post_id)) { return; } //Collect raw data $raw_data = isset($_POST['eo_input']) ? $_POST['eo_input'] : array(); $raw_data = wp_parse_args($raw_data, array('StartDate' => '', 'EndDate' => '', 'StartTime' => '00:00', 'FinishTime' => '23:59', 'schedule' => 'once', 'event_frequency' => 1, 'schedule_end' => '', 'allday' => 0, 'schedule_meta' => '', 'days' => array(), 'include' => '', 'exclude' => '')); //Update venue $venue_id = !empty($raw_data['event-venue']) ? intval($raw_data['event-venue']) : null; //Maybe create a new venue if (empty($venue_id) && !empty($_POST['eo_venue']) && current_user_can('manage_venues')) { $venue = $_POST['eo_venue']; if (!empty($venue['name'])) { $new_venue = eo_insert_venue($venue['name'], $venue); if (!is_wp_error($new_venue)) { $venue_id = $new_venue['term_id']; } else { if ($new_venue->get_error_code() == 'term_exists') { $venue_id = eo_get_venue($event_id); } } } } //Set venue $r = wp_set_post_terms($post_id, array($venue_id), 'event-venue', false); //If reocurring, but not editing occurrences, can abort here, but trigger hook. if (eo_reoccurs($post_id) && (!isset($raw_data['AlterRe']) || 'yes' != $raw_data['AlterRe'])) { /** * Triggered after an event has been updated. * * @param int $post_id The ID of the event */ do_action('eventorganiser_save_event', $post_id); //Need this to update cache return; } //Check dates $date_format = eventorganiser_get_option('dateformat'); $is24 = eventorganiser_blog_is_24(); $time_format = $is24 ? 'H:i' : 'g:ia'; $datetime_format = $date_format . ' ' . $time_format; //Set times for all day events $all_day = intval($raw_data['allday']); if ($all_day) { $raw_data['StartTime'] = $is24 ? '00:00' : '12:00am'; $raw_data['FinishTime'] = $is24 ? '23:59' : '11:59pm'; } $start = eo_check_datetime($datetime_format, trim($raw_data['StartDate']) . ' ' . trim($raw_data['StartTime'])); $end = eo_check_datetime($datetime_format, trim($raw_data['EndDate']) . ' ' . trim($raw_data['FinishTime'])); $until = eo_check_datetime($datetime_format, trim($raw_data['schedule_end']) . ' ' . trim($raw_data['StartTime'])); //Collect schedule meta $schedule = $raw_data['schedule']; if ('weekly' == $schedule) { $schedule_meta = $raw_data['days']; $occurs_by = ''; } elseif ('monthly' == $schedule) { $schedule_meta = $raw_data['schedule_meta']; $occurs_by = trim($schedule_meta, '='); } else { $schedule_meta = ''; $occurs_by = ''; } //Collect include/exclude $in_ex = array(); $orig_schedule = eo_get_event_schedule($post_id); foreach (array('include', 'exclude') as $key) { $in_ex[$key] = array(); $arr = explode(',', sanitize_text_field($raw_data[$key])); if (!empty($arr)) { foreach ($arr as $date) { if ($date_obj = eo_check_datetime('Y-m-d', trim($date))) { $date_obj->setTime($start->format('H'), $start->format('i')); $in_ex[$key][] = $date_obj; } } /* see https://github.com/stephenharris/Event-Organiser/issues/260 if( $orig = array_uintersect( $orig_schedule[$key], $in_ex[$key], '_eventorganiser_compare_dates' ) ){ $in_ex[$key] = array_merge( $orig, $in_ex[$key] ); $in_ex[$key] = _eventorganiser_remove_duplicates( $in_ex[$key] ); }*/ } } $event_data = array('start' => $start, 'end' => $end, 'all_day' => $all_day, 'schedule' => $schedule, 'frequency' => (int) $raw_data['event_frequency'], 'until' => $until, 'schedule_meta' => $schedule_meta, 'occurs_by' => $occurs_by, 'include' => $in_ex['include'], 'exclude' => $in_ex['exclude']); $response = eo_update_event($post_id, $event_data); if (is_wp_error($response)) { global $EO_Errors; $code = $response->get_error_code(); $message = $response->get_error_message($code); $errors[$post_id][] = __('Event dates were not saved.', 'eventorganiser'); $errors[$post_id][] = $message; $EO_Errors->add('eo_error', $message); update_option('eo_notice', $errors); } return; }
/** * Returns the supplied array with the additional data parsed from the given property-value pair * May require the blog and/or calendar time-zone in date manipulations * May also require modifiers in date manipulations (e.g. TZID, VALUE) * * @since 1.1.0 * * @param array $event_array - array of event details to be added to * @param string $property - the property being parsed * @param string $value - the value of the property being parsed * @param string $modifiers - array of modifiers associated with the property * @param DateTimeZone $blog_tz - blog's timezone * @param DateTimeZone $cal_tzid - calendar's default timezone * @return DateTimeZone - the timezone with the given identifier or false if it isn't recognised */ function parse_Event_Property($event_array, $property, $value, $modifiers, $blog_tz, $cal_tz) { extract($event_array); $import_venues = isset($_POST['eo_import_venue']) ? true : false; $import_cats = isset($_POST['eo_import_cat']) ? true : false; $date_tz = ""; if (!empty($modifiers)) { foreach ($modifiers as $modifier) { if (stristr($modifier, 'TZID')) { $date_tz = self::parse_TZID(substr($modifier, 5)); } elseif (stristr($modifier, 'VALUE')) { $meta = substr($modifier, 6); } } } //For dates - if there is not an associated timezone, use calendar default. if (empty($date_tz)) { $date_tz = $cal_tz; } switch ($property) { //Date properties case 'CREATED': case 'DTSTART': case 'DTEND': if (isset($meta) && $meta == 'DATE') { $date = $this->parse_icalDate($value, $blog_tz); $allday = 1; } else { $date = $this->parse_icalDateTime($value, $date_tz); $allday = 0; } if (empty($date)) { break; } switch ($property) { case 'DTSTART': $event['start'] = $date; $event['allday'] = $allday; break; case 'DTEND': if ($allday == 1) { $date->modify('-1 second'); } $event['end'] = $date; break; case 'CREATED': $date->setTimezone(new DateTImeZone('utc')); $event_post['post_date_gmt'] = $date->format('Y-m-d H:i:s'); break; } break; case 'EXDATE': //The modifiers have been dealt with above. We do similiar to above, except for an array of dates... $value_array = explode(',', $value); //Note, we only consider the Date part and ignore the time foreach ($value_array as $val) { $date = $this->parse_icalDate($val, $blog_tz); $event['exception_dates'][] = $date; } break; //Reoccurrence rule properties //Reoccurrence rule properties case 'RRULE': $event += $this->parse_RRule($value); break; //The event's summary (AKA post title) //The event's summary (AKA post title) case 'SUMMARY': $event_post['post_title'] = $this->parse_icalText($value); break; //The event's description (AKA post content) //The event's description (AKA post content) case 'DESCRIPTION': $event_post['post_content'] = $this->parse_icalText($value); break; //Event venues, assign to existing venue - or if set, create new one //Event venues, assign to existing venue - or if set, create new one case 'LOCATION': $venue_ids = array(); if (!empty($value)) { $venue_name = trim($value); $venue = get_term_by('name', $venue_name, 'event-venue'); if ($venue) { $venue_ids[] = (int) $venue->term_id; } elseif ($import_venues) { //Create new venue, get ID. Count of venues created++ global $eventorganiser_venues_created; $return = eo_insert_venue($venue_name); if (!is_wp_error($return) && !$return) { $venue_ids[] = (int) $return['term_id']; $eventorganiser_venues_created++; $event['venue'] = $return['term_id']; //XXX This is depreciated } } $venue_ids = array_filter($venue_ids); if (!empty($venue_ids)) { $event_post['tax_input']['event-venue'] = $venue_ids; } } break; //Event categories, assign to existing categories - or if set, create new ones //Event categories, assign to existing categories - or if set, create new ones case 'CATEGORIES': $cats = explode(',', $value); $cat_ids = array(); if (!empty($cats)) { foreach ($cats as $cat_name) { $cat_name = trim($cat_name); $cat = get_term_by('name', $cat_name, 'event-category'); if ($cat) { $cat_ids[] = (int) $cat->term_id; } elseif ($import_cats) { //Create new category, get ID. Count of cats created++ global $eventorganiser_cats_created; $return = wp_insert_term($cat_name, 'event-category', array()); if (!is_wp_error($return)) { $cat_ids[] = (int) $return['term_id']; $eventorganiser_cats_created++; } } } $cat_ids = array_filter($cat_ids); if (!empty($cat_ids)) { $event_post['tax_input']['event-category'] = $cat_ids; } } break; //The event's status //The event's status case 'STATUS': switch ($value) { case 'CONFIRMED': $event_post['post_status'] = 'publish'; break; case 'CANCELLED': $event_post['post_status'] = 'trash'; break; default: $event_post['post_status'] = 'draft'; } break; //An url associated with the event //An url associated with the event case 'URL': $event_meta['eo_url'] = $value; break; } $event_array = array('event' => $event, 'event_post' => $event_post, 'event_meta' => $event_meta); return $event_array; }
/** * Create an EO venue given a CiviEvent location * * @since 0.1 * * @param array $location The CiviEvent location data * @return int $term_id The numeric ID of the venue */ public function create_venue($location) { // check permissions if (!$this->allow_venue_edit()) { return false; } /** * Event Organiser will return a WP_Error object if there is already a * venue with the same name as the one being created. So, during the * sync process, it is possible that poorly-named (or partially-named) * locations will trigger this. For now, log the this and carry on. */ if (empty($location['address']['street_address'])) { // log and move on error_log(print_r(array('method' => __METHOD__, 'message' => __('Street Address is empty.', 'civicrm-event-organiser'), 'location' => $location), true)); } // construct name $name = !empty($location['address']['street_address']) ? $location['address']['street_address'] : 'Untitled venue'; // construct args $args = array(); // add street address if present if (isset($location['address']['street_address']) and !empty($location['address']['street_address'])) { $args['address'] = $location['address']['street_address']; } // add city if present if (isset($location['address']['city']) and !empty($location['address']['city'])) { $args['city'] = $location['address']['city']; } // add postcode if present if (isset($location['address']['postal_code']) and !empty($location['address']['postal_code'])) { $args['postcode'] = $location['address']['postal_code']; } // add geocodes if present if (isset($location['address']['geo_code_1']) and !empty($location['address']['geo_code_1'])) { $args['latitude'] = $location['address']['geo_code_1']; } if (isset($location['address']['geo_code_2']) and !empty($location['address']['geo_code_2'])) { $args['longtitude'] = $location['address']['geo_code_2']; } // remove actions to prevent recursion remove_action('eventorganiser_insert_venue', array($this, 'insert_venue'), 10); remove_action('eventorganiser_save_venue', array($this, 'save_venue'), 10); // retrieve venue with slug-to-be-used $existing_venue = eo_get_venue_by('slug', sanitize_title($name)); /** * Check if there an existing venue with the slug about to be used. Also * allow overrides to force the creation of a unique slug. * * Force the use of a unique slug with the following code: * add_filter( 'civicrm_event_organiser_force_unique_slug', '__return_true' ); * * @param bool False by default, which does not force unique slugs */ if ($existing_venue or apply_filters('civicrm_event_organiser_force_unique_slug', false)) { // create a slug we know will be unique $args['slug'] = sanitize_title($name . '-' . $location['id']); } // insert venue $result = eo_insert_venue($name, $args); // add actions again add_action('eventorganiser_insert_venue', array($this, 'insert_venue'), 10, 1); add_action('eventorganiser_save_venue', array($this, 'save_venue'), 10, 1); // if not an error if (is_wp_error($result) or !isset($result['term_id'])) { // log error_log(print_r(array('method' => __METHOD__, 'message' => __('Venue not created.', 'civicrm-event-organiser'), 'result' => $result, 'location' => $location), true)); return; } // create venue meta data // do we have an email for the location? if (isset($location['email']['email']) and !empty($location['email']['email'])) { // yes, get it $email = $location['email']['email']; // store email in meta eo_update_venue_meta($result['term_id'], '_civi_email', esc_sql($email)); } // do we have a phone number for the location? if (isset($location['phone']['phone']) and !empty($location['phone']['phone'])) { // store phone in meta eo_update_venue_meta($result['term_id'], '_civi_phone', esc_sql($location['phone']['phone'])); } // store location ID eo_update_venue_meta($result['term_id'], '_civi_loc_id', $location['id']); /* error_log( print_r( array( 'method' => __METHOD__, 'location' => $location, 'name' => $name, 'args' => $args, 'result' => $result, ), true ) ); */ // --< return $result['term_id']; }
/** * Saves the event data posted from the event metabox. * Hooked to the 'save_post' action * * @since 1.0.0 * * @param int $post_id the event post ID * @return int $post_id the event post ID */ function eventorganiser_details_save($post_id) { //make sure data came from our meta box if (!isset($_POST['_eononce']) || !wp_verify_nonce($_POST['_eononce'], 'eventorganiser_event_update_' . $post_id)) { return; } // verify this is not an auto save routine. if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } //authentication checks if (!current_user_can('edit_event', $post_id)) { return; } //Collect raw data $raw_data = isset($_POST['eo_input']) ? $_POST['eo_input'] : array(); $raw_data = wp_parse_args($raw_data, array('StartDate' => '', 'EndDate' => '', 'StartTime' => '00:00', 'FinishTime' => '23:59', 'schedule' => 'once', 'event_frequency' => 1, 'schedule_end' => '', 'allday' => 0, 'schedule_meta' => '', 'days' => array(), 'include' => '', 'exclude' => '')); //Update venue $venue_id = !empty($raw_data['event-venue']) ? intval($raw_data['event-venue']) : null; //Maybe create a new venue if (empty($venue_id) && !empty($_POST['eo_venue']) && current_user_can('manage_venues')) { $venue = $_POST['eo_venue']; if (!empty($venue['name'])) { $new_venue = eo_insert_venue($venue['name'], $venue); if (!is_wp_error($new_venue)) { $venue_id = $new_venue['term_id']; } } } //Set venue $r = wp_set_post_terms($post_id, array($venue_id), 'event-venue', false); //If reocurring, but not editing occurrences, can abort here, but trigger hook. if (eo_reoccurs($post_id) && (!isset($raw_data['AlterRe']) || 'yes' != $raw_data['AlterRe'])) { do_action('eventorganiser_save_event', $post_id); //Need this to update cache return; } //Set times for all day events $all_day = intval($raw_data['allday']); if ($all_day) { $raw_data['StartTime'] = '00:00'; $raw_data['FinishTime'] = '23:59'; } elseif (!eventorganiser_blog_is_24()) { //Potentially need to parse 24 //TODO incorproate into _eventorganiser_check_datetime $raw_data['StartTime'] = date("H:i", strtotime($raw_data['StartTime'])); $raw_data['FinishTime'] = date("H:i", strtotime($raw_data['FinishTime'])); } //Check dates $start = _eventorganiser_check_datetime(trim($raw_data['StartDate']) . ' ' . trim($raw_data['StartTime'])); $end = _eventorganiser_check_datetime(trim($raw_data['EndDate']) . ' ' . trim($raw_data['FinishTime'])); $schedule_last = _eventorganiser_check_datetime(trim($raw_data['schedule_end']) . ' ' . trim($raw_data['StartTime'])); //Collect schedule meta $schedule = $raw_data['schedule']; if ('weekly' == $schedule) { $schedule_meta = $raw_data['days']; $occurs_by = ''; } elseif ('monthly' == $schedule) { $schedule_meta = $raw_data['schedule_meta']; $occurs_by = trim($schedule_meta, '='); } else { $schedule_meta = ''; $occurs_by = ''; } //Collect include/exclude $in_ex = array(); foreach (array('include', 'exclude') as $key) { $in_ex[$key] = array(); $arr = explode(',', sanitize_text_field($raw_data[$key])); if (!empty($arr)) { foreach ($arr as $date) { $date_obj = _eventorganiser_check_datetime($date . ' ' . $raw_data['StartTime'], 'Y-m-d'); if ($date_obj) { $in_ex[$key][] = $date_obj; } } } } $event_data = array('start' => $start, 'end' => $end, 'all_day' => $all_day, 'schedule' => $schedule, 'frequency' => (int) $raw_data['event_frequency'], 'schedule_last' => $schedule_last, 'schedule_meta' => $schedule_meta, 'occurs_by' => $occurs_by, 'include' => $in_ex['include'], 'exclude' => $in_ex['exclude']); $response = eo_update_event($post_id, $event_data); if (is_wp_error($response)) { global $EO_Errors; $code = $response->get_error_code(); $message = $response->get_error_message($code); $errors[$post_id][] = __('Event dates were not saved.', 'eventorganiser'); $errors[$post_id][] = $message; $EO_Errors->add('eo_error', $message); update_option('eo_notice', $errors); } return; }
/** * Reads in an ICAL file into an array, then parses the array and inserts events into database * @since 1.1.0 * @param string $cal_file - the file to import */ function import_file($ical_file) { global $EO_Errors; if (!current_user_can('manage_options') || !current_user_can('edit_events')) { wp_die(__('You do not have sufficient permissions to import events.', 'eventorganiser')); } $ical = new EO_ICAL_Parser(); $ical->parse($ical_file); $import_venues = isset($_POST['eo_import_venue']) ? true : false; $import_cats = isset($_POST['eo_import_cat']) ? true : false; $events_imported = 0; $events_updated = 0; $venues_imported = 0; $categories_imported = 0; if ($import_venues && $ical->venues) { foreach ($ical->venues as $venue) { if (!eo_get_venue_by('name', $venue)) { $args = array(); //If lat/lng meta data is set, include that if (isset($ical->venue_meta[$venue]['latitude']) && isset($ical->venue_meta[$venue]['longtitude'])) { $args['latitude'] = $ical->venue_meta[$venue]['latitude']; $args['longtitude'] = $ical->venue_meta[$venue]['longtitude']; } $new_venue = eo_insert_venue($venue, $args); if (!is_wp_error($new_venue) && $new_venue) { $venues_imported++; } } } } if ($import_cats && $ical->categories) { foreach ($ical->categories as $category) { if (!get_term_by('name', $category, 'event-category')) { $new_cat = wp_insert_term($category, 'event-category', array()); if (!is_wp_error($new_cat) && $new_cat) { $categories_imported++; } } } } foreach ($ical->events as $event) { //TODO refactor eo_insert_event & eo_update_event... $uid = !empty($event['uid']) ? $event['uid'] : false; //TODO Check if event already exists //$found_event = eo_get_event_by_uid( $uid ); //Create event if (!empty($event['event-venue'])) { $venue = eo_get_venue_by('name', $event['event-venue']); if ($venue) { $event['tax_input']['event-venue'][] = intval($venue->term_id); } } if (!empty($event['event-category'])) { $event['tax_input']['event-category'] = array(); foreach ($event['event-category'] as $category) { $cat = get_term_by('name', $category, 'event-category'); if ($cat) { $event['tax_input']['event-category'][] = intval($cat->term_id); } } } $event_id = eo_insert_event($event); if (is_wp_error($event_id)) { $ical->errors[] = $event_id; } else { $events_updated++; } } if ($events_updated == 0) { $EO_Errors->add('eo_error', __("No events were imported.", 'eventorganiser')); } if (count($ical->errors) > 0) { foreach ($ical->errors as $error) { $codes = $error->get_error_codes(); foreach ($codes as $code) { $error_messages = $error->get_error_messages(); foreach ($error_messages as $error_message) { $EO_Errors->add('eo_error', '<strong>' . __('Error:', 'eventorganiser') . '</strong> ' . $error_message); } } } } $message = array(); if ($ical->warnings) { foreach ($ical->warnings as $warning) { $message[] = '<strong>' . __('Warning:', 'eventorganiser') . '</strong> ' . $warning->get_error_message(); } } if (count($ical->events) == 1) { $message[] = __("1 event was successfully imported", 'eventorganiser'); } elseif (count($ical->events) > 1) { $message[] = sprintf(__("%d events were successfully imported", 'eventorganiser'), count($ical->events)) . "."; } if ($venues_imported == 1) { $message[] = __("1 venue was created", 'eventorganiser'); } elseif ($venues_imported > 1) { $message[] = sprintf(__("%d venues were created", 'eventorganiser'), $venues_imported); } if ($categories_imported == 1) { $message[] = __("1 category was created", 'eventorganiser'); } elseif ($categories_imported > 1) { $message[] = sprintf(__("%d categories were created", 'eventorganiser'), $categories_imported); } $EO_Errors->add('eo_notice', implode('<br/>', $message)); }
function page_actions() { global $EO_Errors; //Determine action if any $action = $this->current_action(); $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false; if ($action && $venue || $action == 'add') { if (!current_user_can('manage_venues')) { wp_die(__("You do not have permission to manage venues", 'eventorganiser')); } switch ($action) { case 'update': if (!check_admin_referer('eventorganiser_update_venue_' . $venue)) { wp_die(__("You do not have permission to edit this venue.", 'eventorganiser')); } $venue = get_term_by('slug', esc_attr($venue), 'event-venue'); $return = eo_update_venue($venue->term_id, $_POST['eo_venue']); if (is_wp_error($return)) { $EO_Errors->add('eo_error', __("Venue <strong>was not</strong> updated", 'eventorganiser') . ": " . $return->get_error_message()); } else { $term_id = (int) $return['term_id']; $venue = get_term($term_id, 'event-venue'); $_REQUEST['event-venue'] = $venue->slug; $EO_Errors->add('eo_notice', __("Venue <strong>updated</strong>", 'eventorganiser')); } $_REQUEST['action'] = 'edit'; break; case 'add': if (!check_admin_referer('eventorganiser_add_venue')) { wp_die(__("You do not have permission to edit this venue.", 'eventorganiser')); } $args = $_POST['eo_venue']; $name = isset($args['name']) ? $args['name'] : ''; $return = eo_insert_venue($name, $args); if (is_wp_error($return)) { $EO_Errors->add('eo_error', __("Venue <strong>was not</strong> created", 'eventorganiser') . ": " . $return->get_error_message()); $_REQUEST['action'] = 'create'; } else { $EO_Errors->add('eo_notice', __("Venue <strong>created</strong>", 'eventorganiser')); $term_id = (int) $return['term_id']; $venue = get_term($term_id, 'event-venue'); $_REQUEST['action'] = 'edit'; $_REQUEST['event-venue'] = $venue->slug; } break; case 'delete': if (is_array($_REQUEST['event-venue'])) { $nonce = 'bulk-venues'; } else { $nonce = 'eventorganiser_delete_venue_' . $venue; } if (!check_admin_referer($nonce)) { wp_die(__("You do not have permission to delete this venue", 'eventorganiser')); } $venues = (array) $venue; //Count the number of deleted venues $deleted = 0; foreach ($venues as $venue) { $venue = get_term_by('slug', esc_attr($venue), 'event-venue'); $resp = eo_delete_venue($venue->term_id); if (!is_wp_error($resp) && true === $resp) { $deleted++; } } if ($deleted > 0) { $EO_Errors = new WP_Error('eo_notice', __("Venue(s) <strong>deleted</strong>", 'eventorganiser')); } else { $EO_Errors = new WP_Error('eo_error', __("Venue(s) <strong>were not </strong> deleted", 'eventorganiser')); } break; } } $action = $this->current_action(); if (in_array($action, array('edit', 'update', 'create'))) { $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false; //Venued edit page add_meta_box('submitdiv', __('Save', 'eventorganiser'), 'eventorganiser_venue_submit', 'event_page_venues', 'side', 'high'); do_action('add_meta_boxes_event_page_venues', $venue); do_action('add_meta_boxes', 'event_page_venues', $venue); } else { //Venue admin list require_once "classes/class-eo-venue-list-table.php"; add_filter('manage_event_page_venues_columns', 'eventorganiser_venue_admin_columns'); add_screen_option('per_page', array('option' => 'edit_event_venue_per_page', 'label' => __('Venues', 'eventorganiser'), 'default' => 20)); } }