addDays() public method

Add a given amount of days.
public addDays ( integer $amount ) : ExpressiveDate
$amount integer
return ExpressiveDate
function eme_create_events_table($charset, $collate)
{
    global $wpdb, $eme_timezone;
    $db_version = get_option('eme_version');
    $table_name = $wpdb->prefix . EVENTS_TBNAME;
    if ($wpdb->get_var("SHOW TABLES LIKE '{$table_name}'") != $table_name) {
        // Creating the events table
        $sql = "CREATE TABLE " . $table_name . " (\n         event_id mediumint(9) NOT NULL AUTO_INCREMENT,\n         event_status mediumint(9) DEFAULT 1,\n         event_author mediumint(9) DEFAULT 0,\n         event_name text NOT NULL,\n         event_slug text default NULL,\n         event_url text default NULL,\n         event_start_time time NOT NULL,\n         event_end_time time NOT NULL,\n         event_start_date date NOT NULL,\n         event_end_date date NULL, \n         creation_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00', \n         creation_date_gmt datetime NOT NULL DEFAULT '0000-00-00 00:00:00', \n         modif_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00', \n         modif_date_gmt datetime NOT NULL DEFAULT '0000-00-00 00:00:00', \n         event_notes longtext DEFAULT NULL,\n         event_rsvp bool DEFAULT 0,\n         use_paypal bool DEFAULT 0,\n         use_2co bool DEFAULT 0,\n         use_webmoney bool DEFAULT 0,\n         use_fdgg bool DEFAULT 0,\n         use_mollie bool DEFAULT 0,\n         use_sagepay bool DEFAULT 0,\n         price text DEFAULT NULL,\n         currency text DEFAULT NULL,\n         rsvp_number_days tinyint unsigned DEFAULT 0,\n         rsvp_number_hours tinyint unsigned DEFAULT 0,\n         event_seats text DEFAULT NULL,\n         event_contactperson_id mediumint(9) DEFAULT 0,\n         location_id mediumint(9) DEFAULT 0,\n         recurrence_id mediumint(9) DEFAULT 0,\n         event_category_ids text default NULL,\n         event_attributes text NULL, \n         event_properties text NULL, \n         event_page_title_format text NULL, \n         event_single_event_format text NULL, \n         event_contactperson_email_body text NULL, \n         event_respondent_email_body text NULL, \n         event_registration_recorded_ok_html text NULL, \n         event_registration_pending_email_body text NULL, \n         event_registration_updated_email_body text NULL, \n         event_registration_cancelled_email_body text NULL, \n         event_registration_denied_email_body text NULL, \n         event_registration_form_format text NULL, \n         event_cancel_form_format text NULL, \n         registration_requires_approval bool DEFAULT 0,\n         registration_wp_users_only bool DEFAULT 0,\n         event_image_url text NULL,\n         event_image_id mediumint(9) DEFAULT 0 NOT NULL,\n         event_external_ref text NULL, \n         UNIQUE KEY (event_id)\n         ) {$charset} {$collate};";
        maybe_create_table($table_name, $sql);
        // insert a few events in the new table
        // get the current timestamp into an array
        $eme_date_obj = new ExpressiveDate(null, $eme_timezone);
        $eme_date_obj->addDays(7);
        $in_one_week = $eme_date_obj->getDate();
        $eme_date_obj->minusDays(7);
        $eme_date_obj->addWeeks(4);
        $in_four_weeks = $eme_date_obj->getDate();
        $eme_date_obj->minusWeeks(4);
        $eme_date_obj->addOneYear();
        $in_one_year = $eme_date_obj->getDate();
        $wpdb->query("INSERT INTO " . $table_name . " (event_name, event_start_date, event_start_time, event_end_time, location_id)\n            VALUES ('Orality in James Joyce Conference', '{$in_one_week}', '16:00:00', '18:00:00', 1)");
        $wpdb->query("INSERT INTO " . $table_name . " (event_name, event_start_date, event_start_time, event_end_time, location_id)\n            VALUES ('Traditional music session', '{$in_four_weeks}', '20:00:00', '22:00:00', 2)");
        $wpdb->query("INSERT INTO " . $table_name . " (event_name, event_start_date, event_start_time, event_end_time, location_id)\n               VALUES ('6 Nations, Italy VS Ireland', '{$in_one_year}','22:00:00', '24:00:00', 3)");
    } else {
        // eventual maybe_add_column() for later versions
        maybe_add_column($table_name, 'event_status', "alter table {$table_name} add event_status mediumint(9) DEFAULT 1;");
        maybe_add_column($table_name, 'event_start_date', "alter table {$table_name} add event_start_date date NOT NULL;");
        maybe_add_column($table_name, 'event_end_date', "alter table {$table_name} add event_end_date date NULL;");
        maybe_add_column($table_name, 'event_start_time', "alter table {$table_name} add event_start_time time NOT NULL;");
        maybe_add_column($table_name, 'event_end_time', "alter table {$table_name} add event_end_time time NOT NULL;");
        maybe_add_column($table_name, 'event_rsvp', "alter table {$table_name} add event_rsvp bool DEFAULT 0;");
        maybe_add_column($table_name, 'use_paypal', "alter table {$table_name} add use_paypal bool DEFAULT 0;");
        maybe_add_column($table_name, 'use_2co', "alter table {$table_name} add use_2co bool DEFAULT 0;");
        maybe_add_column($table_name, 'use_webmoney', "alter table {$table_name} add use_webmoney bool DEFAULT 0;");
        maybe_add_column($table_name, 'use_fdgg', "alter table {$table_name} add use_fdgg bool DEFAULT 0;");
        maybe_add_column($table_name, 'use_mollie', "alter table {$table_name} add use_mollie bool DEFAULT 0;");
        maybe_add_column($table_name, 'use_sagepay', "alter table {$table_name} add use_sagepay bool DEFAULT 0;");
        maybe_add_column($table_name, 'rsvp_number_days', "alter table {$table_name} add rsvp_number_days tinyint DEFAULT 0;");
        maybe_add_column($table_name, 'rsvp_number_hours', "alter table {$table_name} add rsvp_number_hours tinyint DEFAULT 0;");
        maybe_add_column($table_name, 'price', "alter table {$table_name} add price text DEFAULT NULL;");
        maybe_add_column($table_name, 'currency', "alter table {$table_name} add currency text DEFAULT NULL;");
        maybe_add_column($table_name, 'event_seats', "alter table {$table_name} add event_seats text DEFAULT NULL;");
        maybe_add_column($table_name, 'location_id', "alter table {$table_name} add location_id mediumint(9) DEFAULT 0;");
        maybe_add_column($table_name, 'recurrence_id', "alter table {$table_name} add recurrence_id mediumint(9) DEFAULT 0;");
        maybe_add_column($table_name, 'event_contactperson_id', "alter table {$table_name} add event_contactperson_id mediumint(9) DEFAULT 0;");
        maybe_add_column($table_name, 'event_attributes', "alter table {$table_name} add event_attributes text NULL;");
        maybe_add_column($table_name, 'event_properties', "alter table {$table_name} add event_properties text NULL;");
        maybe_add_column($table_name, 'event_url', "alter table {$table_name} add event_url text DEFAULT NULL;");
        maybe_add_column($table_name, 'event_slug', "alter table {$table_name} add event_slug text DEFAULT NULL;");
        maybe_add_column($table_name, 'event_category_ids', "alter table {$table_name} add event_category_ids text DEFAULT NULL;");
        maybe_add_column($table_name, 'event_page_title_format', "alter table {$table_name} add event_page_title_format text NULL;");
        maybe_add_column($table_name, 'event_single_event_format', "alter table {$table_name} add event_single_event_format text NULL;");
        maybe_add_column($table_name, 'event_contactperson_email_body', "alter table {$table_name} add event_contactperson_email_body text NULL;");
        maybe_add_column($table_name, 'event_respondent_email_body', "alter table {$table_name} add event_respondent_email_body text NULL;");
        maybe_add_column($table_name, 'event_registration_pending_email_body', "alter table {$table_name} add event_registration_pending_email_body text NULL;");
        maybe_add_column($table_name, 'event_registration_updated_email_body', "alter table {$table_name} add event_registration_updated_email_body text NULL;");
        maybe_add_column($table_name, 'event_registration_cancelled_email_body', "alter table {$table_name} add event_registration_cancelled_email_body text NULL;");
        maybe_add_column($table_name, 'event_registration_denied_email_body', "alter table {$table_name} add event_registration_denied_email_body text NULL;");
        maybe_add_column($table_name, 'event_registration_recorded_ok_html', "alter table {$table_name} add event_registration_recorded_ok_html text NULL;");
        maybe_add_column($table_name, 'registration_requires_approval', "alter table {$table_name} add registration_requires_approval bool DEFAULT 0;");
        $registration_wp_users_only = get_option('eme_rsvp_registered_users_only');
        maybe_add_column($table_name, 'registration_wp_users_only', "alter table {$table_name} add registration_wp_users_only bool DEFAULT {$registration_wp_users_only};");
        maybe_add_column($table_name, 'event_author', "alter table {$table_name} add event_author mediumint(9) DEFAULT 0;");
        maybe_add_column($table_name, 'creation_date', "alter table {$table_name} add creation_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00';");
        maybe_add_column($table_name, 'creation_date_gmt', "alter table {$table_name} add creation_date_gmt datetime NOT NULL DEFAULT '0000-00-00 00:00:00';");
        maybe_add_column($table_name, 'modif_date', "alter table {$table_name} add modif_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00';");
        maybe_add_column($table_name, 'modif_date_gmt', "alter table {$table_name} add modif_date_gmt datetime NOT NULL DEFAULT '0000-00-00 00:00:00';");
        maybe_add_column($table_name, 'event_registration_form_format', "alter table {$table_name} add event_registration_form_format text NULL;");
        maybe_add_column($table_name, 'event_cancel_form_format', "alter table {$table_name} add event_cancel_form_format text NULL;");
        maybe_add_column($table_name, 'event_image_url', "alter table {$table_name} add event_image_url text NULL;");
        maybe_add_column($table_name, 'event_image_id', "alter table {$table_name} add event_image_id mediumint(9) DEFAULT 0 NOT NULL;");
        maybe_add_column($table_name, 'event_external_ref', "alter table {$table_name} add event_external_ref text NULL;");
        if ($db_version < 3) {
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_name text;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_notes longtext;");
        }
        if ($db_version < 4) {
            $wpdb->query("ALTER TABLE {$table_name} CHANGE event_category_id event_category_ids text default NULL;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_author mediumint(9) DEFAULT 0;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_contactperson_id mediumint(9) DEFAULT 0;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_seats mediumint(9) DEFAULT 0;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY location_id mediumint(9) DEFAULT 0;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY recurrence_id mediumint(9) DEFAULT 0;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_rsvp bool DEFAULT 0;");
        }
        if ($db_version < 5) {
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_rsvp bool DEFAULT 0;");
        }
        if ($db_version < 11) {
            $wpdb->query("ALTER TABLE {$table_name} DROP COLUMN event_author;");
            $wpdb->query("ALTER TABLE {$table_name} CHANGE event_creator_id event_author mediumint(9) DEFAULT 0;");
        }
        if ($db_version < 29) {
            $wpdb->query("ALTER TABLE {$table_name} MODIFY price text default NULL;");
        }
        if ($db_version < 33) {
            $post_table_name = $wpdb->prefix . "posts";
            $wpdb->query("UPDATE {$table_name} SET event_image_id = (select ID from {$post_table_name} where post_type = 'attachment' AND guid = {$table_name}.event_image_url);");
        }
        if ($db_version < 38) {
            $wpdb->query("ALTER TABLE {$table_name} MODIFY event_seats text default NULL;");
        }
        if ($db_version < 68) {
            $wpdb->query("ALTER TABLE {$table_name} MODIFY rsvp_number_days tinyint DEFAULT 0;");
            $wpdb->query("ALTER TABLE {$table_name} MODIFY rsvp_number_hours tinyint DEFAULT 0;");
        }
        if ($db_version < 70) {
            $wpdb->query("ALTER TABLE {$table_name} DROP COLUMN use_google;");
        }
    }
}
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;
}
Example #3
0
function eme_get_events($o_limit = 0, $scope = "future", $order = "ASC", $o_offset = 0, $location_id = "", $category = "", $author = "", $contact_person = "", $show_ongoing = 1, $notcategory = "", $show_recurrent_events_once = 0, $extra_conditions = "")
{
    global $wpdb, $eme_timezone;
    $events_table = $wpdb->prefix . EVENTS_TBNAME;
    $bookings_table = $wpdb->prefix . BOOKINGS_TBNAME;
    if (strpos($o_limit, "=")) {
        // allows the use of arguments
        $defaults = array('o_limit' => 0, 'scope' => 'future', 'order' => 'ASC', 'o_offset' => 0, 'location_id' => '', 'category' => '', 'author' => '', 'contact_person' => '', 'show_ongoing' => 1, 'notcategory' => '', 'show_recurrent_events_once' => 0, 'extra_conditions' => '');
        $r = wp_parse_args($o_limit, $defaults);
        extract($r);
    }
    if ($o_limit === "") {
        $o_limit = get_option('eme_event_list_number_items');
    }
    if ($o_limit > 0) {
        $limit = "LIMIT " . intval($o_limit);
    } else {
        $limit = "";
    }
    if ($o_offset > 0) {
        if ($o_limit == 0) {
            $limit = "LIMIT " . intval($o_offset);
        }
        $offset = "OFFSET " . intval($o_offset);
    } else {
        $offset = "";
    }
    if ($order != "DESC") {
        $order = "ASC";
    }
    $eme_date_obj = new ExpressiveDate(null, $eme_timezone);
    $start_of_week = get_option('start_of_week');
    $eme_date_obj->setWeekStartDay($start_of_week);
    $today = $eme_date_obj->getDate();
    $this_time = $eme_date_obj->getTime();
    $this_datetime = $eme_date_obj->getDateTime();
    $conditions = array();
    // extra sql conditions we put in front, most of the time this is the most
    // effective place
    if ($extra_conditions != "") {
        $conditions[] = $extra_conditions;
    }
    // if we're not in the admin itf, we don't want draft events
    if (!is_admin()) {
        if (is_user_logged_in()) {
            $conditions[] = "event_status IN (" . STATUS_PUBLIC . "," . STATUS_PRIVATE . ")";
        } else {
            $conditions[] = "event_status=" . STATUS_PUBLIC;
        }
        if (get_option('eme_rsvp_hide_full_events')) {
            // COALESCE is used in case the SUM returns NULL
            // this is a correlated subquery, so the FROM clause should specify events_table again, so it will search in the outer query for events_table.event_id
            $conditions[] = "(event_rsvp=0 OR (event_rsvp=1 AND event_seats > (SELECT COALESCE(SUM(booking_seats),0) AS booked_seats FROM {$bookings_table} WHERE {$bookings_table}.event_id = {$events_table}.event_id)))";
        }
        if (get_option('eme_rsvp_hide_rsvp_ended_events')) {
            $conditions[] = "(event_rsvp=0 OR (event_rsvp=1 AND (event_end_date < '{$today}' OR UNIX_TIMESTAMP(CONCAT(event_start_date,' ',event_start_time))-rsvp_number_days*60*60*24-rsvp_number_hours*60*60 > UNIX_TIMESTAMP()) ))";
        }
    }
    if (preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}\$/", $scope)) {
        //$conditions[] = " event_start_date like '$scope'";
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date LIKE '{$scope}') OR (event_start_date <= '{$scope}' AND event_end_date >= '{$scope}'))";
        } else {
            $conditions[] = " (event_start_date LIKE '{$scope}') ";
        }
    } elseif (preg_match("/^--([0-9]{4}-[0-9]{2}-[0-9]{2})\$/", $scope, $matches)) {
        $limit_start = $matches[1];
        if ($show_ongoing) {
            $conditions[] = " (event_start_date < '{$limit_start}') ";
        } else {
            $conditions[] = " (event_end_date < '{$limit_start}') ";
        }
    } elseif (preg_match("/^\\+\\+([0-9]{4}-[0-9]{2}-[0-9]{2})\$/", $scope, $matches)) {
        $limit_start = $matches[1];
        $conditions[] = " (event_start_date > '{$limit_start}') ";
    } elseif (preg_match("/^0000-([0-9]{2})\$/", $scope, $matches)) {
        $month = $matches[1];
        $eme_date_obj->setMonth($month);
        $number_of_days_month = $eme_date_obj->getDaysInMonth();
        $limit_start = "{$year}-{$month}-01";
        $limit_end = "{$year}-{$month}-{$number_of_days_month}";
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "this_week") {
        // this comes from global wordpress preferences
        $start_of_week = get_option('start_of_week');
        $eme_date_obj->setWeekStartDay($start_of_week);
        $limit_start = $eme_date_obj->startOfWeek()->format('Y-m-d');
        $limit_end = $eme_date_obj->endOfWeek()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "next_week") {
        // this comes from global wordpress preferences
        $start_of_week = get_option('start_of_week');
        $eme_date_obj->setWeekStartDay($start_of_week);
        $eme_date_obj->addOneWeek();
        $limit_start = $eme_date_obj->startOfWeek()->format('Y-m-d');
        $limit_end = $eme_date_obj->endOfWeek()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "this_month") {
        $limit_start = $eme_date_obj->startOfMonth()->format('Y-m-d');
        $limit_end = $eme_date_obj->endOfMonth()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "this_year") {
        $year = $eme_date_obj->getYear();
        $limit_start = "{$year}-01-01";
        $limit_end = "{$year}-12-31";
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "next_month") {
        $eme_date_obj->addOneMonth();
        $limit_start = $eme_date_obj->startOfMonth()->format('Y-m-d');
        $limit_end = $eme_date_obj->endOfMonth()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^([0-9]{4}-[0-9]{2}-[0-9]{2})--([0-9]{4}-[0-9]{2}-[0-9]{2})\$/", $scope, $matches)) {
        $limit_start = $matches[1];
        $limit_end = $matches[2];
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^([0-9]{4}-[0-9]{2}-[0-9]{2})--today\$/", $scope, $matches)) {
        $limit_start = $matches[1];
        $limit_end = $today;
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^today--([0-9]{4}-[0-9]{2}-[0-9]{2})\$/", $scope, $matches)) {
        $limit_start = $today;
        $limit_end = $matches[1];
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^\\+(\\d+)d\$/", $scope, $matches)) {
        $days = $matches[1];
        $limit_start = $today;
        $limit_end = $eme_date_obj->addDays($days)->getDate();
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^\\-(\\d+)d\$/", $scope, $matches)) {
        $days = $matches[1];
        $limit_start = $eme_date_obj->minusDays($days)->getDate();
        $limit_end = $today;
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^(\\-?\\+?\\d+)d--(\\-?\\+?\\d+)d\$/", $scope, $matches)) {
        $day1 = $matches[1];
        $day2 = $matches[2];
        $limit_start = $eme_date_obj->copy()->modifyDays($day1)->getDate();
        $limit_end = $eme_date_obj->copy()->modifyDays($day2)->getDate();
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^relative\\-(\\d+)d--([0-9]{4}-[0-9]{2}-[0-9]{2})\$/", $scope, $matches)) {
        $days = $matches[1];
        $limit_end = $matches[2];
        $eme_date_obj->setTimestampFromString($limit_end . " " . $eme_timezone);
        $limit_start = $eme_date_obj->minusDays($days)->getDate() . " " . $eme_timezone;
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^([0-9]{4}-[0-9]{2}-[0-9]{2})--relative\\+(\\d+)d\$/", $scope, $matches)) {
        $limit_start = $matches[1];
        $days = $matches[2];
        $eme_date_obj->setTimestampFromString($limit_start . " " . $eme_timezone);
        $limit_end = $eme_date_obj->addDays($days)->getDate() . " " . $eme_timezone;
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^\\+(\\d+)m\$/", $scope, $matches)) {
        $months_in_future = $matches[1]++;
        $limit_start = $eme_date_obj->startOfMonth()->format('Y-m-d');
        $eme_date_obj->addMonths($months_in_future);
        $limit_end = $eme_date_obj->endOfMonth()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^\\-(\\d+)m\$/", $scope, $matches)) {
        $months_in_past = $matches[1]++;
        $limit_start = $eme_date_obj->copy()->minusMonths($months_in_past)->startOfMonth()->format('Y-m-d');
        $limit_end = $eme_date_obj->copy()->minusOneMonth()->endOfMonth()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif (preg_match("/^(\\-?\\+?\\d+)m--(\\-?\\+?\\d+)m\$/", $scope, $matches)) {
        $months1 = $matches[1];
        $months2 = $matches[2];
        $limit_start = $eme_date_obj->copy()->modifyMonths($months1)->startOfMonth()->format('Y-m-d');
        $limit_end = $eme_date_obj->copy()->modifyMonths($months2)->endOfMonth()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "today--this_week") {
        $limit_start = $today;
        $limit_end = $eme_date_obj->endOfWeek()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "today--this_week_plus_one") {
        $limit_start = $today;
        $limit_end = $eme_date_obj->endOfWeek()->addOneDay()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "today--this_month") {
        $limit_start = $today;
        $limit_end = $eme_date_obj->endOfMonth()->format('Y-m-d');
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "today--this_year") {
        $limit_start = $today;
        $limit_end = "{$year}-12-31";
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "this_week--today") {
        $limit_start = $eme_date_obj->startOfWeek()->format('Y-m-d');
        $limit_end = $today;
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "this_month--today") {
        $limit_start = $eme_date_obj->startOfMonth()->format('Y-m-d');
        $limit_end = $today;
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "this_year--today") {
        $limit_start = "{$year}-01-01";
        $limit_end = $today;
        if ($show_ongoing) {
            $conditions[] = " ((event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_end_date BETWEEN '{$limit_start}' AND '{$limit_end}') OR (event_start_date <= '{$limit_start}' AND event_end_date >= '{$limit_end}'))";
        } else {
            $conditions[] = " (event_start_date BETWEEN '{$limit_start}' AND '{$limit_end}')";
        }
    } elseif ($scope == "tomorrow--future") {
        if ($show_ongoing) {
            $conditions[] = " (event_start_date > '{$today}' OR (event_end_date > '{$today}' AND event_end_date != '0000-00-00' AND event_end_date IS NOT NULL))";
        } else {
            $conditions[] = " (event_start_date > '{$today}')";
        }
    } elseif ($scope == "past") {
        //$conditions[] = " (event_end_date < '$today' OR (event_end_date = '$today' and event_end_time < '$this_time' )) ";
        // not taking the hour into account until we can enter timezone info as well
        if ($show_ongoing) {
            $conditions[] = " event_end_date < '{$today}'";
        } else {
            $conditions[] = " event_start_date < '{$today}'";
        }
    } elseif ($scope == "today") {
        if ($show_ongoing) {
            $conditions[] = " (event_start_date = '{$today}' OR (event_start_date <= '{$today}' AND event_end_date >= '{$today}'))";
        } else {
            $conditions[] = " (event_start_date = '{$today}')";
        }
    } elseif ($scope == "tomorrow") {
        $tomorrow = $eme_date_obj->addOneDay()->getDate();
        if ($show_ongoing) {
            $conditions[] = " (event_start_date = '{$tomorrow}' OR (event_start_date <= '{$tomorrow}' AND event_end_date >= '{$tomorrow}'))";
        } else {
            $conditions[] = " (event_start_date = '{$tomorrow}')";
        }
    } elseif ($scope == "ongoing") {
        // only shows ongoing events, for this we try to use the date and time, but it might be incorrect since there's no user timezone info
        $conditions[] = " (CONCAT(event_start_date,' ',event_start_time)<='{$this_datetime}' AND CONCAT(event_end_date,' ',event_end_time)>= '{$this_datetime}')";
    } else {
        if ($scope != "all") {
            $scope = "future";
        }
        if ($scope == "future") {
            //$conditions[] = " ((event_start_date = '$today' AND event_start_time >= '$this_time') OR (event_start_date > '$today') OR (event_end_date > '$today' AND event_end_date != '0000-00-00' AND event_end_date IS NOT NULL) OR (event_end_date = '$today' AND event_end_time >= '$this_time'))";
            // not taking the hour into account until we can enter timezone info as well
            if ($show_ongoing) {
                $conditions[] = " (event_start_date >= '{$today}' OR (event_end_date >= '{$today}' AND event_end_date != '0000-00-00' AND event_end_date IS NOT NULL))";
            } else {
                $conditions[] = " (event_start_date >= '{$today}')";
            }
        }
    }
    // when used inside a location description, you can use this_location to indicate the current location being viewed
    if ($location_id == "this_location" && get_query_var('location_id')) {
        $location_id = get_query_var('location_id');
    }
    if (is_numeric($location_id)) {
        if ($location_id > 0) {
            $conditions[] = " location_id = {$location_id}";
        }
    } elseif ($location_id == "none") {
        $conditions[] = " location_id = ''";
    } elseif (preg_match('/,/', $location_id)) {
        $location_ids = explode(',', $location_id);
        $location_conditions = array();
        foreach ($location_ids as $loc) {
            if (is_numeric($loc) && $loc > 0) {
                $location_conditions[] = " location_id = {$loc}";
            } elseif ($loc == "none") {
                $location_conditions[] = " location_id = ''";
            }
        }
        $conditions[] = "(" . implode(' OR', $location_conditions) . ")";
    } elseif (preg_match('/\\+/', $location_id)) {
        $location_ids = explode('+', $location_id);
        $location_conditions = array();
        foreach ($location_ids as $loc) {
            if (is_numeric($loc) && $loc > 0) {
                $location_conditions[] = " location_id = {$loc}";
            }
        }
        $conditions[] = "(" . implode(' AND', $location_conditions) . ")";
    } elseif (preg_match('/ /', $location_id)) {
        // url decoding of '+' is ' '
        $location_ids = explode(' ', $location_id);
        $location_conditions = array();
        foreach ($location_ids as $loc) {
            if (is_numeric($loc) && $loc > 0) {
                $location_conditions[] = " location_id = {$loc}";
            }
        }
        $conditions[] = "(" . implode(' AND', $location_conditions) . ")";
    }
    if (get_option('eme_categories_enabled')) {
        if (is_numeric($category)) {
            if ($category > 0) {
                $conditions[] = " FIND_IN_SET({$category},event_category_ids)";
            }
        } elseif ($category == "none") {
            $conditions[] = "event_category_ids = ''";
        } elseif (preg_match('/,/', $category)) {
            $category = explode(',', $category);
            $category_conditions = array();
            foreach ($category as $cat) {
                if (is_numeric($cat) && $cat > 0) {
                    $category_conditions[] = " FIND_IN_SET({$cat},event_category_ids)";
                } elseif ($cat == "none") {
                    $category_conditions[] = " event_category_ids = ''";
                }
            }
            $conditions[] = "(" . implode(' OR', $category_conditions) . ")";
        } elseif (preg_match('/\\+/', $category)) {
            $category = explode('+', $category);
            $category_conditions = array();
            foreach ($category as $cat) {
                if (is_numeric($cat) && $cat > 0) {
                    $category_conditions[] = " FIND_IN_SET({$cat},event_category_ids)";
                }
            }
            $conditions[] = "(" . implode(' AND ', $category_conditions) . ")";
        } elseif (preg_match('/ /', $category)) {
            // url decoding of '+' is ' '
            $category = explode(' ', $category);
            $category_conditions = array();
            foreach ($category as $cat) {
                if (is_numeric($cat) && $cat > 0) {
                    $category_conditions[] = " FIND_IN_SET({$cat},event_category_ids)";
                }
            }
            $conditions[] = "(" . implode(' AND ', $category_conditions) . ")";
        }
    }
    if (get_option('eme_categories_enabled')) {
        if (is_numeric($notcategory)) {
            if ($notcategory > 0) {
                $conditions[] = " NOT FIND_IN_SET({$notcategory},event_category_ids)";
            }
        } elseif ($notcategory == "none") {
            $conditions[] = "event_category_ids != ''";
        } elseif (preg_match('/,/', $notcategory)) {
            $notcategory = explode(',', $notcategory);
            $category_conditions = array();
            foreach ($notcategory as $cat) {
                if (is_numeric($cat) && $cat > 0) {
                    $category_conditions[] = " NOT FIND_IN_SET({$cat},event_category_ids)";
                } elseif ($cat == "none") {
                    $category_conditions[] = " event_category_ids != ''";
                }
            }
            $conditions[] = "(" . implode(' OR', $category_conditions) . ")";
        } elseif (preg_match('/\\+/', $notcategory)) {
            $notcategory = explode('+', $notcategory);
            $category_conditions = array();
            foreach ($notcategory as $cat) {
                if (is_numeric($cat) && $cat > 0) {
                    $category_conditions[] = " NOT FIND_IN_SET({$cat},event_category_ids)";
                }
            }
            $conditions[] = "(" . implode(' AND ', $category_conditions) . ")";
        } elseif (preg_match('/ /', $notcategory)) {
            // url decoding of '+' is ' '
            $notcategory = explode(' ', $notcategory);
            $category_conditions = array();
            foreach ($notcategory as $cat) {
                if (is_numeric($cat) && $cat > 0) {
                    $category_conditions[] = " NOT FIND_IN_SET({$cat},event_category_ids)";
                }
            }
        }
    }
    // now filter the author ID
    if ($author != '' && !preg_match('/,/', $author)) {
        $authinfo = get_user_by('login', $author);
        $conditions[] = " event_author = " . $authinfo->ID;
    } elseif (preg_match('/,/', $author)) {
        $authors = explode(',', $author);
        $author_conditions = array();
        foreach ($authors as $authname) {
            $authinfo = get_user_by('login', $authname);
            $author_conditions[] = " event_author = " . $authinfo->ID;
        }
        $conditions[] = "(" . implode(' OR ', $author_conditions) . ")";
    }
    // now filter the contact ID
    if ($contact_person != '' && !preg_match('/,/', $contact_person)) {
        $authinfo = get_user_by('login', $contact_person);
        $conditions[] = " event_contactperson_id = " . $authinfo->ID;
    } elseif (preg_match('/,/', $contact_person)) {
        $contact_persons = explode(',', $contact_person);
        $contact_person_conditions = array();
        foreach ($contact_persons as $authname) {
            $authinfo = get_user_by('login', $authname);
            $contact_person_conditions[] = " event_contactperson_id = " . $authinfo->ID;
        }
        $conditions[] = "(" . implode(' OR ', $contact_person_conditions) . ")";
    }
    // extra conditions for authors: if we're in the admin itf, return only the events for which you have the right to change anything
    $current_userid = get_current_user_id();
    if (is_admin() && !current_user_can(get_option('eme_cap_edit_events')) && !current_user_can(get_option('eme_cap_list_events')) && current_user_can(get_option('eme_cap_author_event'))) {
        $conditions[] = "(event_author = {$current_userid} OR event_contactperson_id= {$current_userid})";
    }
    $where = implode(" AND ", $conditions);
    if ($show_recurrent_events_once) {
        if ($where != "") {
            $where = " AND " . $where;
        }
        $sql = "SELECT * FROM {$events_table}\n         WHERE (recurrence_id>0 {$where})\n         group by recurrence_id union all\n         SELECT * FROM {$events_table}\n         WHERE (recurrence_id=0 {$where})\n         ORDER BY event_start_date {$order} , event_start_time {$order}\n         {$limit} \n         {$offset}";
    } else {
        if ($where != "") {
            $where = " WHERE " . $where;
        }
        $sql = "SELECT * FROM {$events_table}\n         {$where}\n         ORDER BY event_start_date {$order} , event_start_time {$order}\n         {$limit} \n         {$offset}";
    }
    $wpdb->show_errors = true;
    $events = $wpdb->get_results($sql, ARRAY_A);
    $inflated_events = array();
    if (!empty($events)) {
        //$wpdb->print_error();
        foreach ($events as $this_event) {
            $this_event = eme_get_event_data($this_event);
            array_push($inflated_events, $this_event);
        }
        if (has_filter('eme_event_list_filter')) {
            $inflated_events = apply_filters('eme_event_list_filter', $inflated_events);
        }
    }
    return $inflated_events;
}