/** * Modify the query according to search form values. */ public function alter_search_query($query) { if (empty($query) || is_admin() || !$query->is_main_query() && empty($query->query_vars['suppress_filters'])) { return $query; } // get URL vars $current_url = parse_url($_SERVER['REQUEST_URI']); if (empty($current_url['query'])) { return $query; } parse_str($current_url['query'], $vars); // get raxonomies $taxonomies = array(); foreach ($vars as $var_key => $var_value) { if (!empty($var_value)) { if (stripos($var_key, 'tax_') === 0) { $var_key = str_replace('tax_', '', $var_key); if (in_array($var_key, array('event-category', 'event-location', 'event-organizer', 'event-tag'))) { $taxonomies[] = array($var_key => $var_value); } } } } // build tax query $tax_query = array(); if ($taxonomies) { foreach ($taxonomies as $taxonomy) { $tax_query[] = array('taxonomy' => key($taxonomy), 'terms' => current($taxonomy), 'field' => 'term_id'); } } if (!empty($query->tax_query->queries)) { $tax_query = array_merge($query->tax_query->queries, $tax_query); } // get event date $em_helper = new Events_Maker_Helper(); $meta_query = $query->get('meta_query'); $start = !empty($_GET['start_date']) ? sanitize_text_field($_GET['start_date']) : ''; $end = !empty($_GET['end_date']) ? sanitize_text_field($_GET['end_date']) : ''; $sb = $em_helper->is_valid_date($start); $eb = $em_helper->is_valid_date($end); if ($sb === true && $eb === true) { $meta_query = array(array('key' => '_event_start_date', 'value' => $start, 'compare' => '>=', 'type' => 'DATE'), array('key' => '_event_end_date', 'value' => $end, 'compare' => '<=', 'type' => 'DATE')); } elseif ($sb === true && $eb !== true) { $meta_query = array(array('key' => '_event_start_date', 'value' => $start, 'compare' => '>=', 'type' => 'DATE')); } elseif ($sb !== true && $eb === true) { $meta_query = array(array('key' => '_event_end_date', 'value' => $end, 'compare' => '<=', 'type' => 'DATE')); } if (!empty($tax_query)) { $query->set('tax_query', $tax_query); } if (!empty($meta_query)) { $query->set('meta_query', $meta_query); } }
/** * Create custom recurrence dates. */ private function create_recurrences($post_id, $start, $end, $type, $repeat, $until, $weekly_days, $monthly_day_type) { $em_helper = new Events_Maker_Helper(); if ($em_helper->is_after_date($start, $end) || $em_helper->is_after_date($start, $until)) { return; } $format = 'Y-m-d H:i:s'; $occurrences = array(); $diff = strtotime($end) - strtotime($start); $finish = strtotime($until); if ($type === 'daily') { $repeat *= 86400; $current = strtotime($start); while ($current <= $finish) { $occurrences[] = array('start' => date($format, $current), 'end' => date($format, $current + $diff)); // create new current date $current += $repeat; } } elseif ($type === 'weekly') { $current = $start_date = strtotime($start); $weekdays = array(); $repeat *= 7; $i = $counter = 0; $day = date('N', $current); foreach ($weekly_days as $weekday) { $weekdays[] = $weekday - $day; } $number_of_days = count($weekdays); while ($current <= $finish) { if (($more_days = $weekdays[$i++] + $repeat * $counter) >= 0) { // create new current date $current = strtotime('+' . $more_days . ' days', $start_date); if ($current <= $finish) { $occurrences[] = array('start' => date($format, $current), 'end' => date($format, $current + $diff)); } } if ($i === $number_of_days) { $counter++; $i = 0; } } } elseif ($type === 'monthly') { $current = strtotime($start); $start_date = date_parse($start); // is it day of week? if ($monthly_day_type === 2) { // 1-7 $day_of_week = date('N', $current); // 1-31 / 7 rounded down $which = (int) floor(date('j', $current) / 7); // time $diff_time = $start_date['second'] + $start_date['minute'] * 60 + $start_date['hour'] * 3600; } else { $diff_time = 0; } while ($current <= $finish) { $occurrences[] = array('start' => date($format, $current + $diff_time), 'end' => date($format, $current + $diff + $diff_time)); // current date $date = date_parse(date('Y-m-d', $current)); // create new current date if ($start_date['day'] > 28) { $values = date('Y-m-t', strtotime('+' . $repeat . ' months', strtotime($date['year'] . '-' . $date['month'] . '-01'))); $values = explode('-', $values); if ($values[2] < $date['day']) { $current = strtotime($values[0] . '-' . $values[1] . '-' . $values[2]); } else { $current = strtotime($values[0] . '-' . $values[1] . '-' . $start_date['day']); } } else { $current = strtotime('+' . $repeat . ' months', $current); } if ($monthly_day_type === 2) { // due to PHP 5.2 bugs lets do some craziness $year = date('Y', $current); $month = date('m', $current); $day_of_month = date('N', strtotime($year . '-' . $month . '-01')); if ($day_of_month <= $day_of_week) { $number = $day_of_week - $day_of_month + 1; } else { $number = $day_of_week - $day_of_month + 8; } $number += 7 * $which; // is it valid date? while (!checkdate((int) $month, $number, $year)) { $number -= 7; } $current = strtotime($year . '-' . $month . '-' . str_pad($number, 2, '0', STR_PAD_LEFT)); } } } elseif ($type === 'yearly') { $current = strtotime($start); while ($current <= $finish) { $occurrences[] = array('start' => date($format, $current), 'end' => date($format, $current + $diff)); // create new current date $current = strtotime('+1 year', $current); } } if (!empty($occurrences)) { global $wpdb; $query = array(); foreach ($occurrences as $id => $occurrence) { if ($id > 0) { $query[] = "(" . $post_id . ", '_event_occurrence_date', '" . $occurrence['start'] . "|" . $occurrence['end'] . "')"; } } if (!empty($query)) { $wpdb->query('INSERT INTO ' . $wpdb->postmeta . ' (post_id, meta_key, meta_value) VALUES ' . implode(', ', $query)); } } // get last occurrence $last = end($occurrences); // add last occurrence add_post_meta($post_id, '_event_occurrence_last_date', $last['start'] . '|' . $last['end']); }
/** * */ public function extend_pre_query($query) { if (is_tax('event-location') && isset($query->query_vars['event-location'], $query->query['event-location']) || is_tax('event-organizer') && isset($query->query_vars['event-organizer'], $query->query['event-organizer']) || is_tax('event-category') && isset($query->query_vars['event-category'], $query->query['event-category'])) { if (!isset($query->query_vars['event_show_occurrences'])) { $query->query_vars['event_show_occurrences'] = is_admin() ? false : $this->options['general']['show_occurrences']; } if ($query->query_vars['event_show_occurrences']) { $keys = array('start' => '_event_occurrence_date', 'end' => '_event_occurrence_date'); } else { $keys = array('start' => '_event_start_date', 'end' => '_event_end_date'); } $event_order_by = true; if (isset($query->query_vars['orderby'])) { if ($query->query_vars['orderby'] === 'event_start_date') { $query->query_vars['meta_key'] = $keys['start']; $query->query_vars['orderby'] = 'meta_value'; } elseif ($query->query_vars['orderby'] === 'event_end_date') { $query->query_vars['meta_key'] = $keys['end']; $query->query_vars['orderby'] = 'meta_value'; } else { $event_order_by = false; } } else { if (in_array($this->options['general']['order_by'], array('start', 'end'), true)) { $query->query_vars['meta_key'] = $keys[$this->options['general']['order_by']]; $query->query_vars['orderby'] = 'meta_value'; } elseif ($this->options['general']['order_by'] === 'publish') { $query->query_vars['orderby'] = 'date'; $event_order_by = false; } else { $event_order_by = false; } } if (!isset($query->query_vars['order'])) { $query->query_vars['order'] = $this->options['general']['order']; } if (!isset($query->query_vars['event_show_past_events']) || !is_bool($query->query_vars['event_show_past_events'])) { $query->query_vars['event_show_past_events'] = is_admin() ? true : $this->options['general']['show_past_events']; } // some ninja fixes if ($query->query_vars['event_show_occurrences'] && $query->query_vars['event_show_past_events'] && !$event_order_by) { $query->query_vars['meta_key'] = $keys['end']; } elseif ($query->query_vars['event_show_occurrences'] && !$query->query_vars['event_show_past_events'] && $event_order_by) { $query->query_vars['meta_key'] = ''; } $meta_args = $query->get('meta_query'); if ($query->query_vars['event_show_occurrences']) { global $wpdb; $sql = array(); if (!$query->query_vars['event_show_past_events'] && !$query->is_singular) { $sql[] = "CAST(SUBSTRING_INDEX(events_meta.meta_value, '|', -1) AS DATETIME) >= '" . current_time('mysql') . "'"; } $query->event_details = $sql; } else { if (!$query->query_vars['event_show_past_events'] && !$query->is_singular) { $meta_args[] = array('key' => !$this->options['general']['expire_current'] ? $keys['end'] : $keys['start'], 'value' => current_time('mysql'), 'compare' => '>=', 'type' => 'DATETIME'); } } $query->set('meta_query', $meta_args); } $post_types = $query->get('post_type'); // does query contain post type as a string or post types array if (is_array($post_types)) { // check if there are defferrnces between the arrays if ((bool) array_diff($post_types, apply_filters('em_event_post_type', array('event')))) { // at least one of the post_types is not an event post type, don't run the query $run_query = false; } else { // all the post type are of event post type $run_query = true; } } else { $run_query = (bool) in_array($post_types, apply_filters('em_event_post_type', array('event'))); } if ($run_query) { $em_helper = new Events_Maker_Helper(); $format_sa = $format_sb = $format_ea = $format_eb = ''; $defaults = array('event_start_after' => '', 'event_start_before' => '', 'event_end_after' => '', 'event_end_before' => '', 'event_date_range' => 'between', 'event_date_type' => 'all', 'event_ticket_type' => 'all', 'event_ondate' => '', 'event_show_past_events' => is_admin() ? true : $this->options['general']['show_past_events'], 'event_show_occurrences' => is_admin() ? true : $this->options['general']['show_occurrences']); if (!empty($query->query_vars['event_ondate'])) { $date = explode('/', $query->query_vars['event_ondate']); //year if (($a = count($date)) === 1) { $ondate_start = $date[0] . '-01-01'; $ondate_end = $date[0] . '-12-31'; } elseif ($a === 2) { $ondate_start = $date[0] . '-' . $date[1] . '-01'; $ondate_end = $date[0] . '-' . $date[1] . '-' . date('t', strtotime($date[0] . '-' . $date[1] . '-02')); } elseif ($a === 3) { $ondate_start = $ondate_end = $date[0] . '-' . $date[1] . '-' . $date[2]; } $query->set('event_start_before', $ondate_end); $query->set('event_end_after', $ondate_start); } else { $query->query_vars['event_ondate'] = $defaults['event_ondate']; } if (!isset($query->query_vars['event_date_range']) || !in_array($query->query_vars['event_date_range'], array('between', 'outside'), true)) { $query->query_vars['event_date_range'] = $defaults['event_date_range']; } if (!isset($query->query_vars['event_date_type']) || !in_array($query->query_vars['event_date_type'], array('all', 'all_day', 'not_all_day'), true)) { $query->query_vars['event_date_type'] = $defaults['event_date_type']; } if (!isset($query->query_vars['event_ticket_type']) || !in_array($query->query_vars['event_ticket_type'], array('all', 'free', 'paid'), true)) { $query->query_vars['event_ticket_type'] = $defaults['event_ticket_type']; } if (!isset($query->query_vars['event_show_past_events']) || !is_bool($query->query_vars['event_show_past_events'])) { $query->query_vars['event_show_past_events'] = $defaults['event_show_past_events']; } if (!isset($query->query_vars['event_start_after']) || !($format_sa = $em_helper->is_valid_datetime($query->query_vars['event_start_after']))) { $query->query_vars['event_start_after'] = $defaults['event_start_after']; } if (!isset($query->query_vars['event_start_before']) || !($format_sb = $em_helper->is_valid_datetime($query->query_vars['event_start_before']))) { $query->query_vars['event_start_before'] = $defaults['event_start_before']; } if (!isset($query->query_vars['event_end_after']) || !($format_ea = $em_helper->is_valid_datetime($query->query_vars['event_end_after']))) { $query->query_vars['event_end_after'] = $defaults['event_end_after']; } if (!isset($query->query_vars['event_end_before']) || !($format_eb = $em_helper->is_valid_datetime($query->query_vars['event_end_before']))) { $query->query_vars['event_end_before'] = $defaults['event_end_before']; } if (!isset($query->query_vars['event_show_occurrences'])) { $query->query_vars['event_show_occurrences'] = is_admin() ? false : $defaults['event_show_occurrences']; } if ($query->query_vars['event_show_occurrences']) { $keys = array('start' => '_event_occurrence_date', 'end' => '_event_occurrence_date'); } else { $keys = array('start' => '_event_start_date', 'end' => '_event_end_date'); } $event_order_by = true; if (isset($query->query_vars['orderby'])) { if ($query->query_vars['orderby'] === 'event_start_date') { $query->query_vars['meta_key'] = $keys['start']; $query->query_vars['orderby'] = 'meta_value'; } elseif ($query->query_vars['orderby'] === 'event_end_date') { $query->query_vars['meta_key'] = $keys['end']; $query->query_vars['orderby'] = 'meta_value'; } else { $event_order_by = false; } } else { if (in_array($this->options['general']['order_by'], array('start', 'end'), true)) { $query->query_vars['meta_key'] = $keys[$this->options['general']['order_by']]; $query->query_vars['orderby'] = 'meta_value'; } elseif ($this->options['general']['order_by'] === 'publish') { $query->query_vars['orderby'] = 'date'; $event_order_by = false; } else { $event_order_by = false; } } if (!isset($query->query_vars['order'])) { $query->query_vars['order'] = $this->options['general']['order']; } // some ninja fixes if ($query->query_vars['event_show_occurrences'] && $query->query_vars['event_show_past_events'] && !$event_order_by) { $query->query_vars['meta_key'] = $keys['end']; } elseif ($query->query_vars['event_show_occurrences'] && !$query->query_vars['event_show_past_events'] && $event_order_by) { $query->query_vars['meta_key'] = ''; } if ($format_sa === 'Y-m-d') { $sa_date = $query->query_vars['event_date_range'] === 'between' ? ' 00:00:00' : ' 23:59:00'; } elseif ($format_sa === 'Y-m-d H:i') { $sa_date = ':00'; } else { $sa_date = ''; } if ($format_sb === 'Y-m-d') { $sb_date = $query->query_vars['event_date_range'] === 'between' ? ' 23:59:00' : ' 00:00:00'; } elseif ($format_sb === 'Y-m-d H:i') { $sb_date = ':00'; } else { $sb_date = ''; } if ($format_ea === 'Y-m-d') { $ea_date = $query->query_vars['event_date_range'] === 'between' ? ' 00:00:00' : ' 23:59:00'; } elseif ($format_ea === 'Y-m-d H:i') { $ea_date = ':00'; } else { $ea_date = ''; } if ($format_eb === 'Y-m-d') { $eb_date = $query->query_vars['event_date_range'] === 'between' ? ' 23:59:00' : ' 00:00:00'; } elseif ($format_eb === 'Y-m-d H:i') { $eb_date = ':00'; } else { $eb_date = ''; } $meta_args = $query->get('meta_query'); if ($query->query_vars['event_show_occurrences']) { global $wpdb; $sql = array(); if (!empty($query->query_vars['event_start_after'])) { $sql[] = "CAST(SUBSTRING_INDEX(events_meta.meta_value, '|', 1) AS DATETIME) " . ($query->query_vars['event_date_range'] === 'between' ? '>=' : '<=') . " '" . date('Y-m-d H:i:s', strtotime($query->query_vars['event_start_after'] . $sa_date)) . "'"; } if (!empty($query->query_vars['event_start_before'])) { $sql[] = "CAST(SUBSTRING_INDEX(events_meta.meta_value, '|', 1) AS DATETIME) " . ($query->query_vars['event_date_range'] === 'between' ? '<=' : '>=') . " '" . date('Y-m-d H:i:s', strtotime($query->query_vars['event_start_before'] . $sb_date)) . "'"; } if (!empty($query->query_vars['event_end_after'])) { $sql[] = "CAST(SUBSTRING_INDEX(events_meta.meta_value, '|', -1) AS DATETIME) " . ($query->query_vars['event_date_range'] === 'between' ? '>=' : '<=') . " '" . date('Y-m-d H:i:s', strtotime($query->query_vars['event_end_after'] . $ea_date)) . "'"; } if (!empty($query->query_vars['event_end_before'])) { $sql[] = "CAST(SUBSTRING_INDEX(events_meta.meta_value, '|', -1) AS DATETIME) " . ($query->query_vars['event_date_range'] === 'between' ? '<=' : '>=') . " '" . date('Y-m-d H:i:s', strtotime($query->query_vars['event_end_before'] . $eb_date)) . "'"; } if (!$query->query_vars['event_show_past_events'] && !$query->is_singular) { $sql[] = "CAST(SUBSTRING_INDEX(events_meta.meta_value, '|', -1) AS DATETIME) >= '" . current_time('mysql') . "'"; } $query->event_details = $sql; } else { if (!empty($query->query_vars['event_start_after'])) { $meta_args[] = array('key' => $keys['start'], 'value' => date('Y-m-d H:i:s', strtotime($query->query_vars['event_start_after'] . $sa_date)), 'compare' => $query->query_vars['event_date_range'] === 'between' ? '>=' : '<=', 'type' => 'DATETIME'); } if (!empty($query->query_vars['event_start_before'])) { $meta_args[] = array('key' => $keys['start'], 'value' => date('Y-m-d H:i:s', strtotime($query->query_vars['event_start_before'] . $sb_date)), 'compare' => $query->query_vars['event_date_range'] === 'between' ? '<=' : '>=', 'type' => 'DATETIME'); } if (!empty($query->query_vars['event_end_after'])) { $meta_args[] = array('key' => $keys['end'], 'value' => date('Y-m-d H:i:s', strtotime($query->query_vars['event_end_after'] . $ea_date)), 'compare' => $query->query_vars['event_date_range'] === 'between' ? '>=' : '<=', 'type' => 'DATETIME'); } if (!empty($query->query_vars['event_end_before'])) { $meta_args[] = array('key' => $keys['end'], 'value' => date('Y-m-d H:i:s', strtotime($query->query_vars['event_end_before'] . $eb_date)), 'compare' => $query->query_vars['event_date_range'] === 'between' ? '<=' : '>=', 'type' => 'DATETIME'); } if (!$query->query_vars['event_show_past_events'] && !$query->is_singular) { $meta_args[] = array('key' => !$this->options['general']['expire_current'] ? $keys['end'] : $keys['start'], 'value' => current_time('mysql'), 'compare' => '>=', 'type' => 'DATETIME'); } } if ($query->query_vars['event_date_type'] === 'all_day') { $meta_args[] = array('key' => '_event_all_day', 'value' => 1, 'compare' => '=', 'type' => 'NUMERIC'); } elseif ($query->query_vars['event_date_type'] === 'not_all_day') { $meta_args[] = array('key' => '_event_all_day', 'value' => 0, 'compare' => '=', 'type' => 'NUMERIC'); } if ($query->query_vars['event_ticket_type'] !== 'all') { $meta_args[] = array('key' => '_event_free', 'value' => $query->query_vars['event_ticket_type'] === 'free' ? 1 : 0, 'compare' => '=', 'type' => 'NUMERIC'); } $query->set('meta_query', $meta_args); } }