PluginProbe
Event Post / 5.0
Event Post v5.0
6.1.1 6.1.0 6.0.1 6.0.0 5.12.0 trunk 3.9 4.0 4.2 4.3 4.4 4.5 5.0 5.1 5.10.0 5.10.1 5.10.2 5.10.3 5.10.4 5.11.0 5.11.1 5.2 5.5 5.6 5.6.1 All 46 releases
event-post / eventpost.php

eventpost.php in Event Post 5.0, at eventpost.php

2,552 lines 102.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 Plugin Name: Event Post
4 Plugin URI: http://event-post.com
5 Description: Add calendar and/or geolocation metadata on posts. For a better experience, we recommand to use it with <a href="https://wordpress.org/plugins/shortcode-ui/" target="_blank">Shortcake (shortcode UI)</a> installed.
6 Version: 5.0.2
7 Author: N.O.U.S. Open Useful and Simple
8 Contributors: bastho, ecolosites
9 Author URI: http://avecnous.eu
10 License: GPLv2
11 Text Domain: event-post
12 Domain Path: /languages/
13 Tags: Post,posts,event,date,geolocalization,gps,widget,map,openstreetmap,EELV,calendar,agenda
14 */
15
16 global $EventPost;
17 $EventPost = new EventPost();
18
19 $EventPost_cache=array();
20
21 /**
22 * The main class where everything begins.
23 *
24 * Add calendar and/or geolocation metadata on posts
25 */
26 class EventPost {
27 const META_START = 'event_begin';
28 const META_END = 'event_end';
29 const META_COLOR = 'event_color';
30 // http://codex.wordpress.org/Geodata
31 const META_ADD = 'geo_address';
32 const META_LAT = 'geo_latitude';
33 const META_LONG = 'geo_longitude';
34
35 public $list_id;
36 public $NomDuMois;
37 public $Week;
38 public $settings;
39 public $dateformat;
40
41 public $version = '4.5';
42
43 public $map_interactions;
44 public $quick_edit_fields;
45
46 public $Shortcodes;
47
48 public function __construct() {
49 load_plugin_textdomain('event-post', false, 'event-post/languages');
50
51 add_action('widgets_init', array(&$this,'init'), 1);
52 add_action('save_post', array(&$this, 'save_postdata'));
53 add_action('admin_menu', array(&$this, 'manage_options'));
54 add_filter('dashboard_glance_items', array(&$this, 'dashboard_right_now'));
55
56 // Scripts
57 add_action( 'admin_init', array(&$this, 'editor_styles'));
58 add_action( 'admin_init', array(&$this, 'register_settings'));
59 add_action('admin_enqueue_scripts', array(&$this, 'admin_head'));
60 add_action('admin_print_scripts', array(&$this, 'admin_scripts'));
61 add_action('wp_enqueue_scripts', array(&$this, 'load_styles'));
62
63 // Single
64 add_filter('the_content', array(&$this, 'display_single'), 9999);
65 add_filter('the_title', array(&$this, 'the_title'), 9999, 2);
66 add_action('the_event', array(&$this, 'print_single'));
67 add_action('wp_head', array(&$this, 'single_header'));
68
69 // Ajax
70 add_action('wp_ajax_EventPostGetLatLong', array(&$this, 'GetLatLong'));
71 add_action('wp_ajax_EventPostHumanDate', array(&$this, 'HumanDate'));
72 add_action('wp_ajax_EventPostCalendar', array(&$this, 'ajaxcal'));
73 add_action('wp_ajax_nopriv_EventPostCalendar', array(&$this, 'ajaxcal'));
74 add_action('wp_ajax_EventPostCalendarDate', array(&$this, 'ajaxdate'));
75 add_action('wp_ajax_nopriv_EventPostCalendarDate', array(&$this, 'ajaxdate'));
76
77 // Calendar publishing
78 add_action('wp_ajax_EventPostFeed', array(&$this, 'feed'));
79 add_action('wp_ajax_nopriv_EventPostFeed', array(&$this, 'feed'));
80
81 //
82 add_filter('eventpost_list_shema',array(&$this, 'custom_shema'),10,1);
83
84 // Admin
85 add_filter('plugin_action_links_event-post/eventpost.php', array( &$this, 'settings_link' ) );
86 add_filter('plugin_row_meta', array( &$this, 'row_meta' ), 1, 4);
87
88 add_action('widgets_init', array(&$this, 'register_widgets'),1,1);
89
90 // Quick edit
91 add_action( 'bulk_edit_custom_box', array( &$this, 'bulk_edit' ), 10, 2 );
92 add_action( 'quick_edit_custom_box', array( &$this, 'quick_edit' ), 10, 2 );
93 add_action( 'admin_print_scripts-edit.php', array(&$this, 'scripts_edit') );
94 add_action( 'wp_ajax_inline-save', array(&$this, 'inline_save'), 1 );
95 add_action( 'wp_ajax_eventpost_save_bulk', array(&$this, 'save_bulkdatas') );
96 add_filter( 'eventpost_inline_field', array(&$this, 'inline_field_color'), 10, 3);
97
98 $inc_path = plugin_dir_path(__FILE__).'inc/';
99 include_once ($inc_path . 'wrappers.php');
100 include_once ($inc_path . 'widget.php');
101 include_once ($inc_path . 'widget.cal.php');
102 include_once ($inc_path . 'widget.map.php');
103 include_once ($inc_path . 'multisite.php');
104 include_once ($inc_path . 'shortcodes.php');
105 include_once ($inc_path . 'openweathermap.php');
106 include_once ($inc_path . 'children.php');
107
108 }
109
110 /**
111 * PHP4 constructor
112 */
113 public function EventPost(){
114 $this->__construct();
115 }
116
117 /**
118 * Init all variables when WP is ready
119 *
120 * @action evenpost_init
121 * @filter eventpost_default_list_shema
122 * @filter eventpost_list_shema
123 */
124 public function init(){
125 $this->META_START = 'event_begin';
126 $this->META_END = 'event_end';
127 $this->META_COLOR = 'event_color';
128 // http://codex.wordpress.org/Geodata
129 $this->META_ADD = 'geo_address';
130 $this->META_LAT = 'geo_latitude';
131 $this->META_LONG = 'geo_longitude';
132 $this->list_id = 0;
133 $this->NomDuMois = array('', __('Jan', 'event-post'), __('Feb', 'event-post'), __('Mar', 'event-post'), __('Apr', 'event-post'), __('May', 'event-post'), __('Jun', 'event-post'), __('Jul', 'event-post'), __('Aug', 'event-post'), __('Sept', 'event-post'), __('Oct', 'event-post'), __('Nov', 'event-post'), __('Dec', 'event-post'));
134 $this->Week = array(__('Sunday', 'event-post'), __('Monday', 'event-post'), __('Tuesday', 'event-post'), __('Wednesday', 'event-post'), __('Thursday', 'event-post'), __('Friday', 'event-post'), __('Saturday', 'event-post'));
135
136 $this->maps = $this->get_maps();
137 $this->settings = $this->get_settings();
138
139 do_action('evenpost_init', $this);
140
141 $this->Shortcodes = new EventPost_Shortcodes();
142
143 // Edit
144 add_action('add_meta_boxes', array(&$this, 'add_custom_box'));
145 foreach($this->settings['posttypes'] as $posttype){
146 add_filter('manage_'.$posttype.'_posts_columns', array(&$this, 'columns_head'), 2);
147 add_action('manage_'.$posttype.'_posts_custom_column', array(&$this, 'columns_content'), 10, 2);
148 }
149
150
151 if (!empty($this->settings['markpath']) && !empty($this->settings['markurl'])) {
152 $this->markpath = ABSPATH.'/'.$this->settings['markpath'];
153 $this->markurl = $this->settings['markurl'];
154 } else {
155 $this->markpath = plugin_dir_path(__FILE__) . 'markers/';
156 $this->markurl = plugins_url('/markers/', __FILE__);
157 }
158
159 $this->dateformat = str_replace(array('yy', 'mm', 'dd'), array('Y', 'm', 'd'), __('yy-mm-dd', 'event-post'));
160
161 $this->default_list_shema = apply_filters('eventpost_default_list_shema', array(
162 'container' => '
163 <%type% class="event_loop %id% %class%" id="%listid%" style="%style%" %attributes%>%list%
164 </%type%><!-- .event_loop -->',
165 'item' => '
166 <%child% class="event_item %class%" data-color="%color%">
167 <a href="%event_link%">
168 %event_thumbnail%
169 <h5>%event_title%</h5>
170 </a>
171 %event_date%
172 %event_cat%
173 %event_location%
174 %event_excerpt%
175 </%child%><!-- .event_item -->'
176 ));
177 $this->list_shema = apply_filters('eventpost_list_shema',$this->default_list_shema);
178
179 $this->map_interactions=array(
180 'DragRotate'=>__('Drag Rotate', 'event-post'),
181 'DoubleClickZoom'=>__('Double Click Zoom', 'event-post'),
182 'DragPan'=>__('Drag Pan', 'event-post'),
183 'PinchRotate'=>__('Pinch Rotate', 'event-post'),
184 'PinchZoom'=>__('Pinch Zoom', 'event-post'),
185 'KeyboardPan'=>__('Keyboard Pan', 'event-post'),
186 'KeyboardZoom'=>__('Keyboard Zoom', 'event-post'),
187 'MouseWheelZoom'=>__('Mouse Wheel Zoom', 'event-post'),
188 'DragZoom'=>__('Drag Zoom', 'event-post'),
189 );
190
191 $this->quick_edit_fields = apply_filters('eventpost_quick_edit_fields', array(
192 'event'=>array(
193 $this->META_START=>__('Begin:', 'event-post'),
194 $this->META_END=>__('End:', 'event-post'),
195 $this->META_COLOR=>__('Color:', 'event-post'),
196 ),
197 'location'=>array(
198 $this->META_ADD=>__('Address:', 'event-post'),
199 $this->META_LAT=>__('Latitude:', 'event-post'),
200 $this->META_LONG=>__('Longitude:', 'event-post'),
201 ),
202 )
203 );
204 $this->bulk_edit_fields = apply_filters('eventpost_bulk_edit_fields', array(
205 'event'=>array(
206 $this->META_COLOR=>__('Color:', 'event-post'),
207 ),
208 )
209 );
210
211 }
212
213 public function register_widgets(){
214 register_widget('EventPost_List');
215 register_widget('EventPost_Map');
216 register_widget('EventPost_Cal');
217 }
218
219 /**
220 * Usefull hexadecimal to decimal converter. Returns an array of RGB from a given hexadecimal color.
221 * @param string $color
222 * @return array $color($R, $G, $B)
223 */
224 public function hex2dec($color = '000000') {
225 $tbl_color = array();
226 if (!strstr('#', $color)){
227 $color = '#' . $color;
228 }
229 $tbl_color['R'] = hexdec(substr($color, 1, 2));
230 $tbl_color['G'] = hexdec(substr($color, 3, 2));
231 $tbl_color['B'] = hexdec(substr($color, 5, 2));
232 return $tbl_color;
233 }
234 /**
235 * Fetch all registered image sizes
236 * @global array $_wp_additional_image_sizes
237 * @return array
238 */
239 function get_thumbnail_sizes(){
240 global $_wp_additional_image_sizes;
241 $sizes = array('thumbnail', 'medium', 'large', 'full');
242 foreach(array_keys($_wp_additional_image_sizes) as $size){
243 $sizes[]=$size;
244 }
245 return $sizes;
246 }
247
248 /**
249 * Just for localization
250 */
251 private function no_use() {
252 __('Add calendar and/or geolocation metadata on posts', 'event-post');
253 __('Event Post', 'event-post');
254 }
255
256 /**
257 * Get blog settings, load and saves default settings if needed. Can be filterred using
258 *
259 * `<?php add_filter('eventpost_getsettings', 'some_function'); ?>`
260 *
261 * @action eventpost_getsettings_action
262 * @filter eventpost_getsettings
263 * @return array
264 */
265 public function get_settings() {
266 $ep_settings = get_option('ep_settings');
267 $reg_settings=false;
268 if(!is_array($ep_settings)){
269 $ep_settings = array();
270 }
271 if (!isset($ep_settings['dateformat']) || empty($ep_settings['dateformat'])) {
272 $ep_settings['dateformat'] = get_option('date_format');
273 $reg_settings=true;
274 }
275 if (!isset($ep_settings['timeformat']) || empty($ep_settings['timeformat'])) {
276 $ep_settings['timeformat'] = get_option('time_format');
277 $reg_settings=true;
278 }
279 if (!isset($ep_settings['tile']) || empty($ep_settings['tile']) || !isset($this->maps[$ep_settings['tile']])) {
280 $maps = array_keys($this->maps);
281 $ep_settings['tile'] = $this->maps[$maps[0]]['id'];
282 $reg_settings=true;
283 }
284 if(!isset($ep_settings['zoom']) || !is_numeric($ep_settings['zoom'])){
285 $ep_settings['zoom']=12;
286 $reg_settings=true;
287 }
288 if (!isset($ep_settings['cache']) || !is_numeric($ep_settings['cache'])) {
289 $ep_settings['cache'] = 0;
290 $reg_settings=true;
291 }
292 if (!isset($ep_settings['export']) || empty($ep_settings['export'])) {
293 $ep_settings['export'] = 'both';
294 $reg_settings=true;
295 }
296 if (!isset($ep_settings['dateforhumans'])) {
297 $ep_settings['dateforhumans'] = 1;
298 $reg_settings=true;
299 }
300 if (!isset($ep_settings['emptylink'])) {
301 $ep_settings['emptylink'] = 1;
302 $reg_settings=true;
303 }
304 if (!isset($ep_settings['markpath'])) {
305 $ep_settings['markpath'] = '';
306 $reg_settings=true;
307 }
308 if (!isset($ep_settings['markurl'])) {
309 $ep_settings['markurl'] = '';
310 $reg_settings=true;
311 }
312 if (!isset($ep_settings['customcss'])) {
313 $ep_settings['customcss'] = '';
314 $reg_settings=true;
315 }
316 if (!isset($ep_settings['singlepos']) || empty($ep_settings['singlepos'])) {
317 $ep_settings['singlepos'] = 'after';
318 $reg_settings=true;
319 }
320 if (!isset($ep_settings['loopicons'])) {
321 $ep_settings['loopicons'] = 1;
322 $reg_settings=true;
323 }
324 if (!isset($ep_settings['adminpos']) || empty($ep_settings['adminpos'])) {
325 $ep_settings['adminpos'] = 'side';
326 $reg_settings=true;
327 }
328 if (!isset($ep_settings['container_shema']) ) {
329 $ep_settings['container_shema'] = '';
330 $reg_settings=true;
331 }
332
333 if (!isset($ep_settings['item_shema']) ) {
334 $ep_settings['item_shema'] = '';
335 $reg_settings=true;
336 }
337
338 if(!isset($ep_settings['datepicker']) || !in_array($ep_settings['datepicker'], array('simple', 'native'))){
339 $ep_settings['datepicker']='simple';
340 $reg_settings=true;
341 }
342
343 if(!isset($ep_settings['posttypes']) || !is_array($ep_settings['posttypes'])){
344 $ep_settings['posttypes']=array('post');
345 $reg_settings=true;
346 }
347
348 do_action_ref_array('eventpost_getsettings_action', array(&$ep_settings, &$reg_settings));
349
350 //Save settings not changed
351 if($reg_settings===true){
352 update_option('ep_settings', $ep_settings);
353 }
354 return apply_filters('eventpost_getsettings', $ep_settings);
355 }
356
357 /**
358 * Checks if HTML schemas are not empty
359 * @param array $shema
360 * @return array
361 */
362 public function custom_shema($shema){
363 if(!empty($this->settings['container_shema'])){
364 $shema['container']=$this->settings['container_shema'];
365 }
366 if(!empty($this->settings['item_shema'])){
367 $shema['item']=$this->settings['item_shema'];
368 }
369 return $shema;
370 }
371
372 /**
373 * Parse the maps.json file. Custom maps can be added by using the `eventpost_getsettings` filter like the following example:
374 *
375 * ```
376 * <?php
377 * add_filter('eventpost_getsettings', 'map_function');
378 * function map_function($maps){
379 * array_push($maps, array(
380 * 'name'=>'Myt custom map',
381 * 'id'=>'custom_map',
382 * 'urls'=>array(
383 * 'http://a.customurl.org/{z}/{x}/{y}.png',
384 * 'http://b.customurl.org/{z}/{x}/{y}.png',
385 * 'http://c.customurl.org/{z}/{x}/{y}.png',
386 * )
387 * ));
388 * return $maps;
389 * }
390 * ?>
391 * ```
392 *
393 * @filter eventpost_maps
394 * @return array of map arrays ['name', 'id', 'urls']
395 */
396 public function get_maps() {
397 $maps = array();
398 $filename = plugin_dir_path(__FILE__) . 'maps.json';
399 if (is_file($filename) && (false !== $json = json_decode(file_get_contents($filename)))) {
400 // Convert objects to array to ensure retrocompatibility
401 $arrays = array();
402 foreach($json as $map){
403 $arrays[$map->id] = (array) $map;
404 }
405 $maps = apply_filters('eventpost_maps', $arrays);
406 }
407 return $maps;
408 }
409
410 /**
411 *
412 * @return array
413 */
414 public function get_colors() {
415 $colors = array();
416 if (is_dir($this->markpath)) {
417 $files = scandir($this->markpath);
418 foreach ($files as $file) {
419 if (substr($file, -4) == '.png') {
420 $colors[substr($file, 0, -4)] = $this->markurl . $file;
421 }
422 }
423 }
424 return $colors;
425 }
426
427 /**
428 *
429 * @param string $color
430 * @return sring
431 */
432 public function get_marker($color) {
433 if (is_file($this->markpath . $color . '.png')) {
434 return $this->markurl . $color . '.png';
435 }
436 return plugins_url('/markers/ffffff.png', __FILE__);
437 }
438
439 /**
440 * Enqueue CSS files
441 */
442 public function load_styles() {
443 //CSS
444 if(!empty($this->settings['customcss'])){
445 wp_enqueue_style('event-post-custom', $this->settings['customcss']);
446 }
447 elseif(is_file(get_stylesheet_directory().'/event-post.css') || is_file(get_template_directory().'/event-post.css')){
448 wp_enqueue_style('event-post-custom', get_theme_file_uri('event-post.css'));
449 }
450 else{
451 wp_register_style('event-post', plugins_url('/css/eventpost.min.css', __FILE__), false, $this->version);
452 wp_enqueue_style('event-post', plugins_url('/css/eventpost.min.css', __FILE__), false, $this->version);
453 }
454
455 // Lib scripts
456 wp_enqueue_style('openlayers', plugins_url('/css/openlayers.css', __FILE__), false, $this->version);
457 wp_enqueue_style('dashicons', includes_url('/css/dashicons.min.css'));
458 }
459 /**
460 * Enqueue Editor style
461 */
462 public function editor_styles() {
463 add_editor_style( plugins_url('/css/eventpost.min.css', __FILE__) );
464 }
465
466 /**
467 * Enqueue JS files
468 */
469 public function load_scripts($deps = array('jquery')) {
470 // JS
471 wp_enqueue_script('jquery', false, false, false, true);
472 wp_enqueue_script('event-post', plugins_url('/js/eventpost.min.js', __FILE__), $deps, $this->version, true);
473 wp_localize_script('event-post', 'eventpost_params', array(
474 'imgpath' => plugins_url('/img/', __FILE__),
475 'maptiles' => $this->maps,
476 'defaulttile' => $this->settings['tile'],
477 'zoom' => $this->settings['zoom'],
478 'ajaxurl' => admin_url() . 'admin-ajax.php',
479 'map_interactions'=>$this->map_interactions,
480 ));
481 }
482 /**
483 * Enqueue JS files for maps
484 */
485 public function load_map_scripts() {
486 // JS
487 wp_enqueue_script('openlayers', plugins_url('/js/OpenLayers.js', __FILE__), false, $this->version, true);
488 $this->load_scripts(array('jquery', 'openlayers'));
489 if(is_admin()){
490 $this->admin_scripts(array('jquery', 'openlayers'));
491 }
492 }
493
494 /**
495 * Enqueue CSS files in admin
496 */
497 public function admin_head() {
498 $page = basename($_SERVER['SCRIPT_NAME']);
499 if( $page!='post-new.php' && !($page=='post.php' && filter_input(INPUT_GET, 'action')=='edit') && !($page=='options-general.php' && filter_input(INPUT_GET, 'page')=='event-settings') ){
500 return;
501 }
502 wp_enqueue_style('openlayers', plugins_url('/css/openlayers.css', __FILE__), false, $this->version);
503 wp_enqueue_style('jquery-ui', plugins_url('/css/jquery-ui.css', __FILE__), false, $this->version);
504 wp_enqueue_style('event-post-admin', plugins_url('/css/eventpost-admin.css', __FILE__), false, $this->version);
505 }
506
507 /**
508 * Enqueue JS files in admin
509 */
510 public function admin_scripts($deps = array('jquery'), $force=false) {
511 $page = basename($_SERVER['SCRIPT_NAME']);
512 if(!$force && $page!='post-new.php' && !($page=='post.php' && filter_input(INPUT_GET, 'action')=='edit') && !($page=='options-general.php' && filter_input(INPUT_GET, 'page')=='event-settings')){
513 return;
514 }
515 wp_enqueue_script('jquery');
516 wp_enqueue_script('jquery-effects-core');
517 wp_enqueue_script('jquery-effects-shake');
518 if(!is_array($deps)){
519 $deps = array('jquery');
520 }
521 if($this->settings['datepicker']=='simple' || !is_admin() || (isset($_GET['page']) && $_GET['page']=='event-settings')){
522 wp_enqueue_script('jquery-ui-datepicker');
523 $deps[] = 'jquery-ui-datepicker';
524 }
525 wp_enqueue_script('event-post-admin', plugins_url('/js/eventpost-admin.min.js', __FILE__), $deps, $this->version, true);
526 $language = get_bloginfo('language');
527 if (strpos($language, '-') > -1) {
528 $language = strtolower(substr($language, 0, 2));
529 }
530 wp_localize_script('event-post-admin', 'eventpost', array(
531 'ajaxurl' => admin_url('admin-ajax.php'),
532 'imgpath' => plugins_url('/img/', __FILE__),
533 'date_choose' => '<span class="screen-reader-text">'.__('Choose', 'event-post').'</span><i class="dashicons dashicons-calendar-alt"></i>',
534 'date_format' => __('yy-mm-dd', 'event-post'),
535 'more_icons' => __('More icons', 'event-post'),
536 'pick_a_date'=>__('Pick a date','event-post'),
537 'use_current_location'=>__('Use my current location','event-post'),
538 'start_drag'=>__('Click to<br>drag the map<br>and change location','event-post'),
539 'empty_address'=>__('Be kind to fill a non empty address :)', 'event-post'),
540 'search'=>__('Type an address', 'event-post'),
541 'stop_drag'=>_x('Done','Stop allowing to drag the map', 'event-post'),
542 'datepickeri18n'=>array(
543 'order'=>__( '%1$s %2$s, %3$s @ %4$s:%5$s', 'event-post'),
544 'day'=>__('Day', 'event-post'),
545 'month'=>__('Month', 'event-post'),
546 'year'=>__('Day', 'event-post'),
547 'hour'=>__('Hour', 'event-post'),
548 'minute'=>__('Minute', 'event-post'),
549 'ok'=>__('OK', 'event-post'),
550 'cancel'=>__('Cancel', 'event-post'),
551 'edit'=>__('Edit', 'event-post'),
552 'months'=>$this->NomDuMois,
553 ),
554 'META_START' => $this->META_START,
555 'META_END' => $this->META_END,
556 'META_ADD' => $this->META_ADD,
557 'META_LAT' => $this->META_LAT,
558 'META_LONG' => $this->META_LONG,
559 'lang'=>$language,
560 'maptiles' => $this->maps,
561 'defaulttile' => $this->settings['tile']
562 ));
563 }
564 function scripts_edit() {
565 // load only when editing a supported post type
566 $current_post_type = isset($_GET['post_type']) ? $_GET['post_type'] : 'post';
567 if ( in_array( $current_post_type, $this->settings['posttypes'] ) ) {
568 wp_enqueue_script( 'eventpost-inline-edit', plugins_url( 'js/inline-edit.js', __FILE__ ), array( 'jquery', 'inline-edit-post' ), '', true );
569 wp_localize_script('eventpost-inline-edit', 'eventpost_inline_edit', array(
570 'quick'=>$this->quick_edit_fields,
571 'bulk'=>$this->bulk_edit_fields
572 ));
573 }
574 }
575
576 /**
577 * Add custom header meta for single events
578 */
579 public function single_header() {
580 if (is_single()) {
581 $event = $this->retreive();
582 if ($event->address != '' || ($event->lat != '' && $event->long != '')) {
583 ?>
584 <meta name="geo.placename" content="<?php echo $event->address ?>" />
585 <meta name="geo.position" content="<?php echo $event->lat ?>;<?php echo $event->long ?>" />
586 <meta name="ICBM" content="<?php echo $event->lat ?>;<?php echo $event->long ?>" />
587 <meta property="place:location:latitude" content="<?php echo $event->lat ?>" />
588 <meta property="place:location:longitude" content="<?php echo $event->long ?>" />
589 <?php
590 }
591 if ($event->start != '' && $event->end != '') {
592 ?>
593 <meta name="datetime-coverage-start" content="<?php echo date('c', $event->time_start) ?>" />
594 <meta name="datetime-coverage-end" content="<?php echo date('c', $event->time_end) ?>" />
595 <?php
596 }
597 }
598 }
599
600 /**
601 *
602 * @param type $str
603 * @return string
604 * @since 5.0.1
605 */
606 public function date_cleanup($str){
607 return trim(str_replace(array('0', ' ', ':', '-'), '', $str));
608 }
609
610 /**
611 *
612 * @param string $str
613 * @return boolean
614 */
615 public function dateisvalid($str) {
616 return is_string($str) && $this->date_cleanup($str) != '';
617 }
618
619 /**
620 *
621 * @param string $date
622 * @param string $sep
623 * @return string
624 */
625 public function parsedate($date, $sep = '') {
626 if (!empty($date)) {
627 return substr($date, 0, 10) . $sep . substr($date, 11, 8);
628 } else {
629 return '';
630 }
631 }
632
633 /**
634 *
635 * @param mixed $date
636 * @param string $format
637 * @return type
638 */
639 public function human_date($date, $format = 'l j F Y') {
640 if($this->settings['dateforhumans']){
641 if (is_numeric($date) && date('d/m/Y', $date) == date('d/m/Y')) {
642 return __('today', 'event-post');
643 } elseif (is_numeric($date) && date('d/m/Y', $date) == date('d/m/Y', strtotime('+1 day'))) {
644 return __('tomorrow', 'event-post');
645 } elseif (is_numeric($date) && date('d/m/Y', $date) == date('d/m/Y', strtotime('-1 day'))) {
646 return __('yesterday', 'event-post');
647 }
648 }
649 return date_i18n($format, $date);
650 }
651
652 /**
653 *
654 * @param timestamp $time_start
655 * @param timestamp $time_end
656 * @return string
657 */
658 public function delta_date($time_start, $time_end){
659 if(!$time_start || !$time_end){
660 return;
661 }
662
663 //Display dates
664 $dates="\t\t\t\t".'<div class="event_date" data-start="' . $this->human_date($time_start) . '" data-end="' . $this->human_date($time_end) . '">';
665 if (date('d/m/Y', $time_start) == date('d/m/Y', $time_end)) { // same day
666 $dates.= "\n\t\t\t\t\t\t\t".'<time itemprop="dtstart" datetime="' . date_i18n('c', $time_start) . '">'
667 . '<span class="date date-single">' . $this->human_date($time_end, $this->settings['dateformat']) . "</span>";
668 if (date('H:i', $time_start) != date('H:i', $time_end) && date('H:i', $time_start) != '00:00' && date('H:i', $time_end) != '00:00') {
669 $dates.=' <span class="linking_word linking_word-from">' . __('from', 'event-post') . '</span>
670 <span class="time time-start">' . date_i18n($this->settings['timeformat'], $time_start) . '</span>
671 <span class="linking_word linking_word-t">' . __('to', 'event-post') . '</span>
672 <span class="time time-end">' . date_i18n($this->settings['timeformat'], $time_end) . '</span>';
673 }
674 elseif (date('H:i', $time_start) != '00:00') {
675 $dates.=' <span class="linking_word">' . __('at', 'event-post') . '</span>
676 <time class="time time-single" itemprop="dtstart" datetime="' . date_i18n('c', $time_start) . '">' . date_i18n($this->settings['timeformat'], $time_start) . '</time>';
677 }
678 $dates.="\n\t\t\t\t\t\t\t".'</time>';
679 } else { // not same day
680 $dates.= '
681 <span class="linking_word linking_word-from">' . __('from', 'event-post') . '</span>
682 <time class="date date-start" itemprop="dtstart" datetime="' . date('c', $time_start) . '">' . $this->human_date($time_start, $this->settings['dateformat']);
683 if (date('H:i:s', $time_start) != '00:00:00' || date('H:i:s', $time_end) != '00:00:00'){
684 $dates.= ', ' . date_i18n($this->settings['timeformat'], $time_start);
685 }
686 $dates.='</time>
687 <span class="linking_word linking_word-to">' . __('to', 'event-post') . '</span>
688 <time class="date date-end" itemprop="dtend" datetime="' . date('c', $time_end) . '">' . $this->human_date($time_end, $this->settings['dateformat']);
689 if (date('H:i:s', $time_start) != '00:00:00' || date('H:i:s', $time_end) != '00:00:00') {
690 $dates.= ', ' . date_i18n($this->settings['timeformat'], $time_end);
691 }
692 $dates.='</time>';
693 }
694 $dates.="\n\t\t\t\t\t\t".'</div><!-- .event_date -->';
695 return $dates;
696 }
697
698 /**
699 *
700 * @param WP_Post object $post
701 * @param mixed $links
702 * @return string
703 */
704 public function print_date($post = null, $links = 'deprecated', $context='') {
705 $dates = '';
706 $event = $this->retreive($post);
707 if ($event->start != '' && $event->end != '') {
708
709 $dates.=$this->delta_date($event->time_start, $event->time_end);
710
711 $timezone_string = get_option('timezone_string');
712 $gmt_offset = $gmt = $this->get_gmt_offset();
713
714 if (!is_admin() && $event->time_end > current_time('timestamp') && (
715 $this->settings['export'] == 'both' ||
716 ($this->settings['export'] == 'single' && is_single() ) ||
717 ($this->settings['export'] == 'list' && !is_single() )
718 )) {
719
720 // Export event
721 $title = urlencode($post->post_title);
722 $address = urlencode($post->address);
723 $url = urlencode($post->guid);
724 $allday = ($post->time_start && $post->time_end && date('H:i:s', $post->time_start) == '00:00:00' && date('H:i:s', $post->time_end) == '00:00:00');
725 $d_s = date("Ymd", $event->time_start) . ($allday ? '' : 'T' . date("His", $event->time_start));
726 $d_e = date("Ymd", $event->time_end) . ($allday ? '' : 'T' . date("His", $event->time_end));
727 $uid = $post->ID . '-' . $post->blog_id;
728
729 // format de date ICS
730 $ics_url = add_query_arg(array(
731 't'=>$title,
732 'u'=>$uid,
733 'sd'=>$d_s,
734 'ed'=>$d_e,
735 'a'=>$address,
736 'd'=>$url,
737 'tz'=>$timezone_string,
738 'gmt'=>urlencode($gmt_offset)
739 ), plugins_url('export/ics.php', __FILE__));
740
741 // format de date Google cal
742 //$google_url = 'https://www.google.com/calendar/event?action=TEMPLATE&amp;text=' . $title . '&amp;dates=' . $d_s . 'Z/' . $d_e . 'Z&amp;details=' . $url . '&amp;ctz='.$timezone_string.'&amp;location=' . $address . '&amp;trp=false&amp;sprop=&amp;sprop=name';
743 $google_url = add_query_arg(array(
744 'action'=>'TEMPLATE',
745 'trp'=>'false',
746 'sprop'=>'name',
747 'text'=>$title,
748 'dates'=>$d_s.'Z/'.$d_e.'Z',
749 'location'=>$address,
750 'details'=>$url,
751 'ctz'=>$timezone_string,
752 'gmt'=> urlencode($gmt_offset)
753 ), 'https://www.google.com/calendar/event');
754
755 // format de date VCS
756 $vcs_url = add_query_arg(array(
757 't'=>$title,
758 'u'=>$uid,
759 'sd'=>$d_s,
760 'ed'=>$d_e,
761 'a'=>$address,
762 'd'=>$url,
763 'tz'=>$timezone_string,
764 'gmt'=>$gmt_offset
765 ), plugins_url('export/vcs.php', __FILE__));
766 $dates.='
767 <span class="eventpost-date-export">
768 <a href="' . $ics_url . '" class="event_link ics" target="_blank" title="' . __('Download ICS file', 'event-post') . '">ical</a>
769 <a href="' . $google_url . '" class="event_link gcal" target="_blank" title="' . __('Add to Google calendar', 'event-post') . '">Google</a>
770 <a href="' . $vcs_url . '" class="event_link vcs" target="_blank" title="' . __('Add to Outlook', 'event-post') . '">outlook</a>
771 <i class="dashicons-before dashicons-calendar"></i>
772 </span>';
773 }
774 }
775 return apply_filters('eventpost_printdate', $dates);
776 }
777
778 /**
779 *
780 * @param WP_Post object $post
781 * @return string
782 */
783 public function print_location($post=null, $context='') {
784 $location = '';
785 if ($post == null)
786 $post = get_post();
787 elseif (is_numeric($post)) {
788 $post = get_post($post);
789 }
790 if (!isset($post->start)) {
791 $post = $this->retreive($post);
792 }
793 $address = $post->address;
794 $lat = $post->lat;
795 $long = $post->long;
796 $color = $post->color;
797
798 if ($address != '' || ($lat != '' && $long != '')) {
799 $location.="\t\t\t\t".'<address';
800 if ($lat != '' && $long != '') {
801 $location.=' data-id="' . $post->ID . '" data-latitude="' . $lat . '" data-longitude="' . $long . '" data-marker="' . $this->get_marker($color) . '" ';
802 }
803 $location.=' itemprop="adr">'
804 . "\n\t\t\t\t\t\t\t".'<span>'
805 . "\n".$address
806 . "\n\t\t\t\t\t\t\t". '</span>';
807 if ($context=='single' && $lat != '' && $long != '') {
808 $location.="\n\t\t\t\t\t\t\t".'<a class="event_link gps dashicons-before dashicons-location-alt" href="https://www.openstreetmap.org/?lat=' . $lat.='&amp;lon=' . $long.='&amp;zoom=13" target="_blank" itemprop="geo">' . __('Map', 'event-post') . '</a>';
809 }
810 $location.="\n\t\t\t\t\t\t".'</address>';
811 }
812
813 return apply_filters('eventpost_printlocation', $location);
814 }
815
816 /**
817 *
818 * @param WP_Post object $post
819 * @return string
820 */
821 public function print_categories($post=null, $context='') {
822 if ($post == null)
823 $post = get_post();
824 elseif (is_numeric($post)) {
825 $post = get_post($post);
826 }
827 if (!isset($post->start)) {
828 $post = $this->retreive($post);
829 }
830 $cats = '';
831 $categories = $post->categories;
832 if ($categories) {
833 $cats.="\t\t\t\t".'<span class="event_category"';
834 $color = $post->color;
835 if ($color != '') {
836 $cats.=' style="color:#' . $color . '"';
837 }
838 $cats.='>';
839 foreach ($categories as $category) {
840 $cats .= $category->name . ' ';
841 }
842 $cats.='</span>';
843 }
844 return $cats;
845 }
846
847 /**
848 * Generate, return or output date event datas
849 * @param WP_Post object $post
850 * @param string $class
851 * @filter eventpost_get_single
852 * @return string
853 */
854 public function get_single($post = null, $class = '', $context='') {
855 if ($post == null) {
856 $post = $this->retreive();
857 }
858 $datas_date = $this->print_date($post, null, $context);
859 $datas_cat = $this->print_categories($post, $context);
860 $datas_loc = $this->print_location($post, $context);
861 if ($datas_date != '' || $datas_loc != '') {
862 $rgb = $this->hex2dec($post->color);
863 return '<div class="event_data ' . $class . '" style="border-left-color:#' . $post->color . ';background:rgba(' . $rgb['R'] . ',' . $rgb['G'] . ',' . $rgb['B'] . ',0.1)" itemscope itemtype="http://microformats.org/profile/hcard">'
864 . apply_filters('eventpost_get_single', $datas_date . $datas_cat . $datas_loc, $post)
865 . '</div>';
866 }
867 return '';
868 }
869
870 /**
871 * Displays dates of a gieven post
872 * @param WP_Post object $post
873 * @param string $class
874 * @return string
875 */
876 public function get_singledate($post = null, $class = '', $context='') {
877 return '<div class="event_data event_date ' . $class . '" itemscope itemtype="http://microformats.org/profile/hcard">' . "\n\t\t".$this->print_date($post, null, $context) . "\n\t\t\t\t\t".'</div><!-- .event_date -->';
878 }
879
880 /**
881 * Displays coloured terms of a given post
882 * @param WP_Post object $post
883 * @param string $class
884 * @return string
885 */
886 public function get_singlecat($post = null, $class = '', $context='') {
887 return '<div class="event_data event_category ' . $class . '" itemscope itemtype="http://microformats.org/profile/hcard">' . "\n\t\t".$this->print_categories($post, $context) . "\n\t\t\t\t\t".'</div><!-- .event_category -->';
888 }
889
890 /**
891 * Displays location of a given post
892 * @param WP_Post object $post
893 * @param string $class
894 * @return string
895 */
896 public function get_singleloc($post = null, $class = '', $context='') {
897 return '<div class="event_data event_location ' . $class . '" itemscope itemtype="http://microformats.org/profile/hcard">' . "\n\t\t".$this->print_location($post, $context) . "\n\t\t\t\t\t".'</div><!-- .event_location -->';
898 }
899
900 /**
901 * Uses `the_content` filter to add event details before or after the content of the current post
902 * @param string $content
903 * @return string
904 */
905 public function display_single($content) {
906 if (is_page() || !is_single() || is_home() || !in_the_loop() || !is_main_query()){
907 return $content;
908 }
909
910 $post = $this->retreive();
911 $eventbar = apply_filters('eventpost_contentbar', $this->get_single($post, 'event_single', 'single'), $post);
912 if($this->settings['singlepos']=='before'){
913 $content=$eventbar.$content;
914 }
915 elseif($this->settings['singlepos']=='after'){
916 $content.=$eventbar;
917 }
918 $this->load_map_scripts();
919 return $content;
920 }
921
922 /**
923 * Outputs events details (dates, geoloc, terms) of given post
924 * @param WP_Post object $post
925 * @echoes string
926 * @return void
927 */
928 public function print_single($post = null) {
929 echo $this->get_single($post);
930 }
931
932 /**
933 * Alter the post title in order to add icons if needed
934 * @param string $title
935 * @return string
936 */
937 public function the_title($title, $post_id = null){
938 if(!$post_id || !in_the_loop() || !$this->settings['loopicons']){
939 return $title;
940 }
941 $icons_ = array(
942 // Emojis
943 1=>array('🗓', '🗺'),
944 // Dashicons
945 2=>array('<span class="dashicons dashicons-calendar"></span>', '<span class="dashicons dashicons-location"></span>'),
946 );
947
948 $event = $this->retreive($post_id);
949 if(!empty($event->start)){
950 $title .= ' '.$icons_[$this->settings['loopicons']][0];
951 }
952 if(!empty($event->lat) && !empty($event->long)){
953 $title .= ' '.$icons_[$this->settings['loopicons']][1];
954 }
955 return $title;
956 }
957
958
959 /**
960 * Return an HTML list of events
961 *
962 * @filter eventpost_params($defaults, 'list_events')
963 * @filter eventpost_listevents
964 * @filter eventpost_item_scheme_entities
965 * @filter eventpost_item_scheme_values
966 *
967 * @param array $atts
968 * @param string $id
969 * @param string $context
970 * @return string
971 */
972 public function list_events($atts, $id = 'event_list', $context='') {
973 $ep_settings = $this->settings;
974 $defaults = array(
975 'nb' => 0,
976 'type' => 'div',
977 'future' => true,
978 'past' => false,
979 'geo' => 0,
980 'width' => '',
981 'height' => '',
982 'zoom' => '',
983 'tile' => $ep_settings['tile'],
984 'title' => '',
985 'before_title' => '<h3>',
986 'after_title' => '</h3>',
987 'cat' => '',
988 'tag' => '',
989 'events' => '',
990 'style' => '',
991 'thumbnail' => '',
992 'thumbnail_size' => '',
993 'excerpt' => '',
994 'orderby' => 'meta_value',
995 'order' => 'ASC',
996 'class' => '',
997 'container_schema' => $this->list_shema['container'],
998 'item_schema' => $this->list_shema['item'],
999 );
1000 // Map UI options
1001 foreach($this->map_interactions as $int_key=>$int_name){
1002 $defaults[$int_key]=true;
1003 }
1004 $atts = shortcode_atts(apply_filters('eventpost_params', $defaults, 'list_events'), $atts);
1005
1006 extract($atts);
1007 if (!is_array($events)) {
1008 $events = $this->get_events($atts);
1009 }
1010 $ret = '';
1011 $this->list_id++;
1012 if (sizeof($events) > 0) {
1013 if (!empty($title)) {
1014 $ret.= html_entity_decode($before_title) . $title . html_entity_decode($after_title);
1015 }
1016
1017 $child = ($type == 'ol' || $type == 'ul') ? 'li' : 'div';
1018
1019 $list = '';
1020
1021 if($id=='event_geolist'){
1022 $this->load_map_scripts();
1023 $list.=sprintf('<%1$s class="event_geolist_icon_loader"><p><span class="dashicons dashicons-location-alt"></span></p><p class="screen-reader-text">'.__('An events map', 'event-post').'</p></%1$s>', $type);
1024 }
1025
1026 foreach ($events as $event) {
1027 $class_item = ($event->time_end >= current_time('timestamp')) ? 'event_future' : 'event_past';
1028 if ($ep_settings['emptylink'] == 0 && empty($event->post_content)) {
1029 $event->permalink = '#' . $id . $this->list_id;
1030 }
1031 elseif(empty($ob->permalink)){
1032 $event->permalink=$event->guid;
1033 }
1034 $list.=str_replace(
1035 apply_filters('eventpost_item_scheme_entities', array(
1036 '%child%',
1037 '%class%',
1038 '%color%',
1039 '%event_link%',
1040 '%event_thumbnail%',
1041 '%event_title%',
1042 '%event_date%',
1043 '%event_cat%',
1044 '%event_location%',
1045 '%event_excerpt%'
1046 )), apply_filters('eventpost_item_scheme_values', array(
1047 $child,
1048 $class_item,
1049 $event->color,
1050 $event->permalink,
1051 $thumbnail == true ? '<span class="event_thumbnail_wrap">' . get_the_post_thumbnail($event->root_ID, !empty($thumbnail_size) ? $thumbnail_size : 'thumbnail', array('class' => 'attachment-thumbnail wp-post-image event_thumbnail')) . '</span>' : '',
1052 $event->post_title,
1053 $this->get_singledate($event, '', $context),
1054 $this->get_singlecat($event, '', $context),
1055 $this->get_singleloc($event, '', $context),
1056 $excerpt == true && $event->post_excerpt!='' ? '<span class="event_exerpt">'.$event->post_excerpt.'</span>' : '',
1057 ), $event), $item_schema
1058 );
1059 }
1060 $attributes = '';
1061 if($id == 'event_geolist'){
1062 $attributes = 'data-tile="'.$tile.'" data-width="'.$width.'" data-height="'.$height.'" data-zoom="'.$zoom.'" data-disabled-interactions="';
1063 foreach($this->map_interactions as $int_key=>$int_name){
1064 $attributes.=$atts[$int_key]==false ? $int_key.', ' : '';
1065 }
1066 $attributes.='"';
1067 }
1068 $ret.=str_replace(
1069 array(
1070 '%type%',
1071 '%id%',
1072 '%class%',
1073 '%listid%',
1074 '%style%',
1075 '%attributes%',
1076 '%list%'
1077 ), array(
1078 $type,
1079 $id,
1080 $class,
1081 $id . $this->list_id,
1082 (!empty($width) ? 'width:' . $width . ';' : '') . (!empty($height) ? 'height:' . $height . ';' : '') . $style,
1083 $attributes,
1084 $list
1085 ), $container_schema
1086 );
1087 }
1088 elseif(filter_input(INPUT_POST, 'action')=='bulk_do_shortcode'){
1089 return '<div class="event_geolist_icon_loader"><p><span class="dashicons dashicons-calendar"></span></p><p class="screen-reader-text">'.__('An empty list of events', 'event-post').'</p></div>';
1090 }
1091 return apply_filters('eventpost_listevents', $ret, $id.$this->list_id, $atts, $events, $context);
1092 }
1093
1094 /**
1095 * get_events
1096 * @param array $atts
1097 * @filter eventpost_params
1098 * @filter eventpost_get_items
1099 * @return array of post_ids wich are events
1100 */
1101 public function get_events($atts) {
1102 $requete = (shortcode_atts(apply_filters('eventpost_params', array(
1103 'nb' => 5,
1104 'future' => true,
1105 'past' => false,
1106 'geo' => 0,
1107 'cat' => '',
1108 'tag' => '',
1109 'date' => '',
1110 'orderby' => 'meta_value',
1111 'orderbykey' => $this->META_START,
1112 'order' => 'ASC',
1113 'tax_name' => '',
1114 'tax_term' => '',
1115 'post_type'=> $this->settings['posttypes']
1116 ), 'get_events'), $atts));
1117 extract($requete);
1118 wp_reset_query();
1119
1120 $arg = array(
1121 'post_type' => $post_type,
1122 'posts_per_page' => $nb,
1123 'meta_key' => $orderbykey,
1124 'orderby' => $orderby,
1125 'order' => $order
1126 );
1127
1128 if($tax_name=='category'){
1129 $tax_name='';
1130 $cat=$tax_term;
1131 }
1132 elseif($tax_name=='post-tag'){
1133 $tax_name='';
1134 $tag=$tax_term;
1135 }
1136
1137 // CUSTOM TAXONOMY
1138 if ($tax_name != '' && $tax_term != '') {
1139 $arg[$tax_name] = $tax_term;
1140 }
1141 // CAT
1142 if ($cat != '') {
1143 if (preg_match('/[a-zA-Z]/i', $cat)) {
1144 $arg['category_name'] = $cat;
1145 } else {
1146 $arg['cat'] = $cat;
1147 }
1148 }
1149 // TAG
1150 if ($tag != '') {
1151 $arg['tag'] = $tag;
1152 }
1153 // DATES
1154 $meta_query = array(
1155 array(
1156 'key' => $this->META_END,
1157 'value' => '',
1158 'compare' => '!='
1159 ),
1160 array(
1161 'key' => $this->META_END,
1162 'value' => '0:0:00 0:',
1163 'compare' => '!='
1164 ),
1165 array(
1166 'key' => $this->META_END,
1167 'value' => ':00',
1168 'compare' => '!='
1169 ),
1170 array(
1171 'key' => $this->META_START,
1172 'value' => '',
1173 'compare' => '!='
1174 ),
1175 array(
1176 'key' => $this->META_START,
1177 'value' => '0:0:00 0:',
1178 'compare' => '!='
1179 )
1180 );
1181 if ($future == 0 && $past == 0) {
1182 $meta_query = array();
1183 $arg['meta_key'] = null;
1184 $arg['orderby'] = null;
1185 $arg['order'] = null;
1186 } elseif ($future == 1 && $past == 0) {
1187 $meta_query[] = array(
1188 'key' => $this->META_END,
1189 'value' => current_time('mysql'),
1190 'compare' => '>=',
1191 //'type'=>'DATETIME'
1192 );
1193 } elseif ($future == 0 && $past == 1) {
1194 $meta_query[] = array(
1195 'key' => $this->META_END,
1196 'value' => current_time('mysql'),
1197 'compare' => '<=',
1198 //'type'=>'DATETIME'
1199 );
1200 }
1201 if ($date != '') {
1202 $date = date('Y-m-d', $date);
1203
1204 $meta_query = array(
1205 array(
1206 'key' => $this->META_END,
1207 'value' => $date . ' 00:00:00',
1208 'compare' => '>=',
1209 'type' => 'DATETIME'
1210 ),
1211 array(
1212 'key' => $this->META_START,
1213 'value' => $date . ' 23:59:59',
1214 'compare' => '<=',
1215 'type' => 'DATETIME'
1216 )
1217 );
1218 }
1219 // GEO
1220 if ($geo == 1) {
1221 $meta_query[] = array(
1222 'key' => $this->META_LAT,
1223 'value' => '',
1224 'compare' => '!='
1225 );
1226 $meta_query[] = array(
1227 'key' => $this->META_LONG,
1228 'value' => '',
1229 'compare' => '!='
1230 );
1231 $arg['meta_key'] = $this->META_LAT;
1232 $arg['orderby'] = 'meta_value';
1233 $arg['order'] = 'DESC';
1234 }
1235
1236 $arg['meta_query'] = $meta_query;
1237
1238 $query_md5 = 'eventpost_' . md5(var_export($requete, true));
1239 // Check if cache is activated
1240 if ($this->settings['cache'] == 1 && false !== ( $cached_events = get_transient($query_md5) )) {
1241 return apply_filters('eventpost_get_items', is_array($cached_events) ? $cached_events : array(), $requete, $arg);
1242 }
1243
1244 $events = apply_filters('eventpost_get', '', $requete, $arg);
1245 if ('' === $events) {
1246 global $wpdb;
1247 $query = new WP_Query($arg);
1248 $events = $wpdb->get_col($query->request);
1249 foreach ($events as $k => $post) {
1250 $event = $this->retreive($post);
1251 $events[$k] = $event;
1252 }
1253 }
1254 if ($this->settings['cache'] == 1){
1255 set_transient($query_md5, $events, 5 * MINUTE_IN_SECONDS);
1256 }
1257 return apply_filters('eventpost_get_items', $events, $requete, $arg);
1258 }
1259
1260 /**
1261 *
1262 * @param object $event
1263 * @return object
1264 */
1265 public function retreive($event = null) {
1266 global $EventPost_cache;
1267 $ob = get_post($event);
1268 if($ob->start){
1269 return $ob;
1270 }
1271 if(isset($EventPost_cache[$ob->ID])){
1272 return $EventPost_cache[$ob->ID];
1273 }
1274 $ob->start = get_post_meta($ob->ID, $this->META_START, true);
1275 $ob->end = get_post_meta($ob->ID, $this->META_END, true);
1276 if (!$this->dateisvalid($ob->start)){
1277 $ob->start = '';
1278 }
1279 if (!$this->dateisvalid($ob->end)){
1280 $ob->end = '';
1281 }
1282 $ob->root_ID = $ob->ID;
1283 $ob->time_start = !empty($ob->start) ? strtotime($ob->start) : '';
1284 $ob->time_end = !empty($ob->end) ? strtotime($ob->end) : '';
1285 $ob->address = get_post_meta($ob->ID, $this->META_ADD, true);
1286 $ob->lat = get_post_meta($ob->ID, $this->META_LAT, true);
1287 $ob->long = get_post_meta($ob->ID, $this->META_LONG, true);
1288 $ob->color = get_post_meta($ob->ID, $this->META_COLOR, true);
1289 $ob->categories = get_the_category($ob->ID);
1290 $ob->permalink = get_permalink($ob->ID);
1291 $ob->blog_id = get_current_blog_id();
1292 if ($ob->color == ''){
1293 $ob->color = '000000';
1294 }
1295
1296 $EventPost_cache[$ob->ID] = apply_filters('eventpost_retreive', $ob);
1297 return $EventPost_cache[$ob->ID];
1298 }
1299
1300 /**
1301 *
1302 * @param mixte $_term
1303 * @param string $taxonomy
1304 * @param string $post_type
1305 */
1306 public function retreive_term($_term=null, $taxonomy='category', $post_type='post') {
1307 $term = get_term($_term, $taxonomy);
1308
1309 if(!$term){
1310 return $term;
1311 }
1312
1313 $term->start = $term->end = $term->time_start = $term->time_end = Null;
1314
1315 $request = array(
1316 'post_type'=>$post_type,
1317 'tax_name'=>$term->taxonomy,
1318 'tax_term'=>$term->slug,
1319 'future'=>true,
1320 'past'=>true,
1321 'nb'=>-1,
1322 'order'=>'ASC'
1323 );
1324
1325 $events = $this->get_events($request);
1326
1327 $term->events_count = count($events);
1328 if($term->events_count){
1329 $term->start = $events[0]->start;
1330 $term->time_start = $events[0]->time_start;
1331 $term->end = $events[$term->events_count-1]->end;
1332 $term->time_end = $events[$term->events_count-1]->time_end;
1333 }
1334
1335 $request['order']='DESC';
1336 $request['nb']=1;
1337 $request['orderbykey']=$this->META_END;
1338 $events = $this->get_events($request);
1339 if(count($events)){
1340 $term->end = $events[0]->end;
1341 $term->time_end = $events[0]->time_end;
1342 }
1343
1344 return $term;
1345
1346 }
1347
1348 /** ADMIN ISSUES * */
1349
1350 /**
1351 * add custom boxes in posts edit page
1352 */
1353 public function add_custom_box() {
1354 foreach($this->settings['posttypes'] as $posttype){
1355 add_meta_box('event_post_date', __('Event date', 'event-post'), array(&$this, 'inner_custom_box_date'), $posttype, apply_filters('eventpost_add_custom_box_position', $this->settings['adminpos'], $posttype), 'core');
1356 add_meta_box('event_post_loc', __('Location', 'event-post'), array(&$this, 'inner_custom_box_loc'), $posttype, apply_filters('eventpost_add_custom_box_position', $this->settings['adminpos'], $posttype), 'core');
1357 do_action('eventpost_add_custom_box', $posttype);
1358 }
1359 if(!function_exists('shortcode_ui_register_for_shortcode')){
1360 add_meta_box('event_post_sc_edit', __('Events Shortcode editor', 'event-post'), array(&$this, 'inner_custom_box_edit'), 'page');
1361 }
1362 }
1363 /**
1364 * display the date custom box
1365 */
1366 public function inner_custom_box_date() {
1367 wp_nonce_field(plugin_basename(__FILE__), 'eventpost_nonce');
1368 $post_id = get_the_ID();
1369 $event = $this->retreive($post_id);
1370 $start_date = $event->start;
1371 $end_date = $event->end;
1372 $eventcolor = $event->color;
1373
1374 $language = get_bloginfo('language');
1375 if (strpos($language, '-') > -1) {
1376 $language = strtolower(substr($language, 0, 2));
1377 }
1378 $colors = $this->get_colors();
1379 ?>
1380
1381 <div class="eventpost-misc-pub-section">
1382 <p>
1383 <label>
1384 <input type="checkbox" id="event-post-date-all-day" <?php checked( $event->time_start && $event->time_end && date('H:i:s', $event->time_start) == '00:00:00' && date('H:i:s', $event->time_end) == '00:00:00', true, true); ?>>
1385 <?php _e('All day event', 'event-post') ?>
1386 </label>
1387 </p>
1388 <p>
1389 <span class="dashicons dashicons-calendar eventpost-edit-icon"></span>
1390 <label for="<?php echo $this->META_START; ?>_date">
1391 <?php _e('Begin:', 'event-post') ?>
1392 <span id="<?php echo $this->META_START; ?>_date_human" class="human_date">
1393 <?php
1394 if ($event->time_start != '') {
1395 echo $this->human_date($event->time_start) . (date('H:i', $event->time_start)=='00:00'?'':date(' H:i', $event->time_start));
1396 }
1397 else{
1398 _e('Pick a date','event-post');
1399 }
1400 ?>
1401 </span>
1402 <input type="<?php echo ($this->settings['datepicker']=='browser'?'datetime':''); ?>" class="eventpost-datepicker-<?php echo $this->settings['datepicker']; ?>" data-lang="<?php echo $language; ?>" value="<?php echo substr($start_date,0,16) ?>" name="<?php echo $this->META_START; ?>" id="<?php echo $this->META_START; ?>_date"/>
1403 </label>
1404 </p>
1405 <p>
1406 <span class="dashicons dashicons-calendar eventpost-edit-icon"></span>
1407 <label for="<?php echo $this->META_END; ?>_date">
1408 <?php _e('End:', 'event-post') ?>
1409 <span id="<?php echo $this->META_END; ?>_date_human" class="human_date">
1410 <?php
1411 if ($event->time_start != '') {
1412 echo $this->human_date($event->time_end) . (date('H:i', $event->time_end)=='00:00'?'':date(' H:i', $event->time_end));
1413 }
1414 else{
1415 _e('Pick a date','event-post');
1416 }
1417 ?>
1418 </span>
1419 <input type="<?php echo ($this->settings['datepicker']=='browser'?'datetime':''); ?>" class="eventpost-datepicker-<?php echo $this->settings['datepicker']; ?>" data-lang="<?php echo $language; ?>" value ="<?php echo substr($end_date,0,16) ?>" name="<?php echo $this->META_END; ?>" id="<?php echo $this->META_END; ?>_date"/>
1420 </label>
1421 </p>
1422 </div>
1423 <?php if (sizeof($colors) > 0): ?>
1424 <div class="eventpost-misc-pub-section event-color-section">
1425 <span class="screen-reader-text"><?php _e('Color:', 'event-post'); ?></span><?php echo $key_color; ?>
1426 <p>
1427 <img src="<?php echo $this->markurl.$eventcolor.'.png'; ?>" id="eventpost-color-preview" data-url="<?php echo $this->markurl; ?>">
1428 <span id="eventpost-color-dropdown">
1429 <?php foreach ($colors as $color => $file): ?>
1430 <label style="background:#<?php echo $color ?>" for="<?php echo $this->META_COLOR; ?><?php echo $color ?>" title="<?php echo $file; ?>">
1431 <img src="<?php echo $this->markurl.$color.'.png'; ?>">
1432 <input type="radio" value ="<?php echo $color ?>" name="<?php echo $this->META_COLOR; ?>" id="<?php echo $this->META_COLOR; ?><?php echo $color ?>" <?php checked($eventcolor, $color, true); ?>/>
1433 </label>
1434 <?php endforeach; ?>
1435 </span>
1436 </p>
1437 </div>
1438 <?php endif; ?>
1439 <?php
1440 do_action ('eventpost_custom_box_date', $event);
1441 }
1442 /**
1443 * displays the location custom box
1444 */
1445 public function inner_custom_box_loc($post) {
1446 $event = $this->retreive($post);
1447 ?>
1448
1449 <div class="eventpost-misc-pub-section">
1450 <label for="<?php echo $this->META_ADD; ?>">
1451 <?php _e('Address, as it will be displayed:', 'event-post') ?>
1452 <textarea name="<?php echo $this->META_ADD; ?>" id="<?php echo $this->META_ADD; ?>" class="widefat"><?php echo $event->address; ?></textarea>
1453 </label>
1454 </div>
1455
1456 <div id="event_address_searchwrap">
1457 <span class="dashicons dashicons-location eventpost-edit-icon"></span>
1458 <?php _e('GPS coordinates:', 'event-post') ?>
1459 <a id="event_address_search" title="<?php _e('Search or fill exact coordinates', 'event-post') ?>">
1460 <?php _e('Search / Edit', 'event-post') ?>
1461 </a>
1462
1463 <div class="misc-pub-section" id="event_address_coords">
1464 <p>
1465 <span id="eventaddress_result"></span>
1466 </p>
1467 <label for="<?php echo $this->META_LAT; ?>">
1468 <?php _e('Latitude:', 'event-post') ?>
1469 <input type="text" value ="<?php echo $event->lat; ?>" name="<?php echo $this->META_LAT; ?>" id="<?php echo $this->META_LAT; ?>" class="widefat"/>
1470 </label>
1471
1472 <label for="<?php echo $this->META_LONG; ?>">
1473 <?php _e('Longitude:', 'event-post') ?>
1474 <input type="text" value ="<?php echo $event->long; ?>" name="<?php echo $this->META_LONG; ?>" id="<?php echo $this->META_LONG; ?>" class="widefat"/>
1475 </label>
1476 <p>
1477 <a id="event_address_unsearch" class="button button-small">
1478 <span class="dashicons dashicons-yes"></span>
1479 <?php _e('Done', 'event-post') ?>
1480 </a>
1481 </p>
1482 </div>
1483 </div>
1484
1485 <div class="eventpost-misc-pub-section">
1486 <div id="event-post-map-preview" data-marker="<?php echo $this->get_marker($event->color); ?>"></div>
1487 </div>
1488 <?php
1489 do_action ('eventpost_custom_box_loc', $event);
1490 $this->load_map_scripts();
1491 }
1492
1493 /**
1494 * display custombox containing shortcode wizard
1495 */
1496 public function inner_custom_box_edit() {
1497 $ep_settings = $this->settings;
1498 ?>
1499 <?php do_action('before_eventpost_generator'); ?>
1500 <div class="all">
1501 <p>
1502 <label for="ep_sce_type"><?php _e('Type :', 'event-post'); ?>
1503 <select id="ep_sce_type">
1504 <option value='list'><?php _e('List', 'event-post') ?></option>
1505 <option value='map'><?php _e('Map', 'event-post') ?></option>
1506 </select>
1507 </label>
1508 </p>
1509
1510 <p>
1511 <label for="ep_sce_nb"><?php _e('Number of posts', 'event-post'); ?>
1512 <input id="ep_sce_nb" type="number" value="5" data-att="nb"/>
1513 <a class="button" id="ep_sce_nball"><?php _e('All', 'event-post'); ?></a>
1514 </label>
1515 </p>
1516
1517 <p>
1518 <label for="ep_sce_cat"><?php _e('Only in :', 'event-post'); ?>
1519 <select id="ep_sce_cat" data-att="cat">
1520 <option value=''><?php _e('All', 'event-post') ?></option>
1521 <?php
1522 $cats = get_categories();
1523 foreach ($cats as $cat) {
1524 ?>
1525 <option value="<?php echo $cat->slug; ?>" <?php
1526 if ($cat->slug == $eventpost_cat) {
1527 echo'selected';
1528 }
1529 ?>><?php echo $cat->cat_name; ?></option>
1530 <?php } ?>
1531 </select>
1532 </label>
1533 </p>
1534
1535 <p>
1536 <label for="ep_sce_future"><?php _e('Future events:', 'event-post'); ?>
1537 <select id="ep_sce_future" data-att="future">
1538 <option value='1'><?php _e('Yes', 'event-post') ?></option>
1539 <option value='0'><?php _e('No', 'event-post') ?></option>
1540 </select>
1541 </label>
1542 <label for="ep_sce_past"><?php _e('Past events:', 'event-post'); ?>
1543 <select id="ep_sce_past" data-att="past">
1544 <option value='0'><?php _e('No', 'event-post') ?></option>
1545 <option value='1'><?php _e('Yes', 'event-post') ?></option>
1546 </select>
1547 </label>
1548 </p>
1549
1550 <div id="ep_sce_listonly" class="list">
1551 <p>
1552 <label for="ep_sce_geo"><?php _e('Only geotagged events:', 'event-post'); ?>
1553 <select id="ep_sce_geo" data-att="geo">
1554 <option value='0'><?php _e('No', 'event-post') ?></option>
1555 <option value='1'><?php _e('Yes', 'event-post') ?></option>
1556 </select>
1557 </label>
1558 </p>
1559 </div>
1560 <div id="ep_sce_maponly" class="map">
1561 <p>
1562 <label for="ep_sce_tile"><?php _e('Map background', 'event-post'); ?>
1563 <select id="ep_sce_tile" data-att="tile">
1564 <?php foreach ($this->maps as $map): ?>
1565 <option value="<?php
1566 if ($ep_settings['tile'] != $map['id']) {
1567 echo $map['id'];
1568 }
1569 ?>" <?php selected($ep_settings['tile'], $map['id'], true); ?>>
1570 <?php echo $map['name']; ?><?php
1571 if ($ep_settings['tile'] == $map['id']) {
1572 echo' (default)';
1573 }
1574 ?>
1575 </option>
1576 <?php endforeach; ?>
1577 </select>
1578 </label>
1579 </p>
1580 <p>
1581 <label for="ep_sce_width"><?php _e('Width', 'event-post'); ?>
1582 <input id="ep_sce_width" type="text" value="500px" data-att="width"/>
1583 </label>
1584 </p>
1585 <p>
1586 <label for="ep_sce_height"><?php _e('Height', 'event-post'); ?>
1587 <input id="ep_sce_height" type="text" value="500px" data-att="height"/>
1588 </label>
1589 </p>
1590 </div>
1591 <?php do_action('after_eventpost_generator'); ?>
1592 <div id="ep_sce_shortcode">[event_list]</div>
1593 <a class="button" id="ep_sce_submit"><?php _e('Insert shortcode', 'event-post'); ?></a>
1594 </div>
1595 <script>
1596 var IEbof = false;
1597 </script>
1598 <!--[if lt IE 9]>
1599 <script>IEbof=true;</script>
1600 <![endif]-->
1601 <?php
1602 }
1603
1604 /**
1605 *
1606 * @param string $column_name
1607 * @param boolean $bulk
1608 */
1609 function quick_edit( $column_name, $post_type, $bulk=false) {
1610
1611 if ($bulk) {
1612 static $eventpostprintNonceBulk = TRUE;
1613 if ($eventpostprintNonceBulk) {
1614 $eventpostprintNonceBulk = FALSE;
1615 }
1616 $fields = $this->bulk_edit_fields;
1617 echo '<input type="hidden" name="eventpost-bulk-editor" id="eventpost-bulk-editor" value="eventpost-bulk-editor">';
1618 }
1619 else {
1620 static $eventpostprintNonce = TRUE;
1621 if ($eventpostprintNonce) {
1622 $eventpostprintNonce = FALSE;
1623 }
1624 $fields = $this->quick_edit_fields;
1625 }
1626 wp_nonce_field(plugin_basename(__FILE__), 'eventpost_nonce');
1627 if(isset($fields[$column_name])): ?>
1628 <fieldset class="inline-edit-col-left inline-edit-<?php echo $column_name; ?>">
1629 <div class="inline-edit-group">
1630 <?php foreach ($fields[$column_name] as $fieldname=>$fieldlabel): ?>
1631 <fieldset class="inline-edit-col inline-edit-<?php echo $fieldname; ?>">
1632 <div class="inline-edit-col column-<?php echo $fieldname; ?>">
1633 <label class="inline-edit-group">
1634 <span class="title"><?php echo $fieldlabel; ?></span>
1635 <span class="input-text-wrap">
1636 <?php echo $this->inline_field($fieldname, $bulk); ?>
1637 </span>
1638 </label>
1639 </div>
1640 </fieldset>
1641 <?php endforeach; ?>
1642 </div>
1643 </fieldset>
1644 <?php endif;
1645 }
1646
1647 /**
1648 *
1649 * @param type $fieldname
1650 * @return type
1651 */
1652 function inline_field($fieldname, $bulk){
1653 return apply_filters('eventpost_inline_field', '<input name="'.$fieldname.'" class="eventpost-inline-'.$fieldname.'" value="" type="text">', $fieldname, $bulk);
1654 }
1655
1656 function inline_field_color($html, $fieldname, $bulk){
1657 if($fieldname==$this->META_COLOR){
1658 $colors = $this->get_colors();
1659 $html='';
1660 if($bulk){
1661 $html.= '<span class="eventpost-bulk-colorpicker-button link">'.__('No Change', 'event-post').'</span>';
1662 }
1663 $html .= '<select name="'.$fieldname.'" class="eventpost-inline-colorpicker eventpost-inline-'.$fieldname.' '.($bulk?'is-bulk':'no-bulk').'" >';
1664 if($bulk){
1665 $html.='<option value="false">— '.__('No Change', 'event-post').' —</option>';
1666 }
1667 foreach ($colors as $color=>$image_path){
1668 $html.='<option value="'.$color.'" data-path="'.$image_path.'">'.$color.'</option>';
1669 }
1670 $html.= '</select>';
1671 }
1672 return $html;
1673 }
1674
1675 /**
1676 *
1677 * @param type $column_name
1678 * @param type $post_type
1679 */
1680 function bulk_edit($column_name, $post_type){
1681 $this->quick_edit($column_name, $post_type, true);
1682 }
1683
1684 /**
1685 *
1686 */
1687 function inline_save(){
1688 $post_id = filter_input(INPUT_POST, 'post_ID', FILTER_SANITIZE_NUMBER_INT);
1689 $this->save_postdata($post_id);
1690 }
1691 /**
1692 * When the post is saved, saves our custom data
1693 * @param int $post_id
1694 * @return void
1695 */
1696 public function save_postdata($post_id) {
1697 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
1698 return;
1699 }
1700
1701 if (!wp_verify_nonce(filter_input(INPUT_POST, 'eventpost_nonce', FILTER_SANITIZE_STRING), plugin_basename(__FILE__))){
1702 return;
1703 }
1704
1705 // Clean color or no color
1706 if (false !== $color = filter_input(INPUT_POST, $this->META_COLOR, FILTER_SANITIZE_STRING)) {
1707 update_post_meta($post_id, $this->META_COLOR, $color);
1708 }
1709 // Clean date or no date
1710 if ((false !== $start = filter_input(INPUT_POST, $this->META_START, FILTER_SANITIZE_STRING)) &&
1711 (false !== $end = filter_input(INPUT_POST, $this->META_END, FILTER_SANITIZE_STRING)) &&
1712 '' != $start &&
1713 '' != $end) {
1714 update_post_meta($post_id, $this->META_START, substr($start,0,16).':00');
1715 update_post_meta($post_id, $this->META_END, substr($end,0,16).':00');
1716 }
1717 else {
1718 delete_post_meta($post_id, $this->META_START);
1719 delete_post_meta($post_id, $this->META_END);
1720 }
1721
1722 // Clean location or no location
1723 if ((false !== $lat = filter_input(INPUT_POST, $this->META_LAT, FILTER_SANITIZE_STRING)) &&
1724 (false !== $long = filter_input(INPUT_POST, $this->META_LONG, FILTER_SANITIZE_STRING)) &&
1725 '' != $lat &&
1726 '' != $long) {
1727 update_post_meta($post_id, $this->META_ADD, filter_input(INPUT_POST, $this->META_ADD, FILTER_SANITIZE_STRING));
1728 update_post_meta($post_id, $this->META_LAT, $lat);
1729 update_post_meta($post_id, $this->META_LONG, $long);
1730 }
1731 else {
1732 delete_post_meta($post_id, $this->META_ADD);
1733 delete_post_meta($post_id, $this->META_LAT);
1734 delete_post_meta($post_id, $this->META_LONG);
1735 }
1736
1737 $post_ids = (!empty($_POST['post_ids']) ) ? $_POST['post_ids'] : array();
1738 }
1739
1740 function save_bulkdatas() {
1741 $current_post_type = isset($_GET['post_type']) ? $_GET['post_type'] : 'post';
1742 if (in_array($current_post_type, $this->settings['posttypes'])) {
1743 $post_ids = (!empty($_POST['post_ids']) ) ? $_POST['post_ids'] : array();
1744 if (!empty($post_ids) && is_array($post_ids)) {
1745 foreach ($this->bulk_edit_fields as $sets) {
1746 foreach ($sets as $fieldname => $fieldlabel) {
1747 if ((false != $value = filter_input(INPUT_POST, $fieldname))) {
1748 foreach ($post_ids as $post_id) {
1749 update_post_meta($post_id, $fieldname, $value);
1750 }
1751 }
1752 }
1753 }
1754 }
1755 wp_send_json(true);
1756 exit;
1757 }
1758 wp_send_json(false);
1759 }
1760
1761 /**
1762 *
1763 * @param string $date
1764 * @param string $cat
1765 * @param boolean $display
1766 * @return boolean
1767 */
1768 public function display_caldate($date, $cat = '', $display = false, $colored=true, $thumbnail='') {
1769 $events = $this->get_events(array('nb' => -1, 'date' => $date, 'cat' => $cat, 'retreive' => true));
1770 $nb = count($events);
1771 if ($display) {
1772 if ($nb > 0) {
1773 $ret.='<ul>';
1774 foreach ($events as $event) {
1775 if ($this->settings['emptylink'] == 0 && empty($event->post_content)) {
1776 $event->guid = '#';
1777 }
1778 $ret.='<li>'
1779 . '<a href="' . $event->permalink . '" title="'.esc_attr(sprintf(__('View event: %s', 'event-post'), $event->post_title)).'">'
1780 . '<h4>' . $event->post_title . '</h4>'
1781 .$this->get_single($event)
1782 . (!empty($thumbnail) ? '<span class="event_thumbnail_wrap">' . get_the_post_thumbnail($event->ID, $thumbnail) . '</span>' : '')
1783 .'</a>'
1784 . '</li>';
1785 }
1786 $ret.='</ul>';
1787 return $ret;
1788 }
1789 return'';
1790 } else {
1791 return $nb > 0 ? '<button data-date="' . date('Y-m-d', $date) . '" class="eventpost_cal_link"'.($colored?' style="background-color:#'.$events[0]->color.'"':'').' title="'.esc_attr(sprintf(_n('View %1$d event at date %2$s', 'View %1$d events at date %2$s', $nb, 'event-post'), $nb, $this->human_date($date, $this->settings['dateformat']))).'">' . date('j', $date) . '</button>' : date('j', $date);
1792 }
1793 }
1794
1795
1796 /**
1797 * @param array $atts
1798 * @filter eventpost_params
1799 * @return string
1800 */
1801 public function calendar($atts) {
1802 extract(shortcode_atts(apply_filters('eventpost_params', array(
1803 'date' => date('Y-n'),
1804 'cat' => '',
1805 'mondayfirst' => 0, //1 : weeks starts on monday
1806 'datepicker' => 1,
1807 'colored' => 1,
1808 'thumbnail'=>'',
1809 ), 'calendar'), $atts));
1810
1811 $annee = substr($date, 0, 4);
1812 $mois = substr($date, 5);
1813
1814 $time = mktime(0, 0, 0, $mois, 1, $annee);
1815
1816 $prev_year = strtotime('-1 Year', $time);
1817 $next_year = strtotime('+1 Year', $time);
1818 $prev_month = strtotime('-1 Month', $time);
1819 $next_month = strtotime('+1 Month', $time);
1820
1821 $JourMax = date("t", $time);
1822 $NoJour = -date("w", $time);
1823 if ($mondayfirst == 0) {
1824 $NoJour +=1;
1825 } else {
1826 $NoJour +=2;
1827 $this->Week[] = array_shift($this->Week);
1828 }
1829 if ($NoJour > 0 && $mondayfirst == 1) {
1830 $NoJour -=7;
1831 }
1832 $ret = '<table class="event-post-calendar-table">'
1833 . '<caption class="screen-reader-text">'
1834 . __('A calendar of events', 'event-post')
1835 . '</caption>';
1836 $ret.='<thead><tr><th colspan="7">';
1837 if ($datepicker == 1) {
1838 $ret.='<div>';
1839 $ret.='<button data-date="' . date('Y-n', $prev_year) . '" tabindex="0" title="'.sprintf(__('Switch to %s', 'event-post'), date('Y', $prev_year)).'" class="eventpost_cal_bt">&lt;&lt;</button> ';
1840 $ret.=$annee;
1841 $ret.='<button data-date="' . date('Y-n', $next_year) . '" title="'.sprintf(__('Switch to %s', 'event-post'), date('Y', $next_year)).'" class="eventpost_cal_bt">&gt;&gt;</button> ';
1842 $ret.='<button data-date="' . date('Y-n', $prev_month) . '" title="'.sprintf(__('Switch to %s', 'event-post'), date_i18n('F Y', $prev_month)).'" class="eventpost_cal_bt">&lt;</button> ';
1843 $ret.=$this->NomDuMois[abs($mois)];
1844 $ret.='<button data-date="' . date('Y-n', $next_month) . '" title="'.sprintf(__('Switch to %s', 'event-post'), date_i18n('F Y', $next_month)).'" class="eventpost_cal_bt">&gt;</button> ';
1845 $ret.='<button data-date="' . date('Y-n') . '" class="eventpost_cal_bt">' . __('Today', 'event-post') . '</button>';
1846 $ret.='</div>';
1847 }
1848 $ret.='</th></tr><tr class="event_post_cal_days">';
1849 for ($w = 0; $w < 7; $w++) {
1850 $ret.='<th scope="col">' . strtoupper(substr($this->Week[$w], 0, 1)) . '</th>';
1851 }
1852 $ret.='</tr>';
1853 $ret.='</thead>';
1854
1855 $ret.='<tbody>';
1856 $sqldate = date('Y-m', $time);
1857 $cejour = date('Y-m-d');
1858 for ($semaine = 0; $semaine <= 5; $semaine++) { // 6 semaines par mois
1859 $ret.='<tr>';
1860 for ($journee = 0; $journee <= 6; $journee++) { // 7 jours par semaine
1861 if ($NoJour > 0 && $NoJour <= $JourMax) { // si le jour est valide a afficher
1862 $td = '<td class="event_post_day">';
1863 if ($sqldate . '-' . ($NoJour<10?'0':'').$NoJour == $cejour) {
1864 $td = '<td class="event_post_day_now">';
1865 }
1866 if ($sqldate . '-' . ($NoJour<10?'0':'').$NoJour < $cejour){
1867 $td = '<td class="event_post_day_over">'; // Patch ahf
1868 }
1869 $ret.=$td;
1870
1871 $ret.= $this->display_caldate(mktime(0, 0, 0, $mois, $NoJour, $annee), $cat, false, $colored, $thumbnail);
1872 $ret.='</td>';
1873 } else {
1874 $ret.='<td></td>';
1875 }
1876 $NoJour ++;
1877 }
1878 $ret.='</tr>';
1879 }
1880 $ret.='</tbody></table>';
1881 return $ret;
1882 }
1883
1884 /**
1885 * echoes the content of the calendar in ajax context
1886 */
1887 public function ajaxcal() {
1888 echo $this->calendar(array(
1889 'date' => esc_attr(FILTER_INPUT(INPUT_GET, 'date')),
1890 'cat' => esc_attr(FILTER_INPUT(INPUT_GET, 'cat')),
1891 'mondayfirst' => esc_attr(FILTER_INPUT(INPUT_GET, 'mf')),
1892 'datepicker' => esc_attr(FILTER_INPUT(INPUT_GET, 'dp')),
1893 'colored' => esc_attr(FILTER_INPUT(INPUT_GET, 'color')),
1894 'thumbnail' => esc_attr(FILTER_INPUT(INPUT_GET, 'thumbnail')),
1895 ));
1896 exit();
1897 }
1898
1899 /**
1900 * echoes the date of the calendar in ajax context
1901 */
1902 public function ajaxdate() {
1903 echo $this->display_caldate(strtotime(esc_attr(FILTER_INPUT(INPUT_GET, 'date'))), esc_attr(FILTER_INPUT(INPUT_GET, 'cat')), true, esc_attr(FILTER_INPUT(INPUT_GET, 'color')), esc_attr(FILTER_INPUT(INPUT_GET, 'thumbnail')));
1904 exit();
1905 }
1906
1907 /**
1908 * echoes a date in ajax context
1909 */
1910 public function HumanDate() {
1911 if (isset($_REQUEST['date']) && !empty($_REQUEST['date'])) {
1912 $date = strtotime($_REQUEST['date']);
1913 echo $this->human_date($date, $this->settings['dateformat']).(date('H:i', $date)=='00:00' ? '' : ' '. date($this->settings['timeformat'], $date));
1914 exit();
1915 }
1916 }
1917
1918 /**
1919 * Displays a search form
1920 *
1921 * @param type $atts
1922 * @return type
1923 */
1924 public function search($atts) {
1925 $params = shortcode_atts(apply_filters('eventpost_params', array(
1926 'dates' => true,
1927 'q' => true,
1928 'tax' => false,
1929 ), 'search'), $atts);
1930 $this->list_id++;
1931
1932 $list_id = $this->list_id;
1933 $q = (false !== $q = filter_input(INPUT_GET, 'q')) ? $q : '';
1934 $from = (false !== $from = filter_input(INPUT_GET, 'from')) ? $from : '';
1935 $to = (false !== $to = filter_input(INPUT_GET, 'to')) ? $to : '';
1936 $tax = (false !== $tax = filter_input(INPUT_GET, 'tax')) ? $tax : '';
1937
1938 $cleaned_from = $this->date_cleanup($from);
1939 $cleaned_to = $this->date_cleanup($to);
1940 if(empty($cleaned_from)){
1941 $from=false;
1942 }
1943 if(empty($cleaned_to)){
1944 $to=false;
1945 }
1946
1947 // Search form
1948 $this->admin_scripts(null, true);
1949 wp_enqueue_style('jquery-ui', plugins_url('/css/jquery-ui.css', __FILE__), false, $this->version);
1950 include (plugin_dir_path(__FILE__) . 'views/search-form.php');
1951
1952 // Results
1953 if ($list_id == filter_input(INPUT_GET, 'evenpost_search')) {
1954 $arg = array(
1955 'post_type' => $this->settings['posttypes'],
1956 'meta_key' => $this->META_START,
1957 'orderby' => 'meta_value',
1958 'order' => 'ASC',
1959 's' => $q
1960 );
1961 if ($tax) {
1962 $arg['cat'] = $tax;
1963 }
1964
1965 if ($from || $to) {
1966
1967 $arg['meta_query'] = array();
1968 if ($from) {
1969 $arg['meta_query'][] = array(
1970 'key' => $this->META_START,
1971 'value' => $from,
1972 'compare' => '>=',
1973 'type' => 'DATETIME'
1974 );
1975 }
1976 if ($to) {
1977 $arg['meta_query'][] = $meta_query = array(
1978 array(
1979 'key' => $this->META_END,
1980 'value' => $to,
1981 'compare' => '<=',
1982 'type' => 'DATETIME'
1983 ),
1984 );
1985 }
1986 }
1987 $events = new WP_Query($arg);
1988 include (plugin_dir_path(__FILE__) . 'views/search-results.php');
1989 wp_reset_query();
1990 }
1991 }
1992
1993 /**
1994 * AJAX Get lat long from address
1995 */
1996 public function GetLatLong() {
1997 if (isset($_REQUEST['q']) && !empty($_REQUEST['q'])) {
1998 // verifier le cache
1999 $q = $_REQUEST['q'];
2000 header('Content-Type: application/json');
2001 $transient_name = 'eventpost_osquery_' . $q;
2002 $val = get_transient($transient_name);
2003 if (false === $val || empty($val) || !is_string($val)) {
2004 $language = get_bloginfo('language');
2005 if (strpos($language, '-') > -1) {
2006 $language = strtolower(substr($language, 0, 2));
2007 }
2008 $remote_val = wp_safe_remote_request('http://nominatim.openstreetmap.org/search?q=' . urlencode($q) . '&format=json&accept-language=' . $language);
2009 if(json_decode($remote_val['body'])){
2010 $val = $remote_val['body'];
2011 }
2012 set_transient($transient_name, $val, 30 * DAY_IN_SECONDS);
2013 }
2014 echo $val;
2015 exit();
2016 }
2017 }
2018
2019 /**
2020 * alters columns
2021 * @param array $defaults
2022 * @return array
2023 * @filter eventpost_columns_head
2024 */
2025 public function columns_head($defaults) {
2026 $defaults['event'] = __('Event', 'event-post');
2027 $defaults['location'] = __('Location', 'event-post');
2028 return apply_filters('eventpost_columns_head', $defaults);
2029 }
2030
2031 /**
2032 * echoes content of a row in a given column
2033 * @param string $column_name
2034 * @param int $post_id
2035 * @action eventpost_columns_content
2036 */
2037 public function columns_content($column_name, $post_id) {
2038 if ($column_name == 'location') {
2039 $lat = get_post_meta($post_id, $this->META_LAT, true);
2040 $lon = get_post_meta($post_id, $this->META_LONG, true);
2041
2042 if (!empty($lat) && !empty($lon)) {
2043 add_thickbox();
2044 $color = get_post_meta($post_id, $this->META_COLOR, true);
2045 if ($color == ''){
2046 $color = '777777';
2047 }
2048 echo '<a href="https://www.openstreetmap.org/export/embed.html?bbox='.($lon-0.005).'%2C'.($lat-0.005).'%2C'.($lon+0.005).'%2C'.($lat+0.005).'&TB_iframe=true&width=600&height=550" class="thickbox" target="_blank">'
2049 . '<i class="dashicons dashicons-location" style="color:#'.$color.';"></i>'
2050 . '<span class="screen-reader-text">'.__('View on a map', 'event-post').'</span>'
2051 . get_post_meta($post_id, $this->META_ADD, true)
2052 . '</a> ';
2053 }
2054 $this->column_edit_hidden_fields($post_id, 'location');
2055 }
2056 if ($column_name == 'event') {
2057 echo $this->print_date($post_id, false);
2058 $this->column_edit_hidden_fields($post_id, 'event');
2059 }
2060 do_action('eventpost_columns_content', $column_name, $post_id);
2061 }
2062
2063 function column_edit_hidden_fields($post_id, $set){
2064 $event = $this->retreive($post_id);
2065 echo '<div class="hidden">';
2066 foreach($this->quick_edit_fields[$set] as $fieldname=>$fieldlabel){
2067 echo'<span class="inline-edit-value '.$fieldname.'">'.esc_attr($event->$fieldname).'</span>';
2068 }
2069 echo '</div>';
2070 }
2071
2072 /** ADMIN PAGES **/
2073
2074 /**
2075 * Settings link on the plugins page
2076 */
2077 public function settings_link( $links ) {
2078 $settings_link = '<a href="options-general.php?page=event-settings">' . __( 'Settings', 'event-post' ) . '</a>';
2079 // place it before other links
2080 array_unshift( $links, $settings_link );
2081 return $links;
2082 }
2083 /**
2084 *
2085 * @param type $plugin_meta
2086 * @param type $plugin_file
2087 * @param type $plugin_data
2088 * @param type $status
2089 * @return type
2090 */
2091 public function row_meta($plugin_meta, $plugin_file, $plugin_data, $status){
2092 if($plugin_file=='event-post/eventpost.php'){
2093 $plugin_link = '<a href="http://event-post.com" target="_blank">' . __( 'Plugin site', 'event-post' ) . '</a>';
2094 $review_link = '<a href="https://wordpress.org/support/plugin/event-post/reviews/#new-post" target="_blank">' . __( 'Give a note', 'event-post' ) . '</a>';
2095 array_push($plugin_meta, $plugin_link, $review_link);
2096 }
2097 return $plugin_meta;
2098 }
2099
2100 /**
2101 * adds menu items
2102 */
2103 public function manage_options() {
2104 add_options_page(__('Events settings', 'event-post'), __('Events', 'event-post'), 'manage_options', 'event-settings', array(&$this, 'manage_settings'));
2105 }
2106 /**
2107 * adds items to the native "right now" dashboard widget
2108 * @param array $elements
2109 * @return array
2110 */
2111 public function dashboard_right_now($elements){
2112 $nb_date = count($this->get_events(array('future'=>1, 'past'=>1, 'nb'=>-1)));
2113 $nb_geo = count($this->get_events(array('future'=>1, 'past'=>1, 'geo'=>1, 'nb'=>-1)));
2114 if($nb_date){
2115 array_push($elements, '<i class="dashicons dashicons-calendar"></i> <i href="edit.php?post_type=post">'.sprintf(__('%d Events','event-post'), $nb_date)."</i>");
2116 }
2117 if($nb_geo){
2118 array_push($elements, '<i class="dashicons dashicons-location"></i> <i href="edit.php?post_type=post">'.sprintf(__('%d Geolocalized events','event-post'), $nb_geo)."</i>");
2119 }
2120 return $elements;
2121 }
2122
2123 /**
2124 * @action eventpost_register_settings
2125 */
2126 public function register_settings(){
2127 register_setting( 'eventpost-settings', 'ep_settings' );
2128
2129 // Global
2130 add_settings_section(
2131 'eventpost-settings-general',
2132 '<span class="dashicons dashicons-admin-appearance"></span>&nbsp;'.__('Global settings', 'event-post'),
2133 array(&$this, 'settings_section_callback'),
2134 'eventpost-settings'
2135 );
2136 //--
2137 add_settings_field(
2138 'emptylink',
2139 __('Print link for empty posts', 'event-post'),
2140 array(&$this, 'settings_field_select_callback'),
2141 'eventpost-settings',
2142 'eventpost-settings-general',
2143 array( 'name' => 'emptylink', 'options'=>array(
2144 1=>__('Link all posts', 'event-post'),
2145 0=>__('Do not link posts with empty content', 'event-post')
2146 )
2147 )
2148 );
2149 add_settings_field(
2150 'singlepos',
2151 __('Event bar position for single posts', 'event-post'),
2152 array(&$this, 'settings_field_select_callback'),
2153 'eventpost-settings',
2154 'eventpost-settings-general',
2155 array( 'name' => 'singlepos', 'options'=>array(
2156 'before'=>__('Before the content', 'event-post'),
2157 'after'=>__('After the content', 'event-post'),
2158 'none'=>__('Not displayed', 'event-post')
2159 ) )
2160 );
2161 add_settings_field(
2162 'loopicons',
2163 __('Add icons for events in the loop', 'event-post'),
2164 array(&$this, 'settings_field_select_callback'),
2165 'eventpost-settings',
2166 'eventpost-settings-general',
2167 array( 'name' => 'loopicons', 'options'=>array(
2168 1=>__('Emojis', 'event-post'),
2169 0=>__('Hide', 'event-post'),
2170 2=>__('Icons', 'event-post')
2171 ) )
2172 );
2173 add_settings_field(
2174 'customcss',
2175 __('Use this custom CSS file', 'event-post'),
2176 array(&$this, 'settings_field_default_callback'),
2177 'eventpost-settings',
2178 'eventpost-settings-general',
2179 array( 'name' => 'customcss', 'description'=>sprintf(__('Leave empty to use the <a href="%s" target="_blank">default CSS file</a>.', 'event-post'), plugins_url('/css/eventpost.min.css', __FILE__)).'<br>'
2180 . (is_file(get_stylesheet_directory().'/event-post.css') || is_file(get_template_directory().'/event-post.css')
2181 ? __('Your theme contains an <code>event-post.css</code> file. It will be used as default stylesheet.', 'event-post')
2182 : __('You can also add a <code>event-post.css</code> in your theme directory. It will be used as default stylesheet.', 'event-post')))
2183 );
2184
2185 // Date
2186 add_settings_section(
2187 'eventpost-settings-date',
2188 '<span class="dashicons dashicons-clock"></span>&nbsp;'.__('Date settings', 'event-post'),
2189 array(&$this, 'settings_section_callback'),
2190 'eventpost-settings'
2191 );
2192 //--
2193 add_settings_field(
2194 'dateformat',
2195 __('Date format', 'event-post'),
2196 array(&$this, 'settings_field_default_callback'),
2197 'eventpost-settings',
2198 'eventpost-settings-date',
2199 array( 'name' => 'dateformat')
2200 );
2201 add_settings_field(
2202 'timeformat',
2203 __('Time format', 'event-post'),
2204 array(&$this, 'settings_field_default_callback'),
2205 'eventpost-settings',
2206 'eventpost-settings-date',
2207 array( 'name' => 'timeformat')
2208 );
2209 add_settings_field(
2210 'export',
2211 __('Show export buttons on:', 'event-post'),
2212 array(&$this, 'settings_field_select_callback'),
2213 'eventpost-settings',
2214 'eventpost-settings-date',
2215 array( 'name' => 'export', 'options'=>array(
2216 'list'=>__('List only', 'event-post'),
2217 'single'=>__('Single only', 'event-post'),
2218 'both'=>__('Both', 'event-post'),
2219 'none'=>__('None', 'event-post'),
2220 ) )
2221 );
2222 add_settings_field(
2223 'dateforhumans',
2224 __('Relative human dates:', 'event-post'),
2225 array(&$this, 'settings_field_select_callback'),
2226 'eventpost-settings',
2227 'eventpost-settings-date',
2228 array( 'name' => 'dateforhumans',
2229 'description'=>__('Replace absolute dates by "today", "yesterday", and "tomorrow".', 'event-post'),
2230 'options'=>array(
2231 1=>__('Yes', 'event-post'),
2232 0=>__('No', 'event-post'),
2233 ) )
2234 );
2235
2236 // List
2237 add_settings_section(
2238 'eventpost-settings-list',
2239 '<span class="dashicons dashicons-editor-ul"></span>&nbsp;'.__('List settings', 'event-post'),
2240 array(&$this, 'settings_section_callback'),
2241 'eventpost-settings'
2242 );
2243 //--
2244 add_settings_field(
2245 'container_shema',
2246 __('Container shema', 'event-post'),
2247 array(&$this, 'settings_field_textarea_callback'),
2248 'eventpost-settings',
2249 'eventpost-settings-list',
2250 array( 'name' => 'container_shema', 'description'=>__('default:','event-post').' <code>'.htmlentities($this->default_list_shema['container']).'</code>')
2251 );
2252 add_settings_field(
2253 'item_shema',
2254 __('Container shema', 'event-post'),
2255 array(&$this, 'settings_field_textarea_callback'),
2256 'eventpost-settings',
2257 'eventpost-settings-list',
2258 array( 'name' => 'item_shema', 'description'=>__('default:','event-post').' <code>'.htmlentities($this->default_list_shema['item']).'</code>')
2259 );
2260
2261 // Map
2262 add_settings_section(
2263 'eventpost-settings-map',
2264 '<span class="dashicons dashicons-location-alt"></span>&nbsp;'.__('Map settings', 'event-post'),
2265 array(&$this, 'settings_section_callback'),
2266 'eventpost-settings'
2267 );
2268 //--
2269 $maps = array();
2270 foreach ($this->maps as $map){
2271 $maps[$map['id']]=$map['name'].(isset($map['urls_retina']) ? ' '.__('(Retina support)', 'event-post') : '');
2272 }
2273 add_settings_field(
2274 'tile',
2275 __('Map background', 'event-post'),
2276 array(&$this, 'settings_field_select_callback'),
2277 'eventpost-settings',
2278 'eventpost-settings-map',
2279 array( 'name' => 'tile', 'options'=>$maps)
2280 );
2281 add_settings_field(
2282 'zoom',
2283 __('Default zoom', 'event-post'),
2284 array(&$this, 'settings_field_default_callback'),
2285 'eventpost-settings',
2286 'eventpost-settings-map',
2287 array( 'name' => 'zoom')
2288 );
2289 add_settings_field(
2290 'markpath',
2291 __('Makers custom directory after <code>ABSPATH/</code>', 'event-post'),
2292 array(&$this, 'settings_field_default_callback'),
2293 'eventpost-settings',
2294 'eventpost-settings-map',
2295 array( 'name' => 'markpath', 'description'=>__('(leave empty for default settings)','event-post'))
2296 );
2297 add_settings_field(
2298 'markurl',
2299 __('Makers custom directory URL', 'event-post'),
2300 array(&$this, 'settings_field_default_callback'),
2301 'eventpost-settings',
2302 'eventpost-settings-map',
2303 array( 'name' => 'markurl', 'description'=>__('(leave empty for default settings)','event-post'))
2304 );
2305
2306 // Admin
2307 add_settings_section(
2308 'eventpost-settings-admin',
2309 '<span class="dashicons dashicons-admin-generic"></span>&nbsp;'.__('Admin settings', 'event-post'),
2310 array(&$this, 'settings_section_callback'),
2311 'eventpost-settings'
2312 );
2313 //--
2314 add_settings_field(
2315 'adminpos',
2316 __('Position of event details boxes', 'event-post'),
2317 array(&$this, 'settings_field_select_callback'),
2318 'eventpost-settings',
2319 'eventpost-settings-admin',
2320 array( 'name' => 'adminpos', 'options'=>array(
2321 'side'=>__('Side', 'event-post'),
2322 'normal'=>__('Under the text', 'event-post'),
2323 ) )
2324 );
2325 $post_types = array();
2326 $posttypes = apply_filters('eventpost_get_post_types', get_post_types(array(), 'objects'));
2327 foreach($posttypes as $type=>$posttype){
2328 $post_types[$posttype->name]=$posttype->labels->name;
2329 }
2330 add_settings_field(
2331 'posttypes',
2332 __('Wich post types can be events?', 'event-post'),
2333 array(&$this, 'settings_field_checkbox_callback'),
2334 'eventpost-settings',
2335 'eventpost-settings-admin',
2336 array( 'name' => 'posttypes', 'options'=>$post_types)
2337 );
2338 add_settings_field(
2339 'datepicker',
2340 __('Datepicker style', 'event-post'),
2341 array(&$this, 'settings_field_datepicker_callback'),
2342 'eventpost-settings',
2343 'eventpost-settings-admin',
2344 array( 'name' => 'datepicker')
2345 );
2346 add_settings_field(
2347 'cache',
2348 __('Use cache', 'event-post'),
2349 array(&$this, 'settings_field_default_callback'),
2350 'eventpost-settings',
2351 'eventpost-settings-admin',
2352 array( 'name' => 'cache', 'description'=>__('Use cache for results','event-post'))
2353 );
2354
2355 do_action('eventpost_register_settings');
2356 }
2357 function settings_section_callback( $arg ) {
2358 echo '<hr>';
2359 }
2360
2361 function settings_field_default_callback($args){
2362 ?>
2363 <input name="ep_settings[<?php echo $args['name']; ?>]" id="<?php echo $args['name']; ?>" value="<?php echo $this->settings[$args['name']]; ?>" class="regular-text"/>
2364 <?php if(isset($args['description']) && $args['description']): ?>
2365 <p class="description"><?php echo $args['description']; ?></p>
2366 <?php endif; ?>
2367 <?php
2368 }
2369 function settings_field_textarea_callback($args){
2370 ?>
2371 <textarea name="ep_settings[<?php echo $args['name']; ?>]" id="<?php echo $args['name']; ?>" class="regular-text"><?php echo $this->settings[$args['name']]; ?></textarea>
2372 <?php if(isset($args['description']) && $args['description']): ?>
2373 <p class="description"><?php echo $args['description']; ?></p>
2374 <?php endif; ?>
2375 <?php
2376 }
2377 function settings_field_select_callback($args){
2378 ?>
2379 <select name="ep_settings[<?php echo $args['name']; ?>]" id="<?php echo $args['name']; ?>" class="">
2380 <?php foreach($args['options'] as $value=>$label) : ?>
2381 <option value="<?php echo $value; ?>" <?php selected($value, $this->settings[$args['name']], true);?>><?php echo $label; ?></option>
2382 <?php endforeach; ?>
2383 </select>
2384 <?php if(isset($args['description']) && $args['description']): ?>
2385 <p class="description"><?php echo $args['description']; ?></p>
2386 <?php endif; ?>
2387 <?php
2388 }
2389 function settings_field_checkbox_callback($args){
2390 ?>
2391 <?php foreach($args['options'] as $value=>$label) : ?>
2392 <p>
2393 <label>
2394 <input type="checkbox" name="ep_settings[<?php echo $args['name']; ?>][<?php echo $value; ?>]" value="<?php echo $value; ?>" <?php checked(in_array($value, $this->settings[$args['name']]),true, true) ?>>
2395 <?php echo $label; ?>
2396 </label>
2397 </p>
2398 <?php endforeach; ?>
2399 <?php if(isset($args['description']) && $args['description']): ?>
2400 <p class="description"><?php echo $args['description']; ?></p>
2401 <?php endif; ?>
2402 <?php
2403 }
2404 function settings_field_datepicker_callback($args){
2405 $now = current_time('mysql');
2406 $human_date = $this->human_date(current_time('timestamp')) .' '. date($this->settings['timeformat'], current_time('timestamp'));
2407 ?>
2408 <div>
2409 <label>
2410 <input type="radio" name="ep_settings[datepicker]" id="ep_datepicker_simple" value="simple" <?php checked($this->settings['datepicker'],'simple', true) ?>>
2411 <?php _e('Simple', 'event-post'); ?>
2412 </label>
2413 <p>
2414 <span id="eventpost_simple_date_human" class="human_date">
2415 <?php echo $human_date; ?>
2416 </span>
2417 <input type="text" class="eventpost-datepicker-simple" id="eventpost_simple_date" value="<?php echo $now; ?>">
2418 </p>
2419 </div>
2420 <div>
2421 <label>
2422 <input type="radio" name="ep_settings[datepicker]" id="ep_datepicker_native" value="native" <?php checked($this->settings['datepicker'],'native', true) ?>>
2423 <?php _e('Native WordPress style', 'event-post'); ?>
2424 </label>
2425 <p>
2426 <span id="eventpost_native_date_human" class="human_date">
2427 <?php echo $human_date; ?>
2428 </span>
2429 <input type="text" class="eventpost-datepicker-native" id="eventpost_native_date" value="<?php echo $now; ?>">
2430 </p>
2431 </div>
2432 <?php
2433 }
2434 /**
2435 * output content of the setting page
2436 */
2437 public function manage_settings() {
2438 $ep_settings = $this->settings;
2439 ?>
2440 <div class="wrap">
2441 <?php screen_icon(); ?>
2442 <h2><?php _e('Event settings', 'event-post'); ?></h2>
2443 <form action="options.php" method="post">
2444 <?php settings_fields( 'eventpost-settings' ); ?>
2445 <?php do_settings_sections('eventpost-settings'); ?>
2446 <?php do_action('eventpost_settings_form', $ep_settings); ?>
2447 <?php submit_button(); ?>
2448 </form>
2449 </div>
2450 <?php
2451 do_action('eventpost_after_settings_form');
2452 }
2453
2454 /*
2455 * feed
2456 * generate ICS or VCS files from a category
2457 */
2458
2459 /**
2460 *
2461 * @param timestamp $timestamp
2462 * @return string
2463 */
2464 public function ics_date($timestamp){
2465 return date("Ymd",$timestamp).'T'.date("His",$timestamp);
2466 }
2467
2468 public function get_gmt_offset(){
2469 $gmt_offset = get_option('gmt_offset ');
2470 $codegmt = 0;
2471 if ($gmt_offset != 0 && substr($gmt_offset, 0, 1) != '-' && substr($gmt_offset, 0, 1) != '+') {
2472 $codegmt = $gmt_offset * -1;
2473 $gmt_offset = '+' . $gmt_offset;
2474 }
2475 if(abs($gmt_offset < 10)){
2476 $gmt_offset = substr($gmt_offset, 0, 1).'0'.substr($gmt_offset, 1);
2477 }
2478 return $gmt_offset;
2479 }
2480
2481 /**
2482 * outputs an ICS document
2483 */
2484 public function feed(){
2485 if(false !== $cat=\filter_input(INPUT_GET, 'cat',FILTER_SANITIZE_STRING)){
2486 $vtz = get_option('timezone_string');
2487 $gmt = $this->get_gmt_offset();
2488 date_default_timezone_set($vtz);
2489 $separator = "\n";
2490
2491 header("content-type:text/x-icalendar");
2492 header("Pragma: public");
2493 header("Expires: 0");
2494 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
2495 header("Cache-Control: public");
2496 header("Content-Disposition: attachment; filename=". str_replace('+','-',urlencode(get_option('blogname').'-'.$cat)).".ics;" );
2497
2498 $props = array();
2499
2500 // General
2501 $props[] = 'BEGIN:VCALENDAR';
2502 $props[] = 'PRODID://WordPress//Event-Post V'. file_get_contents(('VERSION')).'//EN';
2503 $props[] = 'VERSION:2.0';
2504
2505 // Timezone
2506 if(!empty($vtz)){
2507 array_push($props,
2508 'BEGIN:VTIMEZONE',
2509 'TZID:'.$vtz,
2510 'BEGIN:DAYLIGHT',
2511 'TZOFFSETFROM:+0100',
2512 'TZOFFSETTO:'.($gmt).'00',
2513 'DTSTART:19700329T020000',
2514 'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3',
2515 'END:DAYLIGHT',
2516 'BEGIN:STANDARD',
2517 'TZOFFSETFROM:'.($gmt).'00',
2518 'TZOFFSETTO:+0100',
2519 'TZNAME:CET',
2520 'DTSTART:19701025T030000',
2521 'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10',
2522 'END:STANDARD',
2523 'END:VTIMEZONE'
2524 );
2525 }
2526
2527 // Events
2528 $events=$this->get_events(array('cat'=>$cat,'nb'=>-1));
2529 foreach ($events as $event) {
2530 array_push($props,
2531 'BEGIN:VEVENT',
2532 'CREATED:'.$this->ics_date(strtotime($event->post_date)).'Z',
2533 'LAST-MODIFIED:'.$this->ics_date(strtotime($event->post_modified)).'Z',
2534 'SUMMARY:'.$event->post_title,
2535 'UID:'.md5(site_url()."_eventpost_".$event->ID),
2536 'LOCATION:'.str_replace(',','\,',$event->address),
2537 'DTSTART'.(!empty($vtz)?';TZID='.$vtz:'').':'.$this->ics_date($event->time_start).(!empty($vtz)?'':'Z'),
2538 'DTEND'.(!empty($vtz)?';TZID='.$vtz:'').':'.$this->ics_date($event->time_end).(!empty($vtz)?'':'Z'),
2539 'DESCRIPTION:'.$event->guid,
2540 'END:VEVENT'
2541 );
2542 }
2543
2544 // End
2545 $props[] = 'END:VCALENDAR';
2546
2547 echo implode($separator, $props);
2548 exit;
2549 }
2550 }
2551 }
2552