Events Manager - Version 3.0.5

Version Description

  • Fixed 12pm bug
  • Re-added #_LOCATIONPAGEURL (although officially it's depreciated)
  • Added default order by settings in options page
  • Added default event list limits in options page
  • Added orderby attribute for shortcode
  • scope attribute now also allows searching between dates, e.g. "2010-01-01,2010-01-31"
  • Fixed booking email reporting bug
Download this release

Release Info

Developer netweblogic
Plugin Icon 128x128 Events Manager
Version 3.0.5
Comparing to
See all releases

Code changes from version 3.0.4 to 3.0.5

admin/options.php CHANGED
@@ -5,10 +5,15 @@ function em_options_save(){
5
//Build the array of options here
6
foreach ($_POST as $postKey => $postValue){
7
if( substr($postKey, 0, 5) == 'dbem_' ){
8
- //For now, no validation, since this is in admin area.
9
- //TODO slashes being added?
10
- //$postValue = EM_Object::sanitize($postValue)
11
- update_option($postKey, stripslashes($postValue));
12
}
13
}
14
function em_options_saved_notice(){
@@ -107,6 +112,31 @@ function dbem_options_subpanel() {
107
dbem_options_radio_binary ( __( 'Display calendar in events page?', 'dbem' ), 'dbem_display_calendar_in_events_page', __( 'This options allows to display the calendar in the events page, instead of the default list. It is recommended not to display both the calendar widget and a calendar page.','dbem' ) );
108
dbem_options_radio_binary ( __( 'Disable title rewriting?', 'dbem' ), 'dbem_disable_title_rewrites', __( "Some wordpress themes don't follow best practices when generating navigation menus, and so the automatic title rewriting feature may cause problems, if your menus aren't working correctly on the event pages, try setting this to 'Yes', and provide an appropriate HTML title format below.",'dbem' ) );
109
dbem_options_input_text ( __( 'Event Manager titles', 'dbem' ), 'dbem_title_html', __( "This only setting only matters if you selected 'Yes' to above. You will notice the events page titles aren't being rewritten, and you have a new title underneath the default page name. This is where you control the HTML of this title. Make sure you keep the #_PAGETITLE placeholder here, as that's what is rewritten by events manager. To control what's rewritten in this title, see settings further down for page titles.", 'dbem' ) );
110
echo $save_button;
111
?>
112
</table>
5
//Build the array of options here
6
foreach ($_POST as $postKey => $postValue){
7
if( substr($postKey, 0, 5) == 'dbem_' ){
8
+ //TODO some more validation/reporting
9
+ $numeric_options = array('dbem_locations_default_limit','dbem_events_default_limit');
10
+ if( in_array($postKey,$numeric_options) && !is_numeric($postValue) ){
11
+ //Do nothing, keep old setting.
12
+ }else{
13
+ //TODO slashes being added?
14
+ //$postValue = EM_Object::sanitize($postValue)
15
+ update_option($postKey, stripslashes($postValue));
16
+ }
17
}
18
}
19
function em_options_saved_notice(){
112
dbem_options_radio_binary ( __( 'Display calendar in events page?', 'dbem' ), 'dbem_display_calendar_in_events_page', __( 'This options allows to display the calendar in the events page, instead of the default list. It is recommended not to display both the calendar widget and a calendar page.','dbem' ) );
113
dbem_options_radio_binary ( __( 'Disable title rewriting?', 'dbem' ), 'dbem_disable_title_rewrites', __( "Some wordpress themes don't follow best practices when generating navigation menus, and so the automatic title rewriting feature may cause problems, if your menus aren't working correctly on the event pages, try setting this to 'Yes', and provide an appropriate HTML title format below.",'dbem' ) );
114
dbem_options_input_text ( __( 'Event Manager titles', 'dbem' ), 'dbem_title_html', __( "This only setting only matters if you selected 'Yes' to above. You will notice the events page titles aren't being rewritten, and you have a new title underneath the default page name. This is where you control the HTML of this title. Make sure you keep the #_PAGETITLE placeholder here, as that's what is rewritten by events manager. To control what's rewritten in this title, see settings further down for page titles.", 'dbem' ) );
115
+ dbem_options_input_text ( __( 'Event List Limits', 'dbem' ), 'dbem_events_default_limit', __( "This will control how many events are shown on one list by default.", 'dbem' ) );
116
+ ?>
117
+ <tr valign="top" id='dbem_events_default_orderby_row'>
118
+ <th scope="row"><?php _e('Default event list ordering','dbem'); ?></th>
119
+ <td>
120
+ <select name="dbem_events_default_orderby" >
121
+ <?php $EM_Event = new EM_Event(); //TODO once php5 strict, this may be ok as a static call and avoid constcurting ?>
122
+ <?php foreach($EM_Event->get_fields() as $value) : ?>
123
+ <option value='<?php echo $value ?>' <?php echo ("$value" == get_option('dbem_events_default_orderby')) ? "selected='selected'" : ''; ?>>
124
+ <?php echo $value; ?>
125
+ </option>
126
+ <?php endforeach; ?>
127
+ </select>
128
+ <select name="dbem_events_default_order" >
129
+ <?php foreach( array(__('Ascending','dbem')=>'ASC',__('Descending','dbem')=>'DESC') as $key => $value) : ?>
130
+ <option value='<?php echo $value ?>' <?php echo ("$value" == get_option('dbem_events_default_order')) ? "selected='selected'" : ''; ?>>
131
+ <?php echo $key; ?>
132
+ </option>
133
+ <?php endforeach; ?>
134
+ </select>
135
+ <br/>
136
+ <?php _e('When Events Manager displays lists of events the default behaviour is ordering by start date in ascending order. To change this, modify the values above.','dbem'); ?>
137
+ </td>
138
+ </tr>
139
+ <?php
140
echo $save_button;
141
?>
142
</table>
classes/bookings.php CHANGED
@@ -51,7 +51,7 @@ class EM_Bookings extends EM_Object{
51
* @return boolean
52
*/
53
function add( $EM_Booking ){
54
- global $wpdb;
55
if ( $this->get_available_seats() >= $EM_Booking->seats ) {
56
$EM_Booking->event_id = $this->event_id;
57
// checking whether the booker has already booked places
@@ -79,7 +79,11 @@ class EM_Bookings extends EM_Object{
79
if(!$email){
80
$this->feedback_message .= ' '.__('However, we were not able to send you an email.', 'dbem');
81
if( current_user_can('activate_plugins') ){
82
- $this->feedback_message .= '<br/><strong>Errors:</strong> (only admins see this)<br/><ul><li>'. implode('</li><li>', $EM_Mailer->errors).'</li></ul>';
83
}
84
}
85
return true;
@@ -184,10 +188,16 @@ class EM_Bookings extends EM_Object{
184
185
//TODO offer subject changes
186
if( !$EM_Mailer->send(__('Reservation confirmed','dbem'),$booker_body, $EM_Booking->person->email) ){
187
return false;
188
}
189
if( !$EM_Mailer->send(__("New booking",'dbem'), $contact_body, $EM_Event->contact->user_email) && current_user_can('activate_plugins')){
190
- $EM_Mailer->errors[] = 'Confirmation email could not be sent to contact person. Registrant should have gotten their email (only admin see this warning).';
191
return false;
192
}
193
51
* @return boolean
52
*/
53
function add( $EM_Booking ){
54
+ global $wpdb,$EM_Mailer;
55
if ( $this->get_available_seats() >= $EM_Booking->seats ) {
56
$EM_Booking->event_id = $this->event_id;
57
// checking whether the booker has already booked places
79
if(!$email){
80
$this->feedback_message .= ' '.__('However, we were not able to send you an email.', 'dbem');
81
if( current_user_can('activate_plugins') ){
82
+ if( is_array($this->errors) ){
83
+ $this->feedback_message .= '<br/><strong>Errors:</strong> (only admins see this message)<br/><ul><li>'. implode('</li><li>', $EM_Mailer->errors).'</li></ul>';
84
+ }else{
85
+ $this->feedback_message .= '<br/><strong>No errors returned by mailer</strong> (only admins see this message)';
86
+ }
87
}
88
}
89
return true;
188
189
//TODO offer subject changes
190
if( !$EM_Mailer->send(__('Reservation confirmed','dbem'),$booker_body, $EM_Booking->person->email) ){
191
+ foreach($EM_Mailer->errors as $error){
192
+ $this->errors[] = $error;
193
+ }
194
return false;
195
}
196
if( !$EM_Mailer->send(__("New booking",'dbem'), $contact_body, $EM_Event->contact->user_email) && current_user_can('activate_plugins')){
197
+ foreach($EM_Mailer->errors as $error){
198
+ $this->errors[] = $error;
199
+ }
200
+ $this->errors[] = 'Confirmation email could not be sent to contact person. Registrant should have gotten their email (only admin see this warning).';
201
return false;
202
}
203
classes/event.php CHANGED
@@ -140,13 +140,21 @@ class EM_Event extends EM_Object{
140
//TODO make time handling less painful
141
$match = array();
142
if( preg_match ( '/^([01]\d|2[0-3]):([0-5]\d)(AM|PM)?#x2F;', $_POST['event_start_time'], $match ) ){
143
- $match[1] = ($match[3] == 'PM') ? 12+$match[1] : $match[1];
144
$this->start_time = $match[1].":".$match[2].":00";
145
}else{
146
$this->start_time = "00:00:00";
147
}
148
if( preg_match ( '/^([01]\d|2[0-3]):([0-5]\d)(AM|PM)?#x2F;', $_POST['event_end_time'], $match ) ){
149
- $match[1] = ($match[3] == 'PM') ? 12+$match[1] : $match[1];
150
$this->end_time = $match[1].":".$match[2].":00";
151
}else{
152
$this->end_time = $this->start_time;
140
//TODO make time handling less painful
141
$match = array();
142
if( preg_match ( '/^([01]\d|2[0-3]):([0-5]\d)(AM|PM)?#x2F;', $_POST['event_start_time'], $match ) ){
143
+ if( $match[3] == 'PM' && $match[1] != 12 ){
144
+ $match[1] = 12+$match[1];
145
+ }elseif( $match[3] == 'AM' && $match[1] == 12 ){
146
+ $match[1] = '00';
147
+ }
148
$this->start_time = $match[1].":".$match[2].":00";
149
}else{
150
$this->start_time = "00:00:00";
151
}
152
if( preg_match ( '/^([01]\d|2[0-3]):([0-5]\d)(AM|PM)?#x2F;', $_POST['event_end_time'], $match ) ){
153
+ if( $match[3] == 'PM' && $match[1] != 12 ){
154
+ $match[1] = 12+$match[1];
155
+ }elseif( $match[3] == 'AM' && $match[1] == 12 ){
156
+ $match[1] = '00';
157
+ }
158
$this->end_time = $match[1].":".$match[2].":00";
159
}else{
160
$this->end_time = $this->start_time;
classes/events.php CHANGED
@@ -41,18 +41,24 @@ class EM_Events extends EM_Object {
41
42
//Get the default conditions
43
$conditions = self::build_sql_conditions($args);
44
-
45
//Put it all together
46
$where = ( count($conditions) > 0 ) ? " WHERE " . implode ( " AND ", $conditions ):'';
47
48
//Create the SQL statement and execute
49
$sql = "
50
SELECT * FROM $events_table
51
LEFT JOIN $locations_table ON {$locations_table}.location_id={$events_table}.location_id
52
$where
53
- ORDER BY event_start_date {$args['order']} , event_start_time {$args['order']}
54
$limit $offset
55
- ";
56
57
$results = $wpdb->get_results($sql, ARRAY_A);
58
@@ -148,5 +154,20 @@ class EM_Events extends EM_Object {
148
$EM_Event_old = $EM_Event;
149
return $output;
150
}
151
}
152
?>
41
42
//Get the default conditions
43
$conditions = self::build_sql_conditions($args);
44
//Put it all together
45
$where = ( count($conditions) > 0 ) ? " WHERE " . implode ( " AND ", $conditions ):'';
46
47
+ //Get ordering instructions
48
+ $EM_Event = new EM_Event();
49
+ $accepted_fields = $EM_Event->get_fields(true);
50
+ $orderby = self::build_sql_orderby($args, $accepted_fields, get_option('dbem_events_default_order'));
51
+ //Now, build orderby sql
52
+ $orderby_sql = ( count($orderby) > 0 ) ? 'ORDER BY '. implode(', ', $orderby) : '';
53
+
54
//Create the SQL statement and execute
55
$sql = "
56
SELECT * FROM $events_table
57
LEFT JOIN $locations_table ON {$locations_table}.location_id={$events_table}.location_id
58
$where
59
+ $orderby_sql
60
$limit $offset
61
+ ";
62
63
$results = $wpdb->get_results($sql, ARRAY_A);
64
154
$EM_Event_old = $EM_Event;
155
return $output;
156
}
157
+
158
+ /*
159
+ * Adds custom Events search defaults
160
+ * @param array $args
161
+ * @return array
162
+ * @uses EM_Object#get_default_search()
163
+ */
164
+ function get_default_search( $array = array() ){
165
+ $defaults = array(
166
+ 'limit'=>get_option('dbem_events_default_limit'),
167
+ 'orderby' => get_option('dbem_events_default_orderby'),
168
+ 'order' => get_option('dbem_events_default_order')
169
+ );
170
+ return parent::get_default_search($defaults,$array);
171
+ }
172
}
173
?>
classes/location.php CHANGED
@@ -199,12 +199,12 @@ class EM_Location extends EM_Object {
199
$match = true;
200
$replace = '';
201
switch( $result ){
202
- case '#_MAP':
203
case '#_LOCATIONMAP':
204
$replace = EM_Map::get_single( array('location' => $this) );
205
break;
206
- case '#_DESCRIPTION': //To make this backwards compatible
207
- case '#_EXCERPT':
208
case '#_LOCATIONNOTES':
209
case '#_LOCATIONEXCERPT':
210
$replace = $this->description;
@@ -215,15 +215,16 @@ class EM_Location extends EM_Object {
215
break;
216
case '#_LOCATIONURL':
217
case '#_LOCATIONLINK':
218
$joiner = (stristr(EM_URI, "?")) ? "&amp;" : "?";
219
$link = EM_URI.$joiner."location_id=".$this->id;
220
$replace = ($result == '#_LOCATIONURL') ? $link : '<a href="'.$link.'">'.$this->name.'</a>';
221
break;
222
- case '#_PASTEVENTS':
223
case '#_LOCATIONPASTEVENTS':
224
- case '#_NEXTEVENTS':
225
case '#_LOCATIONNEXTEVENTS':
226
- case '#_ALLEVENTS':
227
case '#_LOCATIONALLEVENTS':
228
if ($result == '#_PASTEVENTS' || $result == '#_LOCATIONPASTEVENTS'){ $scope = 'past'; }
229
elseif ( $result == '#_NEXTEVENTS' || $result == '#_LOCATIONNEXTEVENTS' ){ $scope = 'future'; }
@@ -237,13 +238,13 @@ class EM_Location extends EM_Object {
237
$replace = get_option('dbem_location_no_events_message');
238
}
239
break;
240
- case '#_IMAGE':
241
case '#_LOCATIONIMAGE':
242
if($this->image_url != ''){
243
$replace = "<img src='".$this->image_url."' alt='".$this->name."'/>";
244
}
245
break;
246
- case '#_NAME':
247
case '#_LOCATIONNAME':
248
$replace = $this->name;
249
break;
@@ -266,8 +267,7 @@ class EM_Location extends EM_Object {
266
}
267
}
268
$name_filter = ($target == "html") ? 'dbem_general':'dbem_general_rss';
269
- $location_string = str_replace('#_LOCATION', apply_filters($name_filter, $this->name) , $location_string );
270
- $location_string = str_replace('#_NAME', apply_filters($name_filter, $this->name) , $location_string );
271
return $location_string;
272
}
273
}
199
$match = true;
200
$replace = '';
201
switch( $result ){
202
+ case '#_MAP': //Depreciated
203
case '#_LOCATIONMAP':
204
$replace = EM_Map::get_single( array('location' => $this) );
205
break;
206
+ case '#_DESCRIPTION': //Depreciated
207
+ case '#_EXCERPT': //Depreciated
208
case '#_LOCATIONNOTES':
209
case '#_LOCATIONEXCERPT':
210
$replace = $this->description;
215
break;
216
case '#_LOCATIONURL':
217
case '#_LOCATIONLINK':
218
+ case '#_LOCATIONPAGEURL': //Depreciated
219
$joiner = (stristr(EM_URI, "?")) ? "&amp;" : "?";
220
$link = EM_URI.$joiner."location_id=".$this->id;
221
$replace = ($result == '#_LOCATIONURL') ? $link : '<a href="'.$link.'">'.$this->name.'</a>';
222
break;
223
+ case '#_PASTEVENTS': //Depreciated
224
case '#_LOCATIONPASTEVENTS':
225
+ case '#_NEXTEVENTS': //Depreciated
226
case '#_LOCATIONNEXTEVENTS':
227
+ case '#_ALLEVENTS': //Depreciated
228
case '#_LOCATIONALLEVENTS':
229
if ($result == '#_PASTEVENTS' || $result == '#_LOCATIONPASTEVENTS'){ $scope = 'past'; }
230
elseif ( $result == '#_NEXTEVENTS' || $result == '#_LOCATIONNEXTEVENTS' ){ $scope = 'future'; }
238
$replace = get_option('dbem_location_no_events_message');
239
}
240
break;
241
+ case '#_IMAGE': //Depreciated
242
case '#_LOCATIONIMAGE':
243
if($this->image_url != ''){
244
$replace = "<img src='".$this->image_url."' alt='".$this->name."'/>";
245
}
246
break;
247
+ case '#_NAME': //Depreciated
248
case '#_LOCATIONNAME':
249
$replace = $this->name;
250
break;
267
}
268
}
269
$name_filter = ($target == "html") ? 'dbem_general':'dbem_general_rss';
270
+ $location_string = str_replace('#_LOCATION', apply_filters($name_filter, $this->name) , $location_string ); //Depreciated
271
return $location_string;
272
}
273
}
classes/locations.php CHANGED
@@ -42,13 +42,20 @@ class EM_Locations extends EM_Object {
42
$fields = $locations_table .".". implode(", {$locations_table}.", array_keys($EM_Location->fields));
43
$where = ( count($conditions) > 0 ) ? " WHERE " . implode ( " AND ", $conditions ):'';
44
45
//Create the SQL statement and execute
46
$sql = "
47
SELECT $fields FROM $locations_table
48
LEFT JOIN $events_table ON {$locations_table}.location_id={$events_table}.location_id
49
$where
50
GROUP BY location_id
51
- ORDER BY location_name {$args['order']} , location_address {$args['order']}
52
$limit $offset
53
";
54
42
$fields = $locations_table .".". implode(", {$locations_table}.", array_keys($EM_Location->fields));
43
$where = ( count($conditions) > 0 ) ? " WHERE " . implode ( " AND ", $conditions ):'';
44
45
+ //Get ordering instructions
46
+ $accepted_fields = $EM_Location->get_fields(true);
47
+ $orderby = self::build_sql_orderby($args, $accepted_fields, get_option('dbem_events_default_order'));
48
+ //Now, build orderby sql
49
+ $orderby_sql = ( count($orderby) > 0 ) ? 'ORDER BY '. implode(', ', $orderby) : '';
50
+
51
+
52
//Create the SQL statement and execute
53
$sql = "
54
SELECT $fields FROM $locations_table
55
LEFT JOIN $events_table ON {$locations_table}.location_id={$events_table}.location_id
56
$where
57
GROUP BY location_id
58
+ $orderby_sql
59
$limit $offset
60
";
61
classes/object.php CHANGED
@@ -18,7 +18,8 @@ class EM_Object {
18
$super_defaults = array(
19
'limit' => false,
20
'scope' => 'future',
21
- 'order' => 'ASC',
22
'format' => '',
23
'category' => 0,
24
'location' => 0,
@@ -61,6 +62,12 @@ class EM_Object {
61
unset($array['category']);
62
}
63
}
64
//TODO validate search query array
65
//Clean the supplied array, so we only have allowed keys
66
foreach( array_keys($array) as $key){
@@ -83,11 +90,15 @@ class EM_Object {
83
}else{
84
$defaults['year'] = preg_match($year_regex, $defaults['year']) ? $defaults['year']:'';
85
}
86
//TODO should we clean format of malicious code over here and run everything thorugh this?
87
- $defaults['order'] = ($defaults['order'] == "ASC") ? "ASC" : $super_defaults['order'];
88
$defaults['array'] = ($defaults['array'] == true);
89
$defaults['limit'] = (is_numeric($defaults['limit'])) ? $defaults['limit']:$super_defaults['limit'];
90
- $defaults['limit'] = (is_numeric($defaults['limit'])) ? $defaults['limit']:$super_defaults['limit'];
91
$defaults['recurring'] = ($defaults['recurring'] == true);
92
return $defaults;
93
}
@@ -141,11 +152,17 @@ class EM_Object {
141
$date_start = date('Y-m-d', mktime(0,0,0,$date_month_start,1,$date_year_start));
142
$date_end = date('Y-m-t', mktime(0,0,0,$date_month_end,1,$date_year_end));
143
$conditions[] = " ((event_start_date BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)) OR (event_end_date BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)))";
144
- $search_by_date = true;
145
}
146
- if( !isset($search_by_date) ){
147
//No date requested, so let's look at scope
148
- if ( preg_match ( "/^[0-9]{4}-[0-9]{2}-[0-9]{2}#x2F;", $scope ) ) {
149
//Scope can also be a specific date. However, if 'day', 'month', or 'year' are set, that will take precedence
150
$conditions [] = " ( (event_start_date = CAST('$scope' AS DATE)) OR (event_start_date <= CAST('$scope' AS DATE) AND event_end_date >= CAST('$scope' AS DATE)) )";
151
} else {
@@ -185,6 +202,37 @@ class EM_Object {
185
return $conditions;
186
}
187
188
189
/**
190
* Save an array into this class.
@@ -237,6 +285,21 @@ class EM_Object {
237
}
238
return $types;
239
}
240
241
/**
242
* Sanitize text before inserting into database
18
$super_defaults = array(
19
'limit' => false,
20
'scope' => 'future',
21
+ 'order' => 'ASC', //hard-coded at end of this function
22
+ 'orderby' => false,
23
'format' => '',
24
'category' => 0,
25
'location' => 0,
62
unset($array['category']);
63
}
64
}
65
+ //OrderBy - can be a comma-seperated array of field names to order by (field names of object, not db)
66
+ if( array_key_exists('orderby', $array)){
67
+ if( preg_match('/,/', $array['orderby']) ) {
68
+ $array['orderby'] = explode(',', $array['orderby']);
69
+ }
70
+ }
71
//TODO validate search query array
72
//Clean the supplied array, so we only have allowed keys
73
foreach( array_keys($array) as $key){
90
}else{
91
$defaults['year'] = preg_match($year_regex, $defaults['year']) ? $defaults['year']:'';
92
}
93
+ //Order - it's either ASC or DESC, so let's just validate
94
+ if( preg_match('/^([A-Za-z],?)+#x2F;', $array['order']) ) {
95
+ $defaults['order'] = explode(',', $array['order']);
96
+ }elseif( !in_array($defaults['order'], array('ASC','DESC')) ){
97
+ $defaults['order'] = $super_defaults['order'];
98
+ }
99
//TODO should we clean format of malicious code over here and run everything thorugh this?
100
$defaults['array'] = ($defaults['array'] == true);
101
$defaults['limit'] = (is_numeric($defaults['limit'])) ? $defaults['limit']:$super_defaults['limit'];
102
$defaults['recurring'] = ($defaults['recurring'] == true);
103
return $defaults;
104
}
152
$date_start = date('Y-m-d', mktime(0,0,0,$date_month_start,1,$date_year_start));
153
$date_end = date('Y-m-t', mktime(0,0,0,$date_month_end,1,$date_year_end));
154
$conditions[] = " ((event_start_date BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)) OR (event_end_date BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)))";
155
+ $search_by_monthyear = true;
156
}
157
+ if( !isset($search_by_monthyear) ){
158
//No date requested, so let's look at scope
159
+ if ( preg_match ( "/^[0-9]{4}-[0-9]{2}-[0-9]{2},[0-9]{4}-[0-9]{2}-[0-9]{2}#x2F;", $scope ) ) {
160
+ //This is an array, let's split it up
161
+ $dates = explode(',', $scope);
162
+ $date_start = $dates[0];
163
+ $date_end = $dates[1];
164
+ $conditions[] = " ((event_start_date BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)) OR (event_end_date BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)))";
165
+ } elseif ( preg_match ( "/^[0-9]{4}-[0-9]{2}-[0-9]{2}#x2F;", $scope ) ) {
166
//Scope can also be a specific date. However, if 'day', 'month', or 'year' are set, that will take precedence
167
$conditions [] = " ( (event_start_date = CAST('$scope' AS DATE)) OR (event_start_date <= CAST('$scope' AS DATE) AND event_end_date >= CAST('$scope' AS DATE)) )";
168
} else {
202
return $conditions;
203
}
204
205
+ function build_sql_orderby( $args, $accepted_fields, $default_order = 'ASC' ){
206
+ //First, ORDER BY
207
+ $orderby = array();
208
+ if(is_array($args['orderby'])){
209
+ //Clean orderby array so we only have accepted values
210
+ foreach( $args['orderby'] as $key => $field ){
211
+ if( !array_key_exists($field, $accepted_fields) ){
212
+ unset($args['orderby'][$key]);
213
+ }else{
214
+ $orderby[] = $accepted_fields[$field];
215
+ }
216
+ }
217
+ }elseif( $args['orderby'] != '' && array_key_exists($args['orderby'], $accepted_fields) ){
218
+ $orderby[] = $accepted_fields[$args['orderby']];
219
+ }
220
+ //ORDER
221
+ //If order is an array, we'll go through the orderby array and match the order values (in order of array) with orderby values
222
+ //If orders don't match up, or it's not ASC/DESC, the default events search in EM settings/options page will be used.
223
+ foreach($orderby as $i => $field){
224
+ $orderby[$i] .= ' ';
225
+ if(is_array($args['order'])){
226
+ if( in_array($args['order'][$i], array('ASC','DESC')) ){
227
+ $orderby[$i] .= $args['order'][$i];
228
+ }else{
229
+ $orderby[$i] .= $default_order;
230
+ }
231
+ }else{
232
+ $orderby[$i] .= ( in_array($args['order'], array('ASC','DESC')) ) ? $args['order'] : $default_order;
233
+ }
234
+ }
235
+ }
236
237
/**
238
* Save an array into this class.
285
}
286
return $types;
287
}
288
+
289
+ function get_fields( $inverted_array=false ){
290
+ if( is_array($this->fields) ){
291
+ $return = array();
292
+ foreach($this->fields as $fieldName => $fieldArray){
293
+ if($inverted_array){
294
+ $return[$fieldArray['name']] = $fieldName;
295
+ }else{
296
+ $return[$fieldName] = $fieldArray['name'];
297
+ }
298
+ }
299
+ return $return;
300
+ }
301
+ return array();
302
+ }
303
304
/**
305
* Sanitize text before inserting into database
events-manager.php CHANGED
@@ -1,7 +1,7 @@
1
<?php
2
/*
3
Plugin Name: Events Manager
4
- Version: 3.0.4
5
Plugin URI: http://davidebenini.it/wordpress-plugins/events-manager/
6
Description: Manage events specifying precise spatial data (Location, Town, Province, etc).
7
Author: Davide Benini, Marcus Sykes
@@ -86,7 +86,7 @@ if( is_admin() ){
86
87
88
// Setting constants
89
- define('EM_VERSION', 3.04); //self expanatory
90
define('EM_CATEGORIES_TABLE', 'em_categories'); //TABLE NAME
91
define('EM_EVENTS_TABLE','em_events'); //TABLE NAME
92
define('EM_RECURRENCE_TABLE','dbem_recurrence'); //TABLE NAME
1
<?php
2
/*
3
Plugin Name: Events Manager
4
+ Version: 3.0.5
5
Plugin URI: http://davidebenini.it/wordpress-plugins/events-manager/
6
Description: Manage events specifying precise spatial data (Location, Town, Province, etc).
7
Author: Davide Benini, Marcus Sykes
86
87
88
// Setting constants
89
+ define('EM_VERSION', 3.05); //self expanatory
90
define('EM_CATEGORIES_TABLE', 'em_categories'); //TABLE NAME
91
define('EM_EVENTS_TABLE','em_events'); //TABLE NAME
92
define('EM_RECURRENCE_TABLE','dbem_recurrence'); //TABLE NAME
events.php CHANGED
@@ -16,7 +16,7 @@ function em_content($content) {
16
//TODO any loop should put the current $EM_Event etc. into the global variable
17
if ( isset( $_REQUEST['calendar_day'] ) && $_REQUEST['calendar_day'] != '' ) {
18
//Events for a specific day
19
- $events = EM_Events::get( array('limit'=>10,'scope'=>$_REQUEST['calendar_day'],'order'=>"ASC") );
20
if ( count($events) > 1 || get_option('dbem_display_calendar_day_single') == 1 ) {
21
$content = EM_Events::output($events);
22
} else {
@@ -37,7 +37,7 @@ function em_content($content) {
37
if (get_option ( 'dbem_display_calendar_in_events_page' )){
38
$content = EM_Calendar::get( array('full'=>1) );
39
}else{
40
- $content = EM_Events::output ( array('limit'=>10,'scope'=>$scope, 'order'=>"ASC") );
41
}
42
}
43
//If disable rewrite flag is on, then we need to add a placeholder here
16
//TODO any loop should put the current $EM_Event etc. into the global variable
17
if ( isset( $_REQUEST['calendar_day'] ) && $_REQUEST['calendar_day'] != '' ) {
18
//Events for a specific day
19
+ $events = EM_Events::get( array( 'scope'=>$_REQUEST['calendar_day'] ) );
20
if ( count($events) > 1 || get_option('dbem_display_calendar_day_single') == 1 ) {
21
$content = EM_Events::output($events);
22
} else {
37
if (get_option ( 'dbem_display_calendar_in_events_page' )){
38
$content = EM_Calendar::get( array('full'=>1) );
39
}else{
40
+ $content = EM_Events::output( array( 'scope' => $scope ) );
41
}
42
}
43
//If disable rewrite flag is on, then we need to add a placeholder here
install.php CHANGED
@@ -221,7 +221,10 @@ function em_add_options() {
221
'dbem_rsvp_enabled'=> true,
222
'dbem_categories_enabled'=> true,
223
'dbem_disable_title_rewrites'=> false,
224
- 'dbem_title_html' => '<h2>#_PAGETITLE</h2>'
225
);
226
227
foreach($dbem_options as $key => $value){
221
'dbem_rsvp_enabled'=> true,
222
'dbem_categories_enabled'=> true,
223
'dbem_disable_title_rewrites'=> false,
224
+ 'dbem_title_html' => '<h2>#_PAGETITLE</h2>',
225
+ 'dbem_events_default_orderby' => 'start_date',
226
+ 'dbem_events_default_order' => 'ASC',
227
+ 'dbem_events_default_limit' => 10
228
);
229
230
foreach($dbem_options as $key => $value){
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://davidebenini.it
4
Tags: events, manager, calendar, gigs, concert, maps, geotagging, rsvp
5
Requires at least: 2.9
6
Tested up to: 3.0.1
7
- Stable tag: 3.0.4
8
9
Manage events and display them in your blog. Includes recurring events, location management, calendar, Google map integration, RSVP.
10
@@ -110,6 +110,15 @@ At this stage, Events Manager is only available in English and Italian. Yet, the
110
111
== Change Log ==
112
113
= 3.0.4 =
114
* Title rewriting workaround for themes where main menus are broken on events pages
115
* Added option to show lists on calendar days regardless of whether there is only one event on that day.
4
Tags: events, manager, calendar, gigs, concert, maps, geotagging, rsvp
5
Requires at least: 2.9
6
Tested up to: 3.0.1
7
+ Stable tag: 3.0.5
8
9
Manage events and display them in your blog. Includes recurring events, location management, calendar, Google map integration, RSVP.
10
110
111
== Change Log ==
112
113
+ = 3.0.5 =
114
+ * Fixed 12pm bug
115
+ * Re-added #_LOCATIONPAGEURL (although officially it's depreciated)
116
+ * Added default order by settings in options page
117
+ * Added default event list limits in options page
118
+ * Added orderby attribute for shortcode
119
+ * scope attribute now also allows searching between dates, e.g. "2010-01-01,2010-01-31"
120
+ * Fixed booking email reporting bug
121
+
122
= 3.0.4 =
123
* Title rewriting workaround for themes where main menus are broken on events pages
124
* Added option to show lists on calendar days regardless of whether there is only one event on that day.