function eme_update_events_for_recurrence($event, $recurrence) { global $wpdb, $eme_timezone; $events_table = $wpdb->prefix . EVENTS_TBNAME; $matching_days = eme_get_recurrence_days($recurrence); //print_r($matching_days); sort($matching_days); $eme_date_obj1 = new ExpressiveDate($event['event_start_date'] . " " . $event['event_start_time'], $eme_timezone); if ($event['event_end_date'] == '') { $duration_days_event = 0; } else { $eme_date_obj2 = new ExpressiveDate($event['event_end_date'] . " " . $event['event_end_time'], $eme_timezone); $duration_days_event = abs($eme_date_obj2->getDifferenceInDays($eme_date_obj1)); } // 2 steps for updating events for a recurrence: // First step: check the existing events and if they still match the recurrence days, update them // otherwise delete the old event // Reason for doing this: we want to keep possible booking data for a recurrent event as well // and just deleting all current events for a recurrence and inserting new ones would break the link // between booking id and event id // Second step: check all days of the recurrence and if no event exists yet, insert it $sql = $wpdb->prepare("SELECT * FROM {$events_table} WHERE recurrence_id = %d", $recurrence['recurrence_id']); $events = $wpdb->get_results($sql, ARRAY_A); $eme_date_obj = new ExpressiveDate(null, $eme_timezone); // Doing step 1 foreach ($events as $existing_event) { $update_done = 0; foreach ($matching_days as $day) { $eme_date_obj->setTimestamp($day); $event_start_date = $eme_date_obj->getDate(); if (!$update_done && $existing_event['event_start_date'] == $event_start_date) { $event['event_start_date'] = $existing_event['event_start_date']; $eme_date_obj->addDays($duration_days_event); $event['event_end_date'] = $eme_date_obj->getDate(); eme_db_update_event($event, $existing_event['event_id'], 1); $update_done = 1; continue; } } if (!$update_done) { eme_db_delete_event($existing_event, 1); } } // Doing step 2 foreach ($matching_days as $day) { $insert_needed = 1; $eme_date_obj->setTimestamp($day); $event['event_start_date'] = $eme_date_obj->getDate(); $eme_date_obj->addDays($duration_days_event); $event['event_end_date'] = $eme_date_obj->getDate(); foreach ($events as $existing_event) { if ($insert_needed && $existing_event['event_start_date'] == $event['event_start_date']) { $insert_needed = 0; } } if ($insert_needed == 1) { eme_db_insert_event($event, 1); } } return 1; }