/**
  * Save metaboxes
  */
 public function save_post($post_id)
 {
     if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
         return;
     }
     if (!isset($_POST['pronamic_events_nonce_details'])) {
         return;
     }
     if (!wp_verify_nonce($_POST['pronamic_events_nonce_details'], 'pronamic_events_edit_details')) {
         return;
     }
     if (!current_user_can('edit_post', $post_id)) {
         return;
     }
     // Define timestamps
     $start_date = filter_input(INPUT_POST, 'pronamic_start_date', FILTER_SANITIZE_STRING);
     $start_time = filter_input(INPUT_POST, 'pronamic_start_time', FILTER_SANITIZE_STRING);
     $end_date = filter_input(INPUT_POST, 'pronamic_end_date', FILTER_SANITIZE_STRING);
     $end_time = filter_input(INPUT_POST, 'pronamic_end_time', FILTER_SANITIZE_STRING);
     $location = filter_input(INPUT_POST, 'pronamic_location', FILTER_SANITIZE_STRING);
     $url = filter_input(INPUT_POST, 'pronamic_event_url', FILTER_SANITIZE_STRING);
     $end_date = empty($end_date) ? $start_date : $end_date;
     $end_time = empty($end_time) ? $start_time : $end_time;
     $start_timestamp = strtotime($start_date . ' ' . $start_time);
     $end_timestamp = strtotime($end_date . ' ' . $end_time);
     $meta = array('_pronamic_location' => $location, '_pronamic_event_url' => $url);
     $meta = pronamic_events_get_start_date_meta($start_timestamp, $meta);
     $meta = pronamic_events_get_end_date_meta($end_timestamp, $meta);
     // Save meta data
     foreach ($meta as $key => $value) {
         update_post_meta($post_id, $key, $value);
     }
     // Status update
     $this->plugin->event_status_update($post_id);
     wp_clear_scheduled_hook('pronamic_event_status_update', array($post_id));
     wp_schedule_single_event($end_timestamp, 'pronamic_event_status_update', array($post_id));
 }
 /**
  * Save repeats
  *
  * @param string $post_id
  */
 public function save_repeats($post_id)
 {
     // Create repeated posts
     $post = get_post($post_id);
     $event = new Pronamic_WP_Event($post);
     $repeat_helper = new Pronamic_Events_RepeatEventHelper($event);
     $repeat_events = $repeat_helper->get_repeat_events();
     $data = new ArrayIterator($repeat_helper->get_period_data());
     $data = new LimitIterator($data, 0, Pronamic_Events_RepeatModule::MAX_REPEATS);
     if ($repeat_helper->is_repeat_enabled() && $data) {
         // Remove filters
         remove_filter('save_post', array($this->plugin->admin, 'save_post'));
         remove_filter('save_post', array($this, 'save_post'));
         remove_filter('save_post', array($this, 'save_repeats'));
         foreach ($data as $e) {
             $hash_code = $e->get_event_hash_code();
             $post_data = array('post_title' => $post->post_title, 'post_content' => $post->post_content, 'post_author' => $post->post_author, 'post_parent' => $post->ID, 'post_status' => $post->post_status, 'post_type' => $post->post_type);
             if (isset($repeat_events[$hash_code])) {
             } else {
                 $repeat_post_id = wp_insert_post($post_data);
                 $start_timestamp = $e->get_start()->format('U');
                 $end_timestamp = $e->get_end()->format('U');
                 $meta = array();
                 $meta = pronamic_events_get_start_date_meta($start_timestamp, $meta);
                 $meta = pronamic_events_get_end_date_meta($end_timestamp, $meta);
                 // Save meta data
                 foreach ($meta as $key => $value) {
                     update_post_meta($repeat_post_id, $key, $value);
                 }
             }
         }
         /*
          * Sync posts
          */
         // Post
         $post_data = array('post_title' => $post->post_title, 'post_content' => $post->post_content, 'post_author' => $post->post_author, 'post_parent' => $post->ID, 'post_status' => $post->post_status, 'post_type' => $post->post_type);
         // Meta
         $ignore = array_flip(array('_edit_last', '_pronamic_start_date', '_pronamic_event_start_date', '_pronamic_event_start_date_gmt', '_pronamic_end_date', '_pronamic_event_end_date', '_pronamic_event_end_date_gmt', '_pronamic_event_repeat', '_pronamic_event_repeat_frequency', '_pronamic_event_repeat_interval', '_pronamic_event_ends_on', '_pronamic_event_ends_on_count', '_pronamic_event_ends_on_until', '_edit_lock'));
         $post_custom = get_post_custom($post->ID);
         $post_custom = array_diff_key($post_custom, $ignore);
         // Taxonomies
         $taxonomies = array();
         $taxonomy_names = get_object_taxonomies($post);
         foreach ($taxonomy_names as $taxonomy) {
             $terms = wp_get_object_terms($post->ID, $taxonomy, array('fields' => 'ids'));
             $taxonomies[$taxonomy] = $terms;
         }
         // Posts
         $args = $repeat_helper->get_repeat_posts_query_args(array('fields' => 'ids'));
         $post_ids = get_posts($args);
         foreach ($post_ids as $post_id) {
             // Post
             $post_data['ID'] = $post_id;
             wp_update_post($post_data);
             // Meta
             foreach ($post_custom as $meta_key => $meta_values) {
                 delete_post_meta($post_id, $meta_key);
                 foreach ($meta_values as $meta_value) {
                     add_post_meta($post_id, $meta_key, $meta_value);
                 }
             }
             // Taxonomies
             foreach ($taxonomies as $taxonomy => $terms) {
                 wp_set_object_terms($post_id, $terms, $taxonomy);
             }
         }
         // Add filters
         add_filter('save_post', array($this->plugin->admin, 'save_post'));
         add_filter('save_post', array($this, 'save_post'));
         add_filter('save_post', array($this, 'save_repeats'));
     }
 }
/**
 * Gravity Forms post data
 *
 * @param array $post_data
 * @param array $form
 * @param array $lead
 */
function pronamic_events_gform_post_data($post_data, $form, $lead)
{
    $start_date = $end_date = null;
    // Init
    $start_date = array();
    $start_time = array();
    $end_date = array();
    $end_time = array();
    // Form fields
    foreach ($form['fields'] as $field) {
        if (isset($field['isEventStartDate'])) {
            $has_start_date = filter_var($field['isEventStartDate'], FILTER_VALIDATE_BOOLEAN);
            if ($has_start_date) {
                $start_date = pronamic_events_gform_parse_date($lead[$field['id']], $field['dateFormat']);
            }
        }
        if (isset($field['isEventStartTime'])) {
            $has_start_time = filter_var($field['isEventStartTime'], FILTER_VALIDATE_BOOLEAN);
            if ($has_start_time) {
                $start_time = pronamic_events_gform_parse_time($lead[$field['id']]);
            }
        }
        if (isset($field['isEventEndDate'])) {
            $has_end_date = filter_var($field['isEventEndDate'], FILTER_VALIDATE_BOOLEAN);
            if ($has_end_date) {
                $end_date = pronamic_events_gform_parse_date($lead[$field['id']], $field['dateFormat']);
            }
        }
        if (isset($field['isEventEndTime'])) {
            $has_end_time = filter_var($field['isEventEndTime'], FILTER_VALIDATE_BOOLEAN);
            if ($has_end_time) {
                $end_time = pronamic_events_gform_parse_time($lead[$field['id']]);
            }
        }
    }
    // Mapping
    if (!isset($post_data['post_custom_fields'])) {
        $post_data['post_custom_fields'] = array();
    }
    $fields =& $post_data['post_custom_fields'];
    // Backwards compatibility
    if (true) {
        // Start date
        if (isset($fields['_pronamic_start_date_date'])) {
            $start_date = $fields['_pronamic_start_date_date'];
            if (isset($fields['_pronamic_start_date_time'])) {
                $start_date .= ' ' . $fields['_pronamic_start_date_time'];
            }
            $start_timestamp = strtotime($start_date);
            if (false !== $start_timestamp) {
                $fields['_pronamic_start_date'] = $start_timestamp;
            }
        }
        // End date
        if (isset($fields['_pronamic_end_date_date'])) {
            $end_date = $fields['_pronamic_end_date_date'];
            if (isset($fields['_pronamic_end_date_time'])) {
                $end_date .= ' ' . $fields['_pronamic_end_date_time'];
            }
            $end_timestamp = strtotime($end_date);
            if (false !== $end_timestamp) {
                $fields['_pronamic_end_date'] = $end_timestamp;
            }
        }
    }
    // Merge start and end dates togehter, magic!
    $start = array_merge($end_date, $end_time, $start_date, $start_time);
    $end = array_merge($start_date, $start_time, $end_date, $end_time);
    if (!empty($start) && !empty($end)) {
        // Merge missing date info with today's date info
        $today = date_parse('today');
        $start = array_merge($today, $start);
        $end = array_merge($today, $end);
        $timestamp = mktime($start['hour'], $start['minute'], $start['second'], $start['month'], $start['day'], $start['year']);
        $fields = pronamic_events_get_start_date_meta($timestamp, $fields);
        $timestamp = mktime($end['hour'], $end['minute'], $end['second'], $end['month'], $end['day'], $end['year']);
        $fields = pronamic_events_get_end_date_meta($timestamp, $fields);
    }
    return $post_data;
}