-
Notifications
You must be signed in to change notification settings - Fork 0
/
em-wpfc.php
executable file
·322 lines (303 loc) · 14.2 KB
/
em-wpfc.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
<?php
/**
* Integration with WP FullCalendar - http://wordpress.org/plugins/wp-fullcalendar/
* Initiallizes EM stuff by overriding some shortcodes, filters and actions in the WP FullCalendar plugin
* Admin functions are located in admin/wpfc-admin.php
*/
//overrides the ajax calls for event data
if( defined('DOING_AJAX') && DOING_AJAX && !empty($_REQUEST['type']) && $_REQUEST['type'] == EM_POST_TYPE_EVENT ){ //only needed during ajax requests anyway
remove_action('wp_ajax_WP_FullCalendar', array('WP_FullCalendar','ajax'));
remove_action('wp_ajax_nopriv_WP_FullCalendar', array('WP_FullCalendar','ajax'));
add_action('wp_ajax_WP_FullCalendar', 'wpfc_em_ajax');
add_action('wp_ajax_nopriv_WP_FullCalendar', 'wpfc_em_ajax');
}
//overrides some EM stuff with FullCalendar depending on some extra settings
if ( get_option('dbem_emfc_override_shortcode') ){
remove_shortcode('events_calendar');
add_shortcode('events_calendar', array('WP_FullCalendar','calendar'));
}
if( get_option('dbem_emfc_override_calendar') ){
add_filter ('em_content_pre', 'wpfc_em_content',10,2);
}
/**
* Replaces the event page with the FullCalendar if requested in settings
* @param unknown_type $page_content
* @return Ambigous <mixed, string>
*/
function wpfc_em_content($content = '', $page_content=''){
global $wpdb, $post;
if ( em_is_events_page() ){
$calendar_content = WP_FullCalendar::calendar();
//Now, we either replace CONTENTS or just replace the whole page
if( preg_match('/CONTENTS/', $page_content) ){
$content = str_replace('CONTENTS',$calendar_content,$page_content);
}else{
$content = $calendar_content;
}
}
return $content;
}
/**
* Adds extra non-taxonomy fields to the calendar search
* @param array $args
*/
function wpfc_em_calendar_search($args){
if( defined('EM_VERSION') && $args['type'] == 'event' ){
$country = !empty($args['country']) ? $args['country']:'';
?>
<?php if( empty($country) ): ?>
<!-- START Country Search -->
<select name="country" class="em-events-search-country wpfc-taxonomy">
<option value=''><?php echo get_option('dbem_search_form_countries_label'); ?></option>
<?php
//get the counties from locations table
global $wpdb;
$countries = em_get_countries();
$em_countries = $wpdb->get_results("SELECT DISTINCT location_country FROM ".EM_LOCATIONS_TABLE." WHERE location_country IS NOT NULL AND location_country != '' ORDER BY location_country ASC", ARRAY_N);
foreach($em_countries as $em_country):
?>
<option value="<?php echo $em_country[0]; ?>" <?php echo (!empty($country) && $country == $em_country[0]) ? 'selected="selected"':''; ?>><?php echo $countries[$em_country[0]]; ?></option>
<?php endforeach; ?>
</select>
<!-- END Country Search -->
<?php endif; ?>
<?php if( !empty($country) ): ?>
<!-- START Region Search -->
<select name="region" class="em-events-search-region wpfc-taxonomy">
<option value=''><?php echo get_option('dbem_search_form_regions_label'); ?></option>
<?php
if( !empty($country) ){
//get the counties from locations table
global $wpdb;
$em_states = $wpdb->get_results($wpdb->prepare("SELECT DISTINCT location_region FROM ".EM_LOCATIONS_TABLE." WHERE location_region IS NOT NULL AND location_region != '' AND location_country=%s ORDER BY location_region", $country), ARRAY_N);
foreach($em_states as $state){
?>
<option <?php echo (!empty($_REQUEST['region']) && $_REQUEST['region'] == $state[0]) ? 'selected="selected"':''; ?>><?php echo $state[0]; ?></option>
<?php
}
}
?>
</select>
<!-- END Region Search -->
<!-- START State/County Search -->
<select name="state" class="em-events-search-state wpfc-taxonomy">
<option value=''><?php echo get_option('dbem_search_form_states_label'); ?></option>
<?php
if( !empty($country) ){
//get the counties from locations table
global $wpdb;
$cond = !empty($_REQUEST['region']) ? $wpdb->prepare(" AND location_region=%s ", $_REQUEST['region']):'';
$em_states = $wpdb->get_results($wpdb->prepare("SELECT DISTINCT location_state FROM ".EM_LOCATIONS_TABLE." WHERE location_state IS NOT NULL AND location_state != '' AND location_country=%s $cond ORDER BY location_state", $country), ARRAY_N);
foreach($em_states as $state){
?>
<option <?php echo (!empty($_REQUEST['state']) && $_REQUEST['state'] == $state[0]) ? 'selected="selected"':''; ?>><?php echo $state[0]; ?></option>
<?php
}
}
?>
</select>
<!-- END State/County Search -->
<!-- START City Search -->
<select name="town" class="em-events-search-town wpfc-taxonomy">
<option value=''><?php echo get_option('dbem_search_form_towns_label'); ?></option>
<?php
if( !empty($country) ){
//get the counties from locations table
global $wpdb;
$cond = !empty($_REQUEST['region']) ? $wpdb->prepare(" AND location_region=%s ", $_REQUEST['region']):'';
$cond .= !empty($_REQUEST['state']) ? $wpdb->prepare(" AND location_state=%s ", $_REQUEST['state']):'';
$em_towns = $wpdb->get_results($wpdb->prepare("SELECT DISTINCT location_town FROM ".EM_LOCATIONS_TABLE." WHERE location_town IS NOT NULL AND location_town != '' AND location_country=%s $cond ORDER BY location_town", $country), ARRAY_N);
foreach($em_towns as $town){
?>
<option <?php echo (!empty($_REQUEST['town']) && $_REQUEST['town'] == $town[0]) ? 'selected="selected"':''; ?>><?php echo $town[0]; ?></option>
<?php
}
}
?>
</select>
<!-- END City Search -->
<?php endif;
}
}
//this never worked because the action was never correctly called, until we add a setting for this in the options page, uncomment the line below or paste it in your functions.php file
//add_action('wpfc_calendar_search','wpfc_em_calendar_search', 10, 1);
/**
* Replaces the normal WPFC ajax and uses the EM query system to provide event specific results.
*/
function wpfc_em_ajax() {
$_REQUEST['month'] = false; //no need for these two, they are the original month and year requested
$_REQUEST['year'] = false;
//get the month/year between the start/end dates and feed these to EM
$EM_DateTime = new EM_DateTime(substr($_REQUEST['start'],0,10));
$scope_start = $EM_DateTime->getTimestamp();
$scope_end = $EM_DateTime->modify(substr($_REQUEST['end'],0,10))->getTimestamp();
$scope_middle = $scope_start + ($scope_end - $scope_start)/2;
$month = $EM_DateTime->setTimestamp($scope_middle)->format('n');
$year = $EM_DateTime->format('Y');
$args = array ('month'=>$month, 'year'=>$year, 'owner'=>false, 'status'=>1, 'orderby'=>'event_start_time, event_name'); //since wpfc handles date sorting we only care about time and name ordering here
$args['number_of_weeks'] = 6; //WPFC always has 6 weeks
$limit = $args['limit'] = get_option('wpfc_limit',3);
$args['long_events'] = ( isset($_REQUEST['long_events']) && $_REQUEST['long_events'] == 0 ) ? 0:1; //long events are enabled, unless explicitly told not to in the shortcode
//do some corrections for EM query
if( isset($_REQUEST[EM_TAXONOMY_CATEGORY]) || empty($_REQUEST['category']) ) $_REQUEST['category'] = !empty($_REQUEST[EM_TAXONOMY_CATEGORY]) ? $_REQUEST[EM_TAXONOMY_CATEGORY]:false;
$_REQUEST['tag'] = !empty($_REQUEST[EM_TAXONOMY_TAG]) ? $_REQUEST[EM_TAXONOMY_TAG]:false;
$args = apply_filters('wpfc_fullcalendar_args', array_merge($_REQUEST, $args));
$calendar_array = EM_Calendar::get($args);
$parentArray = $events = $event_ids = $event_date_counts = $event_dates_more = $event_day_counts = array();
//get day link template
global $wp_rewrite;
if( get_option("dbem_events_page") > 0 ){
$event_page_link = get_permalink(get_option("dbem_events_page")); //PAGE URI OF EM
if( $wp_rewrite->using_permalinks() ){ $event_page_link = trailingslashit($event_page_link); }
}else{
if( $wp_rewrite->using_permalinks() ){
$event_page_link = trailingslashit(home_url()).EM_POST_TYPE_EVENT_SLUG.'/'; //don't use EM_URI here, since ajax calls this before EM_URI is defined.
}else{
$event_page_link = home_url().'?post_type='.EM_POST_TYPE_EVENT; //don't use EM_URI here, since ajax calls this before EM_URI is defined.
}
}
if( $wp_rewrite->using_permalinks() && !defined('EM_DISABLE_PERMALINKS') ){
$event_page_link .= "%s/";
}else{
$joiner = (stristr($event_page_link, "?")) ? "&" : "?";
$event_page_link .= $joiner."calendar_day=%s";
}
foreach ( $calendar_array['cells'] as $date => $cell_data ) {
if( empty($event_day_counts[$date]) ) $event_day_counts[$date] = 0;
/* @var $EM_Event EM_Event */
$orig_color = get_option('dbem_category_default_color');
foreach( $cell_data['events'] as $EM_Event ){
$color = $borderColor = $orig_color;
$textColor = '#fff';
if ( get_option('dbem_categories_enabled') && !empty ( $EM_Event->get_categories()->categories )) {
foreach($EM_Event->get_categories()->categories as $EM_Category){
/* @var $EM_Category EM_Category */
if( $EM_Category->get_color() != '' ){
$color = $borderColor = $EM_Category->get_color();
if( preg_match("/#fff(fff)?/i",$color) ){
$textColor = '#777';
$borderColor = '#ccc';
}
break;
}
}
}
if( !in_array($EM_Event->event_id, $event_ids) ){
//count events for all days this event may span
if( $EM_Event->start()->getDate() != $EM_Event->end()->getDate() ){
$EM_DateTime = $EM_Event->start()->copy();
while( $EM_DateTime <= $EM_Event->end() ){
$EM_DateTime->add('P1D');
empty($event_day_counts[$EM_DateTime->getDate()]) ? $event_day_counts[$EM_DateTime->getDate()] = 1 : $event_day_counts[$EM_DateTime->getDate()]++;
}
}else{
$event_day_counts[$date]++;
}
if( $event_day_counts[$date] <= $limit ){
$title = $EM_Event->output(get_option('dbem_emfc_full_calendar_event_format', '#_EVENTNAME'), 'raw');
$allDay = $EM_Event->event_all_day == true;
if( $allDay ){
$start_date = $EM_Event->start()->format('Y-m-d\T00:00:00');
$end_date = $EM_Event->end()->copy()->add('P1D')->format('Y-m-d\T00:00:00'); //on all day events the end date/time is next day of end date at 00:00:00 - see end attribute on http://fullcalendar.io/docs/event_data/Event_Object/
}else{
$start_date = $EM_Event->start()->format('Y-m-d\TH:i:s');
$end_date = $EM_Event->end()->format('Y-m-d\TH:i:s');
}
$event_array = array ("title" => $title, "color" => $color, 'textColor'=>$textColor, 'borderColor'=>$borderColor, "start" => $start_date, "end" => $end_date, "url" => $EM_Event->get_permalink(), 'post_id' => $EM_Event->post_id, 'event_id' => $EM_Event->event_id, 'allDay' => $allDay, 'nonce' => wp_create_nonce('wpfc_event_nonce_'.$EM_Event->event_id) );
if( $args['long_events'] == 0 ) $event_array['end'] = $event_array['start']; //if long events aren't wanted, make the end date same as start so it shows this way on the calendar
$events[] = apply_filters('wpfc_events_event', $event_array, $EM_Event);
$event_ids[] = $EM_Event->event_id;
}
}
}
if( $cell_data['events_count'] > $limit ){
$event_dates_more[$date] = 1;
$day_ending = $date."T23:59:59";
$events[] = apply_filters('wpfc_events_more', array ("title" => get_option('wpfc_limit_txt','more ...'), "color" => get_option('wpfc_limit_color','#fbbe30'), "start" => $day_ending, "url" => str_replace('%s',$date,$event_page_link), 'post_id' => 0, 'event_id' => 0 , 'className' => 'wpfc-more'), $date);
}
}
echo EM_Object::json_encode( apply_filters('wpfc_events', $events) );
die();
}
/**
* Overrides the original qtip_content function and provides Event Manager formatted event information
* @param string $content
* @return string
*/
function wpfc_em_qtip_content( $content='' ){
if( !empty($_REQUEST['event_id'] ) && !empty($_REQUEST['nonce']) && wp_verify_nonce($_REQUEST['nonce'], 'wpfc_event_nonce_'.$_REQUEST['event_id']) && trim(get_option('dbem_emfc_qtips_format')) != '' ){
global $EM_Event;
$EM_Event = em_get_event( absint($_REQUEST['event_id']) );
if( !empty($EM_Event->event_id) ){
$content = $EM_Event->output(get_option('dbem_emfc_qtips_format', '#_EXCERPT'));
}
}
return $content;
}
add_filter('wpfc_qtip_content', 'wpfc_em_qtip_content');
/**
* Changes the walker object so we can inject color values into the options
* @param array $args
* @param object $taxonomy
* @return WPFC_EM_Categories_Walker
*/
function wpmfc_em_taxonomy_args($args, $taxonomy){
if( $taxonomy->name == EM_TAXONOMY_CATEGORY ){
$args['walker'] = new WPFC_EM_Categories_Walker;
}
return $args;
}
add_filter('wpmfc_calendar_taxonomy_args', 'wpmfc_em_taxonomy_args',10,2);
/**
* Copy and alteration of the Walker_CategoryDropdown object
* @author marcus
*
*/
class WPFC_EM_Categories_Walker extends Walker {
var $tree_type = EM_TAXONOMY_CATEGORY;
var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
/**
* @see Walker::start_el()
*/
function start_el(&$output, $object, $depth = 0, $args = array(), $current_object_id = 0){
global $wpdb;
$pad = str_repeat(' ', $depth * 3);
$cat_name = apply_filters('list_cats', $object->name, $object);
$color = $wpdb->get_var('SELECT meta_value FROM '.EM_META_TABLE." WHERE object_id='{$object->term_id}' AND meta_key='category-bgcolor' LIMIT 1");
$color = ($color != '') ? $color:'#a8d144';
$output .= "<option class=\"level-$depth\" value=\"".$object->term_id."\"";
if ( $object->term_id == $args['selected'] )
$output .= ' selected="selected"';
$output .= '>';
$output .= $pad.$color.' - '.$cat_name;
if ( !empty($args['show_count']) )
$output .= ' ('. $object->count .')';
if ( !empty($args['show_last_update']) ) {
$format = 'Y-m-d';
if( !empty($object->last_update_timestamp) ){
$output .= ' ' . gmdate($format, $object->last_update_timestamp);
}
}
$output .= "</option>";
}
}
/**
* Deprecated - changed default taxonomy defenitions to EM taxonomies, not needed as automatically deduced. If you really need this, use
* add_filter('wpfc_fullcalendar_args', 'wpfc_em_fullcalendar_args');
* @param array $args
* @return array
*/
function wpfc_em_fullcalendar_args($args){
if( !empty($args['type']) && $args['type'] == 'event'){
if( !empty($args['category']) ){
$args[EM_TAXONOMY_CATEGORY] = $args['category'];
}
if( !empty($args['tag']) ){
$args[EM_TAXONOMY_TAG] = $args['tag'];
}
}
return $args;
}
if( is_admin() ){
include('admin/settings/wpfc-admin.php');
}