Example #1
0
 /**
  * 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);
     }
 }
Example #2
0
 /**
  * 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']);
 }
Example #3
0
 /**
  * 
  */
 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);
     }
 }