PluginProbe
Event Post / 6.1.2
Event Post v6.1.2
6.1.2 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 All 47 releases
← All changes | eventpost.php +3151 -2339 5.0 → 6.1.2 View file →
@@ -1,24 +1,42 @@
1 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
2 +/**
3 + * Plugin Name: Event Post
4 + * Plugin URI: https://event-post.com?mtm_campaign=wp-plugin&mtm_kwd=event-post&mtm_medium=dashboard&mtm_source=plugin-uri
5 + * Description: Add calendar and/or geolocation metadata on any posts.
6 + * Version: 6.1.2
7 + * Author: N.O.U.S. Open Useful and Simple
8 + * Contributors: bastho, sabrinaleroy, unecologeek, agencenous
9 + * Author URI: https://apps.avecnous.eu/?mtm_campaign=wp-plugin&mtm_kwd=event-post&mtm_medium=dashboard&mtm_source=author
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,blocks
14 + *
15 + * @package event-post
14 16 */
15 17
18 +if ( ! defined( 'ABSPATH' ) ) exit;
19 +
16 20 global $EventPost;
17 21 $EventPost = new EventPost();
18 22
19 23 $EventPost_cache=array();
20 24
25 +function EventPost(){
26 + global $EventPost;
27 + return $EventPost;
28 +}
29 +function event_post_format_color($color){
30 + return str_replace('#', '', $color);
31 +}
32 +function event_post_get_all_terms($post_id){
33 + $taxonomies= get_taxonomies('','names');
34 +
35 + return wp_get_post_terms($post_id, $taxonomies);
36 +}
37 +
38 +
21 39 /**
22 40 * The main class where everything begins.
23 41 *
24 42 * Add calendar and/or geolocation metadata on posts
@@ -23,2529 +41,3323 @@
23 41 *
24 42 * Add calendar and/or geolocation metadata on posts
25 43 */
26 44 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';
45 + /**
46 + * The current version
47 + *
48 + * Must be kept in sync with the `Version:` plugin header above: `bin/bump`
49 + * only rewrites header-style declarations, not this literal.
50 + *
51 + * @var string
52 + */
53 + public $version = '6.1.2';
34 54
35 - public $list_id;
36 - public $NomDuMois;
37 - public $Week;
38 - public $settings;
39 - public $dateformat;
55 + // --------------------------------------------------------------------------------
56 + // Post metas
40 57
41 - public $version = '4.5';
58 + /**
59 + * The meta name for event start date
60 + *
61 + * @var string
62 + */
63 + public $META_START = 'event_begin';
42 64
43 - public $map_interactions;
44 - public $quick_edit_fields;
65 + /**
66 + * The meta name for event end date
67 + *
68 + * @var string
69 + */
70 + public $META_END = 'event_end';
45 71
46 - public $Shortcodes;
72 + /**
73 + * The meta name for event color
74 + *
75 + * @var string
76 + */
77 + public $META_COLOR = 'event_color';
47 78
48 - public function __construct() {
49 - load_plugin_textdomain('event-post', false, 'event-post/languages');
79 + /**
80 + * The meta name for event icon
81 + *
82 + * @var string
83 + */
84 + public $META_ICON = 'event_icon';
50 85
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'));
86 + // --------------------------------------------------------------------------------
87 + // Post metas related to location
88 +
89 + /**
90 + * The meta name for event address
91 + *
92 + * @var string
93 + */
94 + public $META_ADD = 'geo_address';
55 95
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'));
96 + /**
97 + * The meta name for event latitude
98 + *
99 + * @var string
100 + *
101 + * @see http://codex.wordpress.org/Geodata
102 + */
103 + public $META_LAT = 'geo_latitude';
62 104
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'));
105 + /**
106 + * The meta name for event longitude
107 + *
108 + * @var string
109 + *
110 + * @see http://codex.wordpress.org/Geodata
111 + */
112 + public $META_LONG = 'geo_longitude';
68 113
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'));
114 + /**
115 + * The meta name for event location
116 + *
117 + * @var string
118 + *
119 + * @see https://schema.org/location
120 + */
121 + public $META_VIRTUAL_LOCATION = 'event_virtual_location';
122 +
123 + // --------------------------------------------------------------------------------
124 + // Post metas related to status
125 +
126 + /**
127 + * The meta name for event status
128 + *
129 + * @var string
130 + *
131 + * @see https://schema.org/eventStatus
132 + */
133 + public $META_STATUS = 'event_status';
134 +
135 + /**
136 + * The meta name for event attendance mode
137 + *
138 + * @var string
139 + *
140 + * @see https://schema.org/eventAttendanceMode
141 + */
142 + public $META_ATTENDANCE_MODE = 'event_attendance_mode';
76 143
77 - // Calendar publishing
78 - add_action('wp_ajax_EventPostFeed', array(&$this, 'feed'));
79 - add_action('wp_ajax_nopriv_EventPostFeed', array(&$this, 'feed'));
144 + /**
145 + * The meta name for event organizer
146 + *
147 + * @var string
148 + *
149 + * @see https://schema.org/Organization
150 + */
151 + public $META_ORGANIZATION = 'event_organization';
80 152
81 - //
82 - add_filter('eventpost_list_shema',array(&$this, 'custom_shema'),10,1);
153 + /**
154 + * The meta name for event organizer
155 + *
156 + * @var string
157 + * @see https://schema.org/Offer
158 + */
159 + public $META_OFFER = 'event_offer';
160 +
161 + // --------------------------------------------------------------------------------
162 + // Usefull variables
83 163
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);
164 + /**
165 + * ID of the current list
166 + *
167 + * @var int
168 + */
169 + public $list_id;
87 170
88 - add_action('widgets_init', array(&$this, 'register_widgets'),1,1);
171 + /**
172 + * ID of the current map
173 + *
174 + * @var int
175 + */
176 + public $map_id=0;
89 177
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);
178 + /**
179 + * Schema as been outputed or not
180 + *
181 + * @var bool
182 + */
183 + private $is_schema_output=false;
97 184
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');
185 + /**
186 + * Month names
187 + *
188 + * @var array
189 + */
190 + public $NomDuMois;
107 191
108 - }
192 + /**
193 + * Week days
194 + *
195 + * @var array
196 + */
197 + public $Week;
109 198
110 - /**
111 - * PHP4 constructor
112 - */
113 - public function EventPost(){
114 - $this->__construct();
115 - }
199 + /**
200 + * Currencies
201 + *
202 + * @var array
203 + */
204 + public $currencies = array();
116 205
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'));
206 + /**
207 + * Date format
208 + *
209 + * @var string
210 + */
211 + public $dateformat;
135 212
136 - $this->maps = $this->get_maps();
137 - $this->settings = $this->get_settings();
213 + /**
214 + * Pagination
215 + *
216 + * @var array
217 + */
218 + private $pagination;
138 219
139 - do_action('evenpost_init', $this);
220 + /**
221 + * Plugin path
222 + *
223 + * @var string
224 + */
225 + public $plugin_path;
140 226
141 - $this->Shortcodes = new EventPost_Shortcodes();
227 + /**
228 + * Script suffix
229 + *
230 + * @var string
231 + */
232 + private $script_sufix;
142 233
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 - }
234 + /**
235 + * Settings values
236 + *
237 + * @var array
238 + */
239 + public $settings;
149 240
241 + // --------------------------------------------------------------------------------
242 + // Option values
150 243
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 - }
244 + /**
245 + * Map interractions (from openlayers)
246 + *
247 + * @var array
248 + */
249 + public $map_interactions;
158 250
159 - $this->dateformat = str_replace(array('yy', 'mm', 'dd'), array('Y', 'm', 'd'), __('yy-mm-dd', 'event-post'));
251 + /**
252 + * Fields supported by quick-edit
253 + *
254 + * @var array
255 + */
256 + public $quick_edit_fields;
160 257
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);
258 + /**
259 + * Fields supported by bulk-edit
260 + *
261 + * @var array
262 + */
263 + public $bulk_edit_fields;
178 264
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 - );
265 + /**
266 + * Supported attendance modes
267 + *
268 + * @var array
269 + */
270 + public $attendance_modes;
190 271
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 - );
272 + /**
273 + * Supported statuses
274 + *
275 + * @var array
276 + */
277 + public $statuses;
210 278
211 - }
279 + /**
280 + * Default list schema (HTML template)
281 + *
282 + * @var string
283 + */
284 + public $default_list_shema;
212 285
213 - public function register_widgets(){
214 - register_widget('EventPost_List');
215 - register_widget('EventPost_Map');
216 - register_widget('EventPost_Cal');
217 - }
286 + /**
287 + * Default timeline schema (HTML template)
288 + *
289 + * @var string
290 + */
291 + public $default_timeline_shema;
218 292
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;
293 + /**
294 + * Current list schema (HTML template)
295 + *
296 + * @var string
297 + */
298 + public $list_shema;
299 +
300 + /**
301 + * Current timeline schema (HTML template)
302 + *
303 + * @var string
304 + */
305 + public $timeline_shema;
306 +
307 + // Map variables
308 + /**
309 + * Map tiles
310 + *
311 + * @var array
312 + */
313 + public $maps;
314 +
315 + /**
316 + * Dirpath for map tiles
317 + *
318 + * @var string
319 + */
320 + public $markpath;
321 +
322 + /**
323 + * Base URL for map tiles
324 + *
325 + * @var string
326 + */
327 + public $markurl;
328 +
329 + // --------------------------------------------------------------------------------
330 + // Classes
331 +
332 + /**
333 + * Taxonomies object
334 + *
335 + * @var \EventPost\Taxonomies
336 + */
337 + public $Taxonomies;
338 +
339 + /**
340 + * Icons object
341 + *
342 + * @var \EventPost\Icons
343 + */
344 + public $DashIcons;
345 +
346 + /**
347 + * Settings object
348 + *
349 + * @var \EventPost\Settings
350 + */
351 + public $Settings;
352 +
353 + /**
354 + * Shortcodes object
355 + *
356 + * @var \EventPost\Shortcodes
357 + */
358 + public $Shortcodes;
359 +
360 + /**
361 + * Allowed tags in main outputs
362 + *
363 + * @var array
364 + */
365 + public $kses_tags;
366 +
367 +
368 + public function __construct() {
369 + add_action('init', array(&$this,'init'), 1);
370 + add_action('init', array(&$this,'widgets_init'), 10);
371 + add_action('init', array(&$this, 'register_widgets'), 30, 1);
372 +
373 + add_action('save_post', array(&$this, 'save_postdata'));
374 + add_filter('dashboard_glance_items', array(&$this, 'dashboard_right_now'));
375 +
376 + // Scripts
377 + add_action( 'admin_init', array(&$this, 'editor_styles'));
378 + add_action('admin_enqueue_scripts', array(&$this, 'admin_head'));
379 + add_action('admin_print_scripts', array(&$this, 'admin_scripts'));
380 + add_action('admin_print_scripts', array(&$this, 'load_scripts'), 1);
381 + add_action('wp_enqueue_scripts', array(&$this, 'load_scripts'), 1);
382 + add_action('wp_enqueue_scripts', array(&$this, 'load_styles'));
383 +
384 + // Single
385 + add_filter('the_content', array(&$this, 'display_single'), 9999);
386 + add_filter('the_title', array(&$this, 'the_title'), 9999, 2);
387 + add_action('the_event', array(&$this, 'print_single'));
388 + add_action('wp_head', array(&$this, 'single_header'));
389 + add_action('wpseo_schema_webpage', array(&$this, 'wpseo_schema_webpage'));
390 +
391 + // Ajax
392 + add_action('wp_ajax_EventPostGetLatLong', array(&$this, 'GetLatLong'));
393 + add_action('wp_ajax_EventPostHumanDate', array(&$this, 'HumanDate'));
394 + add_action('wp_ajax_EventPostList', array(&$this, 'ajaxlist'));
395 + add_action('wp_ajax_EventPostTimeline', array(&$this, 'ajaxTimeline'));
396 + add_action('wp_ajax_EventPostNextPage', array(&$this, 'ajaxGetNextPage'));
397 + add_action('wp_ajax_nopriv_EventPostNextPage', array(&$this, 'ajaxGetNextPage'));
398 + add_action('wp_ajax_EventPostMap', array(&$this, 'ajaxmap'));
399 + add_action('wp_ajax_EventPostCalendar', array(&$this, 'ajaxcal'));
400 + add_action('wp_ajax_nopriv_EventPostCalendar', array(&$this, 'ajaxcal'));
401 + add_action('wp_ajax_EventPostCalendarDate', array(&$this, 'ajaxdate'));
402 + add_action('wp_ajax_nopriv_EventPostCalendarDate', array(&$this, 'ajaxdate'));
403 +
404 + // Calendar publishing
405 + add_action('parse_request', array(&$this, 'parse_request'), 100);
406 + add_action('wp_ajax_EventPostExport', array(&$this, 'export'));
407 + add_action('wp_ajax_nopriv_EventPostExport', array(&$this, 'export'));
408 + add_action('wp_ajax_EventPostFeed', array(&$this, 'feed'));
409 + add_action('wp_ajax_nopriv_EventPostFeed', array(&$this, 'feed'));
410 +
411 + // Internal filters
412 + add_filter('eventpost_list_shema',array(&$this, 'custom_shema'),10,1);
413 +
414 + // Quick edit
415 + add_action( 'bulk_edit_custom_box', array( &$this, 'bulk_edit' ), 10, 2 );
416 + add_action( 'quick_edit_custom_box', array( &$this, 'quick_edit' ), 10, 2 );
417 + add_action( 'admin_print_scripts-edit.php', array(&$this, 'scripts_edit') );
418 + add_action( 'wp_ajax_inline-save', array(&$this, 'inline_save'), 1 );
419 + add_action( 'bulk_edit_posts', array(&$this, 'save_bulkdatas'), 10, 2 );
420 + add_filter( 'eventpost_inline_field', array(&$this, 'inline_field_color'), 10, 3);
421 + add_filter( 'eventpost_inline_field', array(&$this, 'inline_field_icon'), 10, 3);
422 +
423 + $inc_path = plugin_dir_path(__FILE__).'inc/';
424 + $this->plugin_path = plugin_dir_path(__FILE__);
425 + include_once ($inc_path . 'class-settings.php');
426 + include_once ($inc_path . 'wrappers.php');
427 + include_once ($inc_path . 'deprecated/widget.php');
428 + include_once ($inc_path . 'deprecated/widget.cal.php');
429 + include_once ($inc_path . 'deprecated/widget.map.php');
430 + include_once ($inc_path . 'class-multisite.php');
431 + include_once ($inc_path . 'class-shortcodes.php');
432 + include_once ($inc_path . 'openweathermap.php');
433 + include_once ($inc_path . 'class-children.php');
434 + include_once ($inc_path . 'class-icons.php');
435 + include_once ($inc_path . 'class-taxonomies.php');
436 +
437 + $this->DashIcons = new EventPost\Icons();
438 + $this->Settings = new EventPost\Settings($this->DashIcons);
439 + $this->Taxonomies = new EventPost\Taxonomies($this->DashIcons);
228 440 }
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 441
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 - }
442 + /**
443 + * PHP4 constructor
444 + */
445 + public function EventPost(){
446 + $this->__construct();
447 + }
255 448
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();
449 + public function init(){
450 + $admin_url = admin_url('admin-ajax.php?action=EventPostFeed');
451 + $admin_url = str_replace(site_url(), '', $admin_url);
452 + $plugins_url = plugins_url('export/ics.php', __FILE__);
453 + $plugins_url = str_replace(site_url(), '', $plugins_url);
454 + add_rewrite_rule('event-feed/?', $admin_url , 'top');
455 + add_rewrite_rule('eventpost/([0-9]*)\.(ics|vcs)?',$plugins_url, 'top');
456 +
457 + $this->list_id = 0;
458 + $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'));
459 + $this->Week = array(__('Sunday', 'event-post'), __('Monday', 'event-post'), __('Tuesday', 'event-post'), __('Wednesday', 'event-post'), __('Thursday', 'event-post'), __('Friday', 'event-post'), __('Saturday', 'event-post'));
460 + $this->attendance_modes = array(
461 + 'OfflineEventAttendanceMode' => _x('Physical', 'Attendance Mode', 'event-post'),
462 + 'MixedEventAttendanceMode' => _x('Mixed', 'Attendance Mode', 'event-post'),
463 + 'OnlineEventAttendanceMode' => _x('Online', 'Attendance Mode', 'event-post'),
464 + );
465 + $this->statuses = array(
466 + 'EventScheduled' => _x('Scheduled', 'Event Status', 'event-post'),
467 + 'EventCancelled' => _x('Cancelled', 'Event Status', 'event-post'),
468 + 'EventMovedOnline' => _x('Moved Online', 'Event Status', 'event-post'),
469 + 'EventPostponed' => _x('Postoned', 'Event Status', 'event-post'),
470 + 'EventRescheduled' => _x('Rescheduled', 'Event Status', 'event-post'),
471 + 'EventCompleted' => _x('Completed', 'Event Status', 'event-post'),
472 + );
473 +
474 + $this->maps = $this->get_maps();
475 + $this->settings = $this->get_settings();
476 +
477 + do_action('evenpost_init', $this);
478 +
479 + // Edit
480 + add_action('add_meta_boxes', array(&$this, 'add_custom_box'));
481 + foreach($this->settings['posttypes'] as $posttype){
482 + add_filter('manage_'.$posttype.'_posts_columns', array(&$this, 'columns_head'), 2);
483 + add_action('manage_'.$posttype.'_posts_custom_column', array(&$this, 'columns_content'), 10, 2);
484 + }
485 + $this->Taxonomies->add_fields_to_taxonomies($this->settings['posttypes']);
486 +
487 + $this->markpath = '';
488 + $this->markurl = '';
489 + if (!empty($this->settings['markpath']) && !empty($this->settings['markurl'])) {
490 + $this->markpath = ABSPATH.'/'.$this->settings['markpath'];
491 + $this->markurl = $this->settings['markurl'];
492 + } else {
493 + // $this->markpath = plugin_dir_path(__FILE__) . 'markers/';
494 + // $this->markurl = plugins_url('/markers/', __FILE__);
495 + }
496 +
497 + $this->currencies = include (plugin_dir_path(__FILE__) . 'inc/data/currencies.php');
498 +
499 + $this->dateformat = str_replace(array('yy', 'mm', 'dd'), array('Y', 'm', 'd'), __('yy-mm-dd', 'event-post'));
500 +
501 + $this->default_list_shema = apply_filters('eventpost_default_list_shema', array(
502 + 'container' => '<%type% class="event_loop %id% %class%" id="%listid%" style="%style%" %attributes%>'.
503 + '%list%'.
504 + '%pagination%'.
505 + '</%type%><!-- .event_loop -->',
506 + 'item' => '<%child% class="event_item %class%" data-color="%color%" style="%style%">'.
507 + '<a href="%event_link%">'.
508 + '%event_thumbnail%'.
509 + '<h5>%event_title% </h5>'.
510 + '</a>'.
511 + '%event_price%'.
512 + '%event_date%'.
513 + '%event_cat%'.
514 + '%event_location%'.
515 + '%event_excerpt%'.
516 + '</%child%><!-- .event_item -->'
517 + ));
518 + $this->list_shema = apply_filters('eventpost_list_shema',$this->default_list_shema);
519 +
520 + $this->default_timeline_shema = apply_filters('eventpost_default_timeline_shema', array(
521 + 'container' => '
522 + <%type% class="event_loop %id% %class%" id="%listid%" style="%style%" %attributes%>
523 + %prev_arrow%
524 + <div class="track">
525 + %list%
526 + </div>
527 + %next_arrow%
528 + </%type%><!-- .event_loop -->',
529 + 'item' => '<%child% class="event_item %class%" data-color="%color%" style="%style%">
530 + <div class="anchor" style="background-color:#%color%"></div>
531 + %event_date%
532 + %event_location%
533 + %event_cat%
534 + %event_excerpt%
535 + <a href="%event_link%">
536 + %event_thumbnail%
537 + <h5>%event_title%</h5>
538 + </a>
539 + %event_price%
540 + </%child%><!-- .event_item -->'
541 + ));
542 + $this->timeline_shema = apply_filters('eventpost_timeline_shema',$this->default_timeline_shema);
543 +
544 + $this->map_interactions=array(
545 + 'DragRotate'=>__('Drag Rotate', 'event-post'),
546 + 'DoubleClickZoom'=>__('Double Click Zoom', 'event-post'),
547 + 'DragPan'=>__('Drag Pan', 'event-post'),
548 + 'PinchRotate'=>__('Pinch Rotate', 'event-post'),
549 + 'PinchZoom'=>__('Pinch Zoom', 'event-post'),
550 + 'KeyboardPan'=>__('Keyboard Pan', 'event-post'),
551 + 'KeyboardZoom'=>__('Keyboard Zoom', 'event-post'),
552 + 'MouseWheelZoom'=>__('Mouse Wheel Zoom', 'event-post'),
553 + 'DragZoom'=>__('Drag Zoom', 'event-post'),
554 + );
555 +
556 + $this->quick_edit_fields = apply_filters('eventpost_quick_edit_fields', array(
557 + 'event'=>array(
558 + $this->META_START=>__('Begin:', 'event-post'),
559 + $this->META_END=>__('End:', 'event-post'),
560 + $this->META_COLOR=>__('Color:', 'event-post'),
561 + $this->META_ICON=>__('Icon:', 'event-post'),
562 + ),
563 + 'location'=>array(
564 + $this->META_ADD=>__('Address:', 'event-post'),
565 + $this->META_LAT=>__('Latitude:', 'event-post'),
566 + $this->META_LONG=>__('Longitude:', 'event-post'),
567 + ),
568 + )
569 + );
570 + $this->bulk_edit_fields = apply_filters('eventpost_bulk_edit_fields', array(
571 + 'event'=>array(
572 + $this->META_COLOR=>__('Color:', 'event-post'),
573 + $this->META_ICON=>__('Icon:', 'event-post'),
574 + ),
575 + )
576 + );
577 +
578 + $this->kses_tags = apply_filters('eventpost_kses_tags', json_decode(
579 + file_get_contents(plugin_dir_path(__FILE__).'inc/data/kses-tags.json'),
580 + true
581 + ));
582 +
583 +
270 584 }
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 585
333 - if (!isset($ep_settings['item_shema']) ) {
334 - $ep_settings['item_shema'] = '';
335 - $reg_settings=true;
336 - }
586 + /**
587 + * Init all variables when WP is ready
588 + *
589 + * @action evenpost_init
590 + * @filter eventpost_default_list_shema
591 + * @filter eventpost_list_shema
592 + */
593 + public function widgets_init(){
594 + $this->Shortcodes = new EventPost\Shortcodes();
337 595
338 - if(!isset($ep_settings['datepicker']) || !in_array($ep_settings['datepicker'], array('simple', 'native'))){
339 - $ep_settings['datepicker']='simple';
340 - $reg_settings=true;
341 - }
596 + if(function_exists('register_block_type')){
597 + $block_path = plugin_dir_path(__FILE__).'inc/blocks/';
598 + include_once ($block_path . 'eventslist.php');
599 + include_once ($block_path . 'eventstimeline.php');
600 + include_once ($block_path . 'eventsmap.php');
601 + include_once ($block_path . 'eventscalendar.php');
602 + include_once ($block_path . 'eventdetails.php');
603 + }
342 604
343 - if(!isset($ep_settings['posttypes']) || !is_array($ep_settings['posttypes'])){
344 - $ep_settings['posttypes']=array('post');
345 - $reg_settings=true;
346 - }
347 605
348 - do_action_ref_array('eventpost_getsettings_action', array(&$ep_settings, &$reg_settings));
606 + // WooCommerce
607 + if (class_exists('WooCommerce') && in_array('product', $this->settings['posttypes'])) {
608 + include_once (plugin_dir_path(__FILE__).'inc/woocommerce.php');
609 + }
610 + }
349 611
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 - }
612 + public function register_widgets(){
613 + register_widget('EventPost_List');
614 + register_widget('EventPost_Map');
615 + register_widget('EventPost_Cal');
616 + }
356 617
357 - /**
358 - * Checks if HTML schemas are not empty
359 - * @param array $shema
360 - * @return array
361 - */
362 - public function custom_shema($shema){
618 + /**
619 + * Usefull hexadecimal to decimal converter. Returns an array of RGB from a given hexadecimal color.
620 + *
621 + * @param string $color
622 + *
623 + * @return array $color($R, $G, $B)
624 + */
625 + public function hex2dec($color = '000000') {
626 + $tbl_color = array();
627 + if(!is_string($color) || empty($color)){
628 + $color = '000000';
629 + }
630 + if (substr($color, 0, 1)!='#'){
631 + $color = '#' . $color;
632 + }
633 + $tbl_color['R'] = hexdec(substr($color, 1, 2));
634 + $tbl_color['G'] = hexdec(substr($color, 3, 2));
635 + $tbl_color['B'] = hexdec(substr($color, 5, 2));
636 + return $tbl_color;
637 + }
638 +
639 + /**
640 + * Fetch all registered image sizes
641 + *
642 + * @global array $_wp_additional_image_sizes
643 + *
644 + * @return array
645 + */
646 + function get_thumbnail_sizes(){
647 + global $_wp_additional_image_sizes;
648 + $sizes = array('thumbnail', 'medium', 'large', 'full');
649 + foreach(array_keys($_wp_additional_image_sizes) as $size){
650 + $sizes[]=$size;
651 + }
652 + return $sizes;
653 + }
654 +
655 + /**
656 + * Get blog settings, load and saves default settings if needed. Can be filterred using
657 + *
658 + * @example `<?php add_filter('eventpost_getsettings', 'some_function'); ?>`
659 + *
660 + * @action eventpost_getsettings_action
661 + * @filter eventpost_getsettings
662 + *
663 + * @return array
664 + */
665 + public function get_settings() {
666 + $ep_settings = $this->Settings->get_settings();
667 + return apply_filters('eventpost_getsettings', $ep_settings);
668 + }
669 +
670 + /**
671 + * Checks if HTML schemas are not empty
672 + *
673 + * @param array $shema
674 + *
675 + * @return array
676 + */
677 + public function custom_shema($shema){
363 678 if(!empty($this->settings['container_shema'])){
364 - $shema['container']=$this->settings['container_shema'];
679 + $shema['container']=$this->settings['container_shema'];
365 680 }
366 681 if(!empty($this->settings['item_shema'])){
367 - $shema['item']=$this->settings['item_shema'];
682 + $shema['item']=$this->settings['item_shema'];
368 683 }
369 684 return $shema;
370 - }
685 + }
371 686
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 - }
687 + /**
688 + * Parse the maps.json file. Custom maps can be added by using the `eventpost_getsettings` filter like the following example:
689 + *
690 + * ```
691 + * <?php
692 + * add_filter('eventpost_getsettings', 'map_function');
693 + * function map_function($maps){
694 + * array_push($maps, array(
695 + * 'name'=>'Myt custom map',
696 + * 'id'=>'custom_map',
697 + * 'urls'=>array(
698 + * 'http://a.customurl.org/{z}/{x}/{y}.png',
699 + * 'http://b.customurl.org/{z}/{x}/{y}.png',
700 + * 'http://c.customurl.org/{z}/{x}/{y}.png',
701 + * )
702 + * ));
703 + * return $maps;
704 + * }
705 + * ?>
706 + * ```
707 + *
708 + * @filter eventpost_maps
709 + *
710 + * @return array of map arrays ['name', 'id', 'urls']
711 + */
712 + public function get_maps() {
713 + $maps = array();
714 + $filename = plugin_dir_path(__FILE__) . 'maps.json';
715 + if (is_file($filename) && (false !== $json = json_decode(file_get_contents($filename)))) {
716 + // Convert objects to array to ensure retrocompatibility
717 + $arrays = array();
718 + foreach($json as $map){
719 + $arrays[$map->id] = (array) $map;
720 + }
721 + $maps = apply_filters('eventpost_maps', $arrays);
722 + }
723 + return $maps;
724 + }
409 725
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 - }
726 + /**
727 + * Get colors
728 + *
729 + * @return array
730 + */
731 + public function get_colors() {
732 + $colors = array();
733 + if (is_dir($this->markpath)) {
734 + $files = scandir($this->markpath);
735 + foreach ($files as $file) {
736 + if (substr($file, -4) == '.png') {
737 + $colors[substr($file, 0, -4)] = $this->markurl . $file;
738 + }
739 + }
740 + }
741 + return $colors;
742 + }
426 743
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 - }
744 + /**
745 + * Get color of a post
746 + *
747 + * @param int $post_id
748 + * @param bool $default
749 + * @param bool $check_taxo
750 + *
751 + * @return string color
752 + */
753 + public function get_post_color($post_id, $default = false, $check_taxo = false) {
754 + $color = get_post_meta($post_id, $this->META_COLOR,true);
755 + if($color && !empty($color)){
756 + return event_post_format_color($color);
757 + }else{
758 + if($check_taxo){
759 + foreach(event_post_get_all_terms($post_id) as $term){
760 + $taxo_color = $this->Taxonomies->get_taxonomy_color($term->term_id);
761 + if($taxo_color){
762 + return event_post_format_color($taxo_color);
763 + }
764 + }
765 + }
766 + }
767 + return event_post_format_color($default);
768 + }
438 769
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 - }
770 + /**
771 + * Get icon of a post
772 + *
773 + * @param int $post_id
774 + * @param bool $default
775 + * @param bool $check_taxo
776 + *
777 + * @return string|false icon
778 + */
779 + public function get_post_icon($post_id, $default = false, $check_taxo = false) {
780 + $icon = get_post_meta($post_id, $this->META_ICON,true);
781 + if($icon && !empty($icon)){
782 + return $icon;
783 + }else{
784 + if($check_taxo){
785 + foreach(event_post_get_all_terms($post_id) as $term){
786 + $taxo_icon = $this->Taxonomies->get_taxonomy_icon($term->term_id);
787 + if($taxo_icon){
788 + return event_post_format_color($taxo_icon);
789 + }
790 + }
791 + }
792 + }
793 + return $default;
794 + }
454 795
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 - }
796 + /**
797 + * Get the URL of a marker
798 + *
799 + * @param string $color
800 + *
801 + * @return sring
802 + */
803 + public function get_marker($color) {
804 + if (is_file($this->markpath . $color . '.png')) {
805 + return $this->markurl . $color . '.png';
806 + }
807 + return "";
808 + }
465 809
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 - }
810 + /**
811 + * Enqueue CSS files
812 + */
813 + public function load_styles($deps = null) {
814 + //CSS
815 + if(!empty($this->settings['customcss'])){
816 + wp_enqueue_style('event-post-custom', $this->settings['customcss']);
817 + }
818 + elseif(is_file(get_stylesheet_directory().'/event-post.css') || is_file(get_template_directory().'/event-post.css')){
819 + wp_enqueue_style('event-post-custom', get_theme_file_uri('event-post.css'));
820 + }
821 + else{
822 + wp_register_style('event-post', plugins_url('/build/front/front.css', __FILE__), $deps, filemtime( "{$this->plugin_path}/build/front/front.css" ));
823 + wp_enqueue_style('event-post');
824 + }
493 825
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 - }
826 + // Lib scripts
827 + wp_enqueue_style('dashicons', includes_url('/css/dashicons.min.css'));
828 + }
506 829
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 - }
830 + /**
831 + * Enqueue Editor style
832 + */
833 + public function editor_styles() {
834 + add_editor_style( plugins_url('/build/front/front.css', __FILE__) );
835 + }
575 836
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 ?>" />
837 + /**
838 + * Enqueue JS files
839 + */
840 + public function load_scripts() {
841 + wp_enqueue_script('event-post', plugins_url('/build/front/front.js', __FILE__), array(), filemtime( "{$this->plugin_path}/build/front/front.js" ), true);
842 + $maps = $this->maps;
843 + foreach($maps as $m=>$map){
844 + if(isset($map['api_param']) && $this->settings['tile_api_key']){
845 + foreach($map['urls'] as $i=>$url){
846 + $maps[$m]['urls'][$i] = add_query_arg($map['api_param'], $this->settings['tile_api_key'], $url);
847 + }
848 + }
849 + }
850 + wp_add_inline_script('event-post', 'var EventPost = EventPost || {}; EventPost.front='.wp_json_encode(array(
851 + 'scripts' => array(
852 + 'map' => plugins_url('/build/map/event-map.js', __FILE__)
853 + ),
854 + 'imgpath' => plugins_url('/img/', __FILE__),
855 + 'maptiles' => $maps,
856 + 'defaulttile' => $this->settings['tile'],
857 + 'zoom' => $this->settings['zoom'],
858 + 'ajaxurl' => admin_url() . 'admin-ajax.php',
859 + 'map_interactions'=>$this->map_interactions,
860 + )), 'before');
861 + }
862 + /**
863 + * Enqueue JS files for maps
864 + */
865 + public function load_map_scripts() {
866 + $this->load_styles(array('event-post-map'));
867 + // JS
868 + if(is_admin()){
869 + $this->admin_scripts(array('jquery', 'event-post-map'));
870 + }
871 + }
872 +
873 + /**
874 + * Enqueue CSS files in admin
875 + */
876 + public function admin_head() {
877 + $page = basename($_SERVER['SCRIPT_NAME']);
878 + if( $page!='post-new.php' && $page!='edit-tags.php' && !($page=='post.php' && filter_input(INPUT_GET, 'action')=='edit') && !($page=='options-general.php' && filter_input(INPUT_GET, 'page')=='event-settings') ){
879 + return;
880 + }
881 + wp_enqueue_style('event-post-admin', plugins_url('/build/admin/admin.css', __FILE__), false, filemtime( "{$this->plugin_path}/build/admin/admin.css" ));
882 + }
883 +
884 + /**
885 + * Enqueue JS files in admin
886 + */
887 + public function admin_scripts($deps = array('jquery'), $force=false) {
888 + $page = basename($_SERVER['SCRIPT_NAME']);
889 + if(!$force &&
890 + $page!='post-new.php' &&
891 + $page!='edit-tags.php' &&
892 + $page!='term.php' &&
893 + !($page=='post.php' && filter_input(INPUT_GET, 'action')=='edit') &&
894 + !($page=='options-general.php' && filter_input(INPUT_GET, 'page')=='event-settings')
895 + ){
896 + return;
897 + }
898 + wp_enqueue_script('jquery');
899 + wp_enqueue_script('jquery-effects-core');
900 + wp_enqueue_script('jquery-effects-shake');
901 + wp_enqueue_style( 'wp-color-picker');
902 + wp_enqueue_script( 'wp-color-picker');
903 + if(!is_array($deps)){
904 + $deps = array('jquery','wp-color-picker');
905 + }
906 + if($this->settings['datepicker']=='simple' || !is_admin() || (isset($_GET['page']) && $_GET['page']=='event-settings')){
907 + wp_enqueue_script('jquery-ui-datepicker');
908 + $deps[] = 'jquery-ui-datepicker';
909 + }
910 + wp_enqueue_script('event-post-admin', plugins_url('/build/admin/admin.js', __FILE__), $deps, filemtime( "{$this->plugin_path}/build/admin/admin.js" ), true);
911 + $language = get_bloginfo('language');
912 + if (strpos($language, '-') > -1) {
913 + $language = strtolower(substr($language, 0, 2));
914 + }
915 + wp_add_inline_script('event-post-admin', 'var EventPost = EventPost || {}; EventPost.admin='.wp_json_encode(array(
916 + 'ajaxurl' => admin_url('admin-ajax.php'),
917 + 'imgpath' => plugins_url('/img/', __FILE__),
918 + 'date_choose' => __('Choose', 'event-post'),
919 + 'date_format' => __('yy-mm-dd', 'event-post'),
920 + 'more_icons' => __('More icons', 'event-post'),
921 + 'pick_a_date'=>__('Pick a date','event-post'),
922 + 'use_current_location'=>__('Use my current location','event-post'),
923 + 'start_drag'=>__('Click to<br>drag the map<br>and change location','event-post'),
924 + 'empty_address'=>__('Be kind to fill a non empty address:)', 'event-post'),
925 + 'search'=>__('Type an address', 'event-post'),
926 + 'search_button'=>__('Search', 'event-post'),
927 + 'geocoding_attribution'=>__('Geocoding by <a href="https://nominatim.openstreetmap.org/" target="_blank">OpenStreetmap Nominatim</a>', 'event-post'),
928 + 'stop_drag'=>_x('Done','Stop allowing to drag the map', 'event-post'),
929 + 'datepickeri18n'=>array(
930 + // Translators: %1$s is the month name, %2$s is the day number, %3$s is the year, %4$s is the hour, %5$s is the minute
931 + 'order'=>__( '%1$s %2$s, %3$s @ %4$s:%5$s', 'event-post'),
932 + 'day'=>__('Day', 'event-post'),
933 + 'month'=>__('Month', 'event-post'),
934 + 'year'=>__('Day', 'event-post'),
935 + 'hour'=>__('Hour', 'event-post'),
936 + 'minute'=>__('Minute', 'event-post'),
937 + 'ok'=>__('OK', 'event-post'),
938 + 'cancel'=>__('Cancel', 'event-post'),
939 + 'remove'=>__('Remove', 'event-post'),
940 + 'edit'=>__('Edit', 'event-post'),
941 + 'months'=>$this->NomDuMois,
942 + ),
943 + 'META_START' => $this->META_START,
944 + 'META_END' => $this->META_END,
945 + 'META_ADD' => $this->META_ADD,
946 + 'META_LAT' => $this->META_LAT,
947 + 'META_LONG' => $this->META_LONG,
948 + 'META_STATUS' => $this->META_STATUS,
949 + 'META_ATTENDANCE_MODE' => $this->META_ATTENDANCE_MODE,
950 + 'lang'=>$language,
951 + 'maptiles' => $this->maps,
952 + 'defaulttile' => $this->settings['tile'],
953 + 'palette' => $this->get_theme_palette("hex"),
954 + 'available_images' => $this->get_colors(),
955 + )));
956 + }
957 + function scripts_edit() {
958 + // load only when editing a supported post type
959 + $current_post_type = isset($_GET['post_type']) ? $_GET['post_type'] : 'post';
960 + if ( in_array( $current_post_type, $this->settings['posttypes'] ) ) {
961 + wp_enqueue_script( 'eventpost-inline-edit', plugins_url( 'build/admin/inline-edit.js', __FILE__ ), array( 'jquery', 'inline-edit-post' ), '', true );
962 + wp_add_inline_script('eventpost-inline-edit', 'var EventPost = EventPost || {}; EventPost.inlineEdit='.wp_json_encode(array(
963 + 'quick'=>$this->quick_edit_fields,
964 + 'bulk'=>$this->bulk_edit_fields,
965 + )));
966 + }
967 + }
968 +
969 + function get_rich_result($event){
970 + /*
971 + * https://search.google.com/test/rich-results
972 + {
973 + "@context": "https://schema.org",
974 + "@type": "Event",
975 + "name": "The Adventures of Kira and Morrison",
976 + "startDate": "2025-07-21T19:00",
977 + "endDate": "2025-07-21T23:00",
978 + "eventStatus": "https://schema.org/EventScheduled",
979 + "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
980 + "location": {
981 + "@type": "VirtualLocation",
982 + "url": "https://operaonline.stream5.com/"
983 + },
984 + "image": [
985 + "https://example.com/photos/1x1/photo.jpg",
986 + "https://example.com/photos/4x3/photo.jpg",
987 + "https://example.com/photos/16x9/photo.jpg"
988 + ],
989 + "description": "The Adventures of Kira and Morrison is coming to Snickertown in a can’t miss performance.",
990 + "offers": {
991 + "@type": "Offer",
992 + "url": "https://www.example.com/event_offer/12345_201803180430",
993 + "price": "30",
994 + "priceCurrency": "USD",
995 + "availability": "https://schema.org/InStock",
996 + "validFrom": "2024-05-21T12:00"
997 + },
998 + "performer": {
999 + "@type": "PerformingGroup",
1000 + "name": "Kira and Morrison"
1001 + }
1002 + }
1003 + */
1004 + $location_virtual = array(
1005 + '@type'=>'VirtualLocation',
1006 + 'url'=>$event->virtual_location,
1007 + );
1008 + $physical_location = array(
1009 + '@type'=>'place',
1010 + 'name'=>$event->address,
1011 + 'address'=>$event->address,
1012 + 'geo'=>array(
1013 + '@type'=>'GeoCoordinates',
1014 + 'latitude'=>$event->lat,
1015 + 'longitude'=>$event->long,
1016 + ),
1017 + );
1018 + $min = 60 * get_option('gmt_offset');
1019 + $sign = $min < 0 ? "-" : "+";
1020 + $absmin = abs($min);
1021 + $gmt_offset = sprintf("%s%02d:%02d", $sign, $absmin/60, $absmin%60);
1022 + $time_format = (is_numeric($event->time_start) && is_numeric($event->time_end) && date('H:i', $event->time_start) != date('H:i', $event->time_end) && date('H:i', $event->time_start) != '00:00' && date('H:i', $event->time_end) != '00:00') ? 'Y-m-d\Th:i:00'.$gmt_offset : 'Y-m-d';
1023 +
1024 + $rich_data = array(
1025 + '@context'=>'https://schema.org',
1026 + '@type'=>'event',
1027 + 'name'=>$event->post_title,
1028 + 'datePublished'=>str_replace(' ', 'T', $event->post_date_gmt).$gmt_offset,
1029 + 'dateModified'=>str_replace(' ', 'T', $event->post_modified_gmt).$gmt_offset,
1030 + 'startDate'=>$event->time_start ? date($time_format, $event->time_start) : null,
1031 + 'endDate'=>$event->time_end ? date($time_format, $event->time_end) : null,
1032 + 'eventStatus'=>$event->status,
1033 + 'eventAttendanceMode'=>$event->attendance_mode,
1034 + 'location'=> ($event->attendance_mode == 'MixedEventAttendanceMode') ? array($location_virtual,$physical_location) : ($event->attendance_mode == 'OnlineEventAttendanceMode' ? $location_virtual : $physical_location),
1035 + 'image'=> has_post_thumbnail($event->ID) ? array(
1036 + get_the_post_thumbnail_url($event->ID, 'post-thumbnail'),
1037 + get_the_post_thumbnail_url($event->ID, 'medium'),
1038 + get_the_post_thumbnail_url($event->ID, 'large'),
1039 + get_the_post_thumbnail_url($event->ID, 'full'),
1040 + ) : null,
1041 + 'description'=>$event->description,
1042 + );
1043 + if(!empty($event->organization)){
1044 + $rich_data['organizer'] = array(
1045 + '@type'=>'Organization',
1046 + 'name'=>$event->organization,
1047 + );
1048 + }
1049 + if(!empty($event->offer)){
1050 + $rich_data['offers'] = array(
1051 + '@type'=>'Offer',
1052 + // 'availability'=>$event->availability,
1053 + // 'validFrom'=>date($time_format, $event->time_start),
1054 + );
1055 + if(!empty($event->offer['url'])){
1056 + $rich_data['offers']['url'] = $event->offer['url'];
1057 + }
1058 + if(!empty($event->offer['price'])){
1059 + $rich_data['offers']['price'] = $event->offer['price'];
1060 + }
1061 + if(!empty($event->offer['currency'])){
1062 + $rich_data['offers']['priceCurrency'] = $event->offer['currency'];
1063 + }
1064 + }
1065 +
1066 + return apply_filters('event-post-rich-result', $rich_data, $event);
1067 + }
1068 +
1069 + function wpseo_schema_webpage($rich_result){
1070 + $event = $this->retreive();
1071 + if ($event != false){
1072 + if ($event->time_start != '' && $event->time_end != '') {
1073 + $rich_result = array_merge($rich_result, $this->get_rich_result($event));
1074 + }
1075 + $this->is_schema_output = true;
1076 + }
1077 + return $rich_result;
1078 + }
1079 +
1080 + function get_theme_palette($return = "hex"){
1081 + $theme_options = wp_get_global_settings();
1082 + $colors = [];
1083 + if(isset($theme_options['color']['palette']['theme'])){
1084 + $colors = $theme_options['color']['palette']['theme'];
1085 + }elseif(isset($theme_options['color']['palette']['default'])){
1086 + $colors = $theme_options['color']['palette']['default'];
1087 + }
1088 + if($return == "hex"){
1089 + $color_hexs = [];
1090 + foreach($colors as $color){
1091 + $color_hexs[] = $color["color"];
1092 + }
1093 + return $color_hexs;
1094 + }
1095 + return $colors;
1096 + }
1097 +
1098 + /**
1099 + * Add custom header meta for single events
1100 + */
1101 + public function single_header() {
1102 + if (is_single()) {
1103 + $twitter_label_id=0;
1104 + $event = $this->retreive();
1105 + $has_location = $has_time = false;
1106 + if ($event != false) {
1107 + if ($event->address != '' || ($event->lat != '' && $event->long != '')) {
1108 + $twitter_label_id++;
1109 + $has_location = true;
1110 + ?>
1111 +<meta name="geo.placename" content="<?php echo esc_attr($event->address) ?>" />
1112 +<meta name="geo.position" content="<?php echo esc_attr($event->lat) ?>;<?php echo esc_attr($event->long) ?>" />
1113 +<meta name="ICBM" content="<?php echo esc_attr($event->lat) ?>;<?php echo esc_attr($event->long) ?>" />
1114 +<meta property="place:location:latitude" content="<?php echo esc_attr($event->lat) ?>" />
1115 +<meta property="place:location:longitude" content="<?php echo esc_attr($event->long) ?>" />
1116 +<meta name="twitter:label<?php echo esc_attr($twitter_label_id); ?>" content="<?php esc_attr_e('Location', 'event-post'); ?>"/>
1117 +<meta name="twitter:data<?php echo esc_attr($twitter_label_id); ?>" content="<?php echo esc_attr($event->address) ?>"/>
589 1118 <?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) ?>" />
1119 + }
1120 + if ($event->start != '' && $event->end != '') {
1121 + $has_time = true;
1122 + $twitter_label_id++;
1123 + ?>
1124 +<meta name="datetime-coverage-start" content="<?php echo esc_attr(date('c', $event->time_start)) ?>" />
1125 +<meta name="datetime-coverage-end" content="<?php echo esc_attr(date('c', $event->time_end)) ?>" />
1126 +<meta name="twitter:label<?php echo esc_attr($twitter_label_id); ?>" content="<?php echo esc_attr('Date', 'event-post'); ?>"/>
1127 +<meta name="twitter:data<?php echo esc_attr($twitter_label_id); ?>" content="<?php echo esc_attr($this->human_date($event->time_start)) ?>"/>
595 1128 <?php
596 - }
597 - }
598 - }
1129 + }
1130 + if(($has_location || $has_time) && !$this->is_schema_output){
1131 + $rich_result = $this->get_rich_result($event);
1132 + $this->is_schema_output = true;
1133 + ?>
1134 + <script type="application/ld+json"><?php echo \wp_json_encode($rich_result); ?></script>
1135 + <?php
1136 + }
1137 + }
1138 + }
1139 + }
599 1140
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 - }
1141 + /**
1142 + * Cleanups a date
1143 + *
1144 + * @param type $str
1145 + *
1146 + * @since 5.0.1
1147 + *
1148 + * @return string
1149 + */
1150 + public function date_cleanup($str){
1151 + return trim(str_replace(array('0', ' ', ':', '-'), '', $str));
1152 + }
609 1153
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 - }
1154 + /**
1155 + * Checks if a date is valid or not
1156 + *
1157 + * @param string $str
1158 + *
1159 + * @return boolean
1160 + */
1161 + public function dateisvalid($str) {
1162 + return is_string($str) && $this->date_cleanup($str) != '';
1163 + }
618 1164
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 - }
1165 + /**
1166 + * Parse a date from a string
1167 + *
1168 + * @param string $date
1169 + * @param string $sep
1170 + *
1171 + * @return string
1172 + */
1173 + public function parsedate($date, $sep = '') {
1174 + if (!empty($date)) {
1175 + return substr($date, 0, 10) . $sep . substr($date, 11, 8);
1176 + } else {
1177 + return '';
1178 + }
1179 + }
632 1180
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 - }
1181 + /**
1182 + * Sanitize a coordinate string
1183 + * Only keeps, numbers, dots and commas
1184 + *
1185 + * @param string $str
1186 + *
1187 + * @since 5.9.9
1188 + *
1189 + * @return string
1190 + */
1191 + public function sanitize_coordinate($str){
1192 + return preg_replace('/[^0-9\.,-]/', '', $str);
1193 + }
651 1194
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 - }
1195 + /**
1196 + * Format a date for humans
1197 + *
1198 + * @param mixed $date
1199 + * @param string $format
1200 + *
1201 + * @return type
1202 + */
1203 + public function human_date($date, $format = 'l j F Y') {
1204 + if($this->settings['dateforhumans']){
1205 + if (is_numeric($date) && date('d/m/Y', $date) == date('d/m/Y')) {
1206 + return __('today', 'event-post');
1207 + } elseif (is_numeric($date) && date('d/m/Y', $date) == date('d/m/Y', strtotime('+1 day'))) {
1208 + return __('tomorrow', 'event-post');
1209 + } elseif (is_numeric($date) && date('d/m/Y', $date) == date('d/m/Y', strtotime('-1 day'))) {
1210 + return __('yesterday', 'event-post');
1211 + }
1212 + }
1213 + return date_i18n($format, $date);
1214 + }
662 1215
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 - }
1216 + /**
1217 + * Returns a range of dates
1218 + *
1219 + * @param timestamp $time_start
1220 + * @param timestamp $time_end
1221 + *
1222 + * @return string
1223 + */
1224 + public function delta_date($time_start, $time_end){
1225 + if(!$time_start || !$time_end){
1226 + return;
1227 + }
697 1228
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 != '') {
1229 + // Translators: %1$s, %4$s are opening tags, %2$s and %5$s are closing tag, %3$s is the first date, %6$s is the second date
1230 + $from_to_days = _x('%1$sfrom%2$s %3$s %4$sto%5$s %6$s', 'Days', 'event-post');
1231 + // Translators: %1$s is the first date, %4$s is the second date, %2$s is an opening tag, %3$s is a closing tag
1232 + $single_day_at = _x('%1$s%2$s,%3$s %4$s', 'From/To single day at time', 'event-post');
1233 + // Translators: %1$s, %4$s are opening tags, %2$s and %5$s are closing tag, %3$s is the first hour, %6$s is the second hour
1234 + $from_to_hours = _x('%1$sfrom%2$s %3$s %4$sto%5$s %6$s', 'Hours', 'event-post');
1235 + // Translators: %1$s is an opening tag, %2$s is a closing tag, %3$s is the time
1236 + $at_time = _x('%1$sat%2$s %3$s', 'Time', 'event-post');
708 1237
709 - $dates.=$this->delta_date($event->time_start, $event->time_end);
1238 + //Display dates
1239 + $dates="\t\t\t\t".'<div class="event_date" data-start="' . $this->human_date($time_start) . '" data-end="' . $this->human_date($time_end) . '">';
1240 + // Same day
1241 + if (date('Ymd', $time_start) == date('Ymd', $time_end)) {
1242 + $dates.= "\n\t\t\t\t\t\t\t".'<time itemprop="dtstart" datetime="' . date_i18n('c', $time_start) . '">'
1243 + . '<span class="date date-single">' . $this->human_date($time_end, $this->settings['dateformat']) . "</span>";
1244 + 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') {
1245 + $dates.= ' '.sprintf(
1246 + $from_to_hours,
1247 + '<span class="linking_word linking_word-from">',
1248 + '</span>',
1249 + '<span class="time time-start">' . date_i18n($this->settings['timeformat'], $time_start) . '</span>',
1250 + '<span class="linking_word linking_word-to">',
1251 + '</span>',
1252 + '<span class="time time-end">' . date_i18n($this->settings['timeformat'], $time_end) . '</span>'
1253 + );
1254 + }
1255 + elseif (date('H:i', $time_start) != '00:00') {
1256 + $dates.= ' '.sprintf(
1257 + $at_time,
1258 + '<span class="linking_word">',
1259 + '</span>',
1260 + '<span class="time time-single">' . date_i18n($this->settings['timeformat'], $time_start) . '</span>'
1261 + );
1262 + }
1263 + $dates.="\n\t\t\t\t\t\t\t".'</time>';
1264 + }
1265 + // Not same day
1266 + else {
1267 + $dates.= ' '.sprintf(
1268 + $from_to_days,
1269 + '<span class="linking_word linking_word-from">',
1270 + '</span>',
1271 + '<time class="date date-start" itemprop="dtstart" datetime="' . date('c', $time_start) . '">'
1272 + . ((date('H:i:s', $time_start) != '00:00:00' || date('H:i:s', $time_end) != '00:00:00')
1273 + ? sprintf($single_day_at, '<span class="date">'.$this->human_date($time_start, $this->settings['dateformat']).'</span>', '<span class="linking_word">', '</span>', '<span class="time">'.date_i18n($this->settings['timeformat'], $time_start).'</span>')
1274 + : $this->human_date($time_start, $this->settings['dateformat'])
1275 + )
1276 + . '</time>',
1277 + '<span class="linking_word linking_word-to">',
1278 + '</span>',
1279 + '<time class="date date-to" itemprop="dtend" datetime="' . date('c', $time_end) . '">'
1280 + . ((date('H:i:s', $time_start) != '00:00:00' || date('H:i:s', $time_end) != '00:00:00')
1281 + ? sprintf($single_day_at, '<span class="date">'.$this->human_date($time_end, $this->settings['dateformat']).'</span>', '<span class="linking_word">', '</span>', '<span class="time">'.date_i18n($this->settings['timeformat'], $time_end).'</span>')
1282 + : $this->human_date($time_end, $this->settings['dateformat'])
1283 + )
1284 + . '</time>'
1285 + );
1286 + }
1287 + $dates.="\n\t\t\t\t\t\t".'</div><!-- .event_date -->';
1288 + return $dates;
1289 + }
710 1290
711 - $timezone_string = get_option('timezone_string');
712 - $gmt_offset = $gmt = $this->get_gmt_offset();
1291 + /**
1292 + * Displays a date
1293 + *
1294 + * @param WP_Post object $post
1295 + * @param mixed $links
1296 + *
1297 + * @return string
1298 + */
1299 + public function print_date($post = null, $links = 'deprecated', $context='') {
1300 + $dates = '';
1301 + $event = $this->retreive($post);
1302 + if ($event != false){
1303 + if ($event->start != '' && $event->end != '') {
713 1304
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 - )) {
1305 + $dates.=$this->delta_date($event->time_start, $event->time_end);
1306 + if( // Status setting
1307 + $this->settings['displaystatus'] == 'both' ||
1308 + ($this->settings['displaystatus'] == 'single' && is_single() ) ||
1309 + ($this->settings['displaystatus'] == 'list' && !is_single() )
1310 + ){
1311 + $dates.='<span class="eventpost-status">'.$this->statuses[$event->status].'</span>';
1312 + }
1313 + $timezone_string = get_option('timezone_string');
1314 + $gmt_offset = $gmt = $this->get_gmt_offset();
719 1315
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;
1316 + if (
1317 + !is_admin()
1318 + && ( // Export when setting
1319 + $this->settings['export_when'] == 'both' ||
1320 + ( $this->settings['export_when'] == 'future' && $this->is_future($event) ) ||
1321 + ( $this->settings['export_when'] == 'past' && $this->is_past($event) )
1322 + )
1323 + && ( // Export setting
1324 + $this->settings['export'] == 'both' ||
1325 + ($this->settings['export'] == 'single' && is_single() ) ||
1326 + ($this->settings['export'] == 'list' && !is_single() )
1327 + )
1328 + ) {
1329 + // Export event
1330 + $title = urlencode($post->post_title);
1331 + $address = urlencode($post->address);
1332 + $desc = urlencode($event->description."\n\n".$post->permalink);
1333 + $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');
1334 + $d_s = date("Ymd", $event->time_start) . ($allday ? '' : 'T' . date("His", $event->time_start));
1335 + $d_e = date("Ymd", $event->time_end) . ($allday ? '' : 'T' . date("His", $event->time_end));
1336 + $uid = $post->ID . '-' . $post->blog_id;
1337 + $url = $event->permalink;
728 1338
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__));
1339 + // format de date ICS
1340 + $permalink_structure = get_option( 'permalink_structure' );
1341 + if($permalink_structure != ""){
1342 + $ics_url = site_url('eventpost/'.$event->ID.'.ics');
1343 + $vcs_url = site_url('eventpost/'.$event->ID.'.vcs');
1344 + }
1345 + else{
1346 + $ics_url = add_query_arg(array('action'=>'EventPostExport', 'event_id'=>$event->ID, 'format'=>'ics'), admin_url('admin-ajax.php'));
1347 + $vcs_url = add_query_arg(array('action'=>'EventPostExport', 'event_id'=>$event->ID, 'format'=>'vcs'), admin_url('admin-ajax.php'));
740 1348
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');
1349 + }
754 1350
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 - }
1351 + // format de date Google cal
1352 + //$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';
1353 + $google_url = add_query_arg(array(
1354 + 'action'=>'TEMPLATE',
1355 + 'trp'=>'false',
1356 + 'sprop'=>'name',
1357 + 'text'=>$title,
1358 + 'dates'=>$d_s.'/'.$d_e.'', // Removed Z to fix TZ issue
1359 + 'location'=>$address,
1360 + 'details'=>$desc,
1361 + 'gmt'=> urlencode($gmt_offset)
1362 + ), 'https://www.google.com/calendar/event');
1363 + if(!empty($timezone_string)){
1364 + $google_url = add_query_arg(array(
1365 + 'ctz'=>$timezone_string,
1366 + ), $google_url);
1367 + }
777 1368
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;
1369 + $dates.='
1370 + <span class="eventpost-date-export">
1371 + <a href="' . $ics_url . '" class="event_link event-export ics" target="_blank" title="' . __('Download ICS file', 'event-post') . '">ical</a>
1372 + <a href="' . $google_url . '" class="event_link event-export gcal" target="_blank" title="' . __('Add to Google calendar', 'event-post') . '">Google</a>
1373 + <a href="' . $vcs_url . '" class="event_link event-export vcs" target="_blank" title="' . __('Add to Outlook', 'event-post') . '">outlook</a>
1374 + <i class="dashicons-before dashicons-calendar"></i>
1375 + </span>';
1376 + }
1377 + }
1378 + }
1379 + return apply_filters('eventpost_printdate', $dates);
1380 + }
797 1381
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 - }
1382 + /**
1383 + * Outputs location of an event
1384 + *
1385 + * @param WP_Post object $post
1386 + *
1387 + * @return string
1388 + */
1389 + public function print_location($post=null, $context='') {
1390 + $location = '';
1391 + if ($post == null)
1392 + $post = get_post();
1393 + elseif (is_numeric($post)) {
1394 + $post = get_post($post);
1395 + }
1396 + if (!isset($post->start)) {
1397 + $post = $this->retreive($post);
1398 + }
1399 + if ($post != false){
1400 + $this->map_id++;
1401 + $address = $post->address;
1402 + $lat = $post->lat;
1403 + $long = $post->long;
1404 + $color = $this->get_post_color($post->ID, $this->settings['default_color'], true);
1405 + $icon = $this->DashIcons->icons[$this->get_post_icon($post->ID, $this->settings['default_icon'], true)];
1406 + $virtual_location = $post->virtual_location;
1407 + $attendance_mode = $post->attendance_mode;
812 1408
813 - return apply_filters('eventpost_printlocation', $location);
814 - }
1409 + if ($this->is_online($post) && $virtual_location) {
1410 + $location.="\t\t\t\t".'<div><a href="'.esc_url($virtual_location).'" class="eventpost-virtual-location-link" target="_blank" rel="noopener">'
1411 + .__('Join link', 'event-post')
1412 + .'</a></div>'
1413 + ."\n";
1414 + }
1415 + if ($this->is_offline($post) && ($address != '' || ($lat != '' && $long != ''))) {
1416 + $location.="\t\t\t\t".'<address';
1417 + if ($lat != '' && $long != '') {
1418 + $geo_attributes = ' data-latitude="' . esc_attr($lat) . '"
1419 + data-longitude="' . esc_attr($long) . '"
1420 + data-marker="' . esc_attr($this->get_marker($color)) . '"
1421 + data-iconcode="' .esc_attr($icon). '"
1422 + data-icon="' . esc_attr(mb_convert_encoding('&#x'.$icon.';', 'UTF-8', 'HTML-ENTITIES')). '"
1423 + data-color="#' . esc_attr($color). '"
1424 + data-id="' . $post->ID . '-'.$this->map_id.'"';
1425 + $location.=' '.$geo_attributes;
1426 + }
1427 + $location.=' itemprop="adr" class="eventpost-address">'
1428 + . "\n\t\t\t\t\t\t\t".'<span>'
1429 + . "\n".$address
1430 + . "\n\t\t\t\t\t\t\t". '</span>';
1431 + if ($context=='single' && $lat != '' && $long != '') {
1432 + $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=' . esc_attr($lat) .'&amp;lon=' . esc_attr($long) . '&amp;zoom=13" target="_blank" itemprop="geo" ' . $geo_attributes . '>' . __('Map', 'event-post') . '</a>';
1433 + }
1434 + $location.="\n\t\t\t\t\t\t".'</address>';
1435 + if (wp_is_mobile() && $lat != '' && $long != '') {
1436 + $location.="\n\t\t\t\t\t\t".'<a class="event_link gps-geo-link" href="geo:' . esc_attr($lat) . ',' . esc_attr($long) . '" target="_blank" itemprop="geo" ' . $geo_attributes . '><i class="dashicons-before dashicons-location"></i> ' . __('Open in app', 'event-post') . '</a>';
1437 + }
1438 + }
1439 + }
1440 + return apply_filters('eventpost_printlocation', $location);
1441 + }
815 1442
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 - }
1443 + /**
1444 + * Compute darkness of the color
1445 + *
1446 + * @param string $color
1447 + *
1448 + * @return float
1449 + */
1450 + public function color_darkness($color){
1451 + $color = str_replace('#', '', $color);
1452 + $rgb = array();
1453 + for ($x=0;$x<3;$x++) {
1454 + $rgb[$x] = hexdec(substr($color,(2*$x),2));
1455 + }
1456 + return (max($rgb) + min($rgb)) / 510;
1457 + }
846 1458
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 - }
1459 + /**
1460 + * Outputs categories of an event
1461 + *
1462 + * @param WP_Post object $post
1463 + *
1464 + * @return string
1465 + */
1466 + public function print_categories($post=null, $context='') {
1467 + if ($post == null)
1468 + $post = get_post();
1469 + elseif (is_numeric($post)) {
1470 + $post = get_post($post);
1471 + }
1472 + if (!isset($post->start)) {
1473 + $post = $this->retreive($post);
1474 + }
1475 + $cats = '';
1476 + if ($post != false){
1477 + $categories = $post->Taxonomies;
1478 + if ($categories) {
1479 + $cats.="\t\t\t\t".'<span class="event_categories">';
869 1480
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 - }
1481 + foreach ($categories as $category) {
1482 + $cats.="\t\t\t\t\t".'<span ';
1483 + $classes = array('event-term', 'event_term_category');
1484 + $darkness = 0;
1485 + $color = $this->Taxonomies->get_taxonomy_color($category->term_id);
1486 + if ($color != '' && $color) {
1487 + $cats.=' style="background-color:#' . $color . '"';
879 1488
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 - }
1489 + $darkness = $this->color_darkness($color);
1490 + if($darkness < 0.5){
1491 + array_push($classes, 'event-post-bg-dark');
1492 + }
1493 + else{
1494 + array_push($classes, 'event-post-bg-light');
1495 + }
889 1496
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 - }
1497 + }
1498 + $cats.=' class="'.implode(' ', $classes).'">';
1499 + $cats .= $category->name . ' ';
1500 + $cats.='</span>';
1501 + }
1502 + $cats.='</span>';
1503 + }
1504 + }
1505 + return $cats;
1506 + }
899 1507
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 - }
1508 + /**
1509 + * Generate, return or output date event datas
1510 + *
1511 + * @param WP_Post object $post
1512 + * @param string $class
1513 + *
1514 + * @filter eventpost_get_single
1515 + *
1516 + * @return string
1517 + */
1518 + public function get_single($post = null, $class = '', $context='') {
1519 + if ($post == null) {
1520 + $post = $this->retreive();
1521 + }
1522 + if ($post != null){
1523 + $datas_date = $this->print_date($post, null, $context);
1524 + $datas_cat = $this->print_categories($post, $context);
1525 + $datas_loc = $this->print_location($post, $context);
1526 + $classes = array(
1527 + 'event_data',
1528 + 'status-'.strtolower(str_replace('Event', '', $post->status)),
1529 + 'location-type-'.strtolower(str_replace('EventAttendanceMode', '', $post->attendance_mode)),
1530 + $class
1531 + );
1532 + if ($datas_date != '' || $datas_loc != '') {
1533 + $rgb = $this->hex2dec($post->color);
1534 + return '<div class="' . implode(' ', $classes) . '" style="border-left-color:#' . $post->color . ';background:rgba(' . $rgb['R'] . ',' . $rgb['G'] . ',' . $rgb['B'] . ',0.1)" itemscope itemtype="http://microformats.org/profile/hcard">'
1535 + . apply_filters('eventpost_get_single', $datas_date . $datas_cat . $datas_loc, $post)
1536 + . '</div>';
1537 + }
1538 + }
1539 + return '';
1540 + }
909 1541
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 - }
1542 + /**
1543 + * Displays dates of a gieven post
1544 + *
1545 + * @param WP_Post object $post
1546 + * @param string $class
1547 + *
1548 + * @return string
1549 + */
1550 + public function get_singledate($post = null, $class = '', $context='') {
1551 + 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 -->';
1552 + }
921 1553
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 - }
1554 + /**
1555 + * Displays coloured terms of a given post
1556 + *
1557 + * @param WP_Post object $post
1558 + * @param string $class
1559 + *
1560 + * @return string
1561 + */
1562 + public function get_singlecat($post = null, $class = '', $context='') {
1563 + 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 -->';
1564 + }
931 1565
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){
1566 + /**
1567 + * Displays location of a given post
1568 + *
1569 + * @param WP_Post object $post
1570 + * @param string $class
1571 + *
1572 + * @return string
1573 + */
1574 + public function get_singleloc($post = null, $class = '', $context='') {
1575 + 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 -->';
1576 + }
1577 +
1578 + /**
1579 + * Uses `the_content` filter to add event details before or after the content of the current post
1580 + *
1581 + * @param string $content
1582 + *
1583 + * @return string
1584 + */
1585 + public function display_single($content) {
1586 + if (is_page() || !is_single() || is_home() || !in_the_loop() || !is_main_query()){
1587 + return $content;
1588 + }
1589 +
1590 + $post = $this->retreive();
1591 + if($post != false){
1592 + // If the post is a product, don't display the event bar, use product tab instead
1593 + if($post->post_type=='product'){
1594 + return $content;
1595 + }
1596 +
1597 + $eventbar = apply_filters('eventpost_contentbar', $this->get_single($post, 'event_single', 'single'), $post);
1598 + if($this->settings['singlepos']=='before'){
1599 + $content=$eventbar.$content;
1600 + }
1601 + elseif($this->settings['singlepos']=='after'){
1602 + $content.=$eventbar;
1603 + }
1604 + $this->load_map_scripts();
1605 + }
1606 + return $content;
1607 + }
1608 +
1609 + /**
1610 + * Outputs events details (dates, geoloc, terms) of given post
1611 + *
1612 + * @param WP_Post object $post
1613 + *
1614 + * @return void
1615 + */
1616 + public function print_single($post = null) {
1617 + echo wp_kses_post($this->get_single($post));
1618 + }
1619 +
1620 + /**
1621 + * Alter the post title in order to add icons if needed
1622 + *
1623 + * @param string $title
1624 + *
1625 + * @return string
1626 + */
1627 + public function the_title($title, $post_id = null){
938 1628 if(!$post_id || !in_the_loop() || !$this->settings['loopicons']){
939 - return $title;
1629 + return $title;
940 1630 }
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 - );
1631 + $icons_ = array(
1632 + // Emojis
1633 + 1=>array('🗓', '🗺'),
1634 + // Dashicons
1635 + 2=>array('<span class="dashicons dashicons-calendar"></span>', '<span class="dashicons dashicons-location"></span>'),
1636 + );
947 1637
948 1638 $event = $this->retreive($post_id);
949 - if(!empty($event->start)){
950 - $title .= ' '.$icons_[$this->settings['loopicons']][0];
1639 + if ($event !== false){
1640 + if(!empty($event->start)){
1641 + $title .= ' '.$icons_[$this->settings['loopicons']][0];
1642 + }
1643 + if(!empty($event->lat) && !empty($event->long)){
1644 + $title .= ' '.$icons_[$this->settings['loopicons']][1];
1645 + }
951 1646 }
952 - if(!empty($event->lat) && !empty($event->long)){
953 - $title .= ' '.$icons_[$this->settings['loopicons']][1];
1647 + return $title;
954 1648 }
955 - return $title;
956 - }
957 1649
958 1650
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='') {
1651 + function get_price($event,$html=false){
1652 + $price = '';
1653 + $text_price = $price;
1654 + if($event->post_type == 'product'){
1655 + $product_id = $event->ID;
1656 + $product = wc_get_product($product_id);
1657 + $price = $product->get_price();
1658 + $currency = get_woocommerce_currency_symbol();
1659 + if($product->get_sale_price() != ""){
1660 + $old_price = $product->get_regular_price();
1661 + $text_price = '<span class="event_price"><del>'.$old_price . $currency . '</del> '.$price. $currency. '</span>';
1662 + } else {
1663 + $text_price = '<span class="event_price"> '.$price . $currency.'</span>';
1664 + }
1665 + }
1666 + if ($html == true) {
1667 + return $text_price;
1668 + } else {
1669 + return $price;
1670 + }
1671 + }
1672 +
1673 + /**
1674 + * Return an HTML list of events
1675 + *
1676 + * @param array $atts
1677 + * @param string $id
1678 + * @param string $context
1679 + *
1680 + * @filter eventpost_params($defaults, 'list_events')
1681 + * @filter eventpost_listevents
1682 + * @filter eventpost_item_scheme_entities
1683 + * @filter eventpost_item_scheme_values
1684 + *
1685 + * @return string
1686 + */
1687 + public function list_events($atts, $id = 'event_list', $context='') {
973 1688 $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);
1689 + $defaults = array(
1690 + 'nb' => 0,
1691 + 'nb_desktop' => 0,
1692 + 'nb_tablet' => 0,
1693 + 'nb_mobile' => 0,
1694 + 'type' => 'div',
1695 + 'future' => true,
1696 + 'past' => false,
1697 + 'geo' => 0,
1698 + 'width' => '',
1699 + 'height' => '',
1700 + 'list' => 0,
1701 + 'zoom' => '',
1702 + 'map_position' => 'false',
1703 + 'latitude' => '',
1704 + 'longitude' => '',
1705 + 'tile' => $ep_settings['tile'],
1706 + 'pop_element_schema' => 'false',
1707 + 'htmlPop_element_schema' => '',
1708 + 'title' => '',
1709 + 'before_title' => '<h3>',
1710 + 'after_title' => '</h3>',
1711 + 'cat' => '',
1712 + 'tag' => '',
1713 + 'tax_name' => '',
1714 + 'tax_term' => '',
1715 + 'events' => '',
1716 + 'style' => '',
1717 + 'thumbnail' => '',
1718 + 'thumbnail_size' => '',
1719 + 'excerpt' => '',
1720 + 'orderby' => 'meta_value',
1721 + 'order' => 'ASC',
1722 + 'class' => '',
1723 + 'align' => '',
1724 + 'className' => '',
1725 + 'container_schema' => $this->list_shema['container'],
1726 + 'item_schema' => $this->list_shema['item'],
1727 + 'pages' => false,
1728 + 'paged' => '',
1729 + 'separate_years' => false,
1730 + 'separate_months' => false,
1731 + );
1732 + // Map UI options
1733 + foreach($this->map_interactions as $int_key=>$int_name){
1734 + $defaults[$int_key]=true;
1735 + }
1736 + $atts_old_nb = $defaults['nb'];
1737 + if($id == "event_timeline"){
1738 + $atts_old_nb = intval($atts['nb']);
1739 + $atts['nb'] = -1;
1740 + }
1005 1741
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 - }
1742 + $atts = shortcode_atts(apply_filters('eventpost_params', $defaults, 'list_events', $context), $atts);
1016 1743
1017 - $child = ($type == 'ol' || $type == 'ul') ? 'li' : 'div';
1744 + extract($atts);
1745 + if (!is_array($events)) {
1746 + $events = $this->get_events($atts);
1747 + }
1018 1748
1019 - $list = '';
1749 + $ret = '';
1750 + $this->list_id++;
1751 + if (sizeof($events) > 0) {
1752 + if (!empty($title)) {
1753 + $ret .= wp_kses_post($before_title . esc_html($title) . $after_title);
1754 + }
1020 1755
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 - }
1756 + $type = in_array($type, ['div', 'ul', 'ol']) ? $type : 'div';
1757 + $child = in_array($type, ['ul', 'ol']) ? 'li' : 'div';
1025 1758
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 - }
1759 + $html = '';
1093 1760
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();
1761 + if($id=='event_geolist'){
1762 + $this->load_map_scripts();
1763 + $html.=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);
1764 + }
1765 + $attributes = '';
1766 + $prev_arrow = "";
1767 + $next_arrow = "";
1768 + $item_child_style = "";
1769 + if($id == "event_timeline"){
1770 + $prev_arrow = '<div class="previous"><span class="screen-reader-text">'.__('« Previous Events', 'event-post')."</span></div>";
1771 + $next_arrow = '<div class="next"><span class="screen-reader-text">'.__('Next Events »', 'event-post')."</span></div>";
1772 + if($atts_old_nb != 0){
1773 + $item_child_style = 'width : '.((100/$atts_old_nb) - 2).'%;';
1774 + }
1775 + $attributes .= ' data-nb="'.$atts_old_nb.'"';
1776 + $attributes .= ' data-nb-desktop="'.intval($atts['nb_desktop'] ?? 0).'"';
1777 + $attributes .= ' data-nb-tablet="'.intval($atts['nb_tablet'] ?? 0).'"';
1778 + $attributes .= ' data-nb-mobile="'.intval($atts['nb_mobile'] ?? 0).'"';
1779 + $attributes .= ' data-filter="'.http_build_query($atts).'" ';
1780 + }
1119 1781
1120 - $arg = array(
1121 - 'post_type' => $post_type,
1122 - 'posts_per_page' => $nb,
1123 - 'meta_key' => $orderbykey,
1124 - 'orderby' => $orderby,
1125 - 'order' => $order
1126 - );
1782 + if($id === 'event_timeline'){
1783 + $previous_year = $atts['separate_years'] ? true : false;
1784 + $previous_month = $atts['separate_months'] ? true : false;
1785 + }
1127 1786
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 - }
1787 + foreach ($events as $event) {
1788 + if($id === 'event_timeline'){
1789 + if($previous_year && $previous_year !== date('Y', $event->time_start)){
1790 + $html.= '<div class="event-timeline-separator event-timeline-year"><span class="event-timeline-year-text">'.date_i18n('Y', $event->time_start).'</span></div>';
1791 + $previous_year = date('Y', $event->time_start);
1792 + }
1793 + if($previous_month && $previous_month !== date('Ym', $event->time_start)){
1794 + $html.= '<div class="event-timeline-separator event-timeline-month"><span class="event-timeline-month-text">'.date_i18n('F', $event->time_start).'</span>'.($previous_year ? '' : ' <span class="event-timeline-year-text">'.date_i18n('Y', $event->time_start).'</span>').'</div>';
1795 + $previous_month = date('Ym', $event->time_start);
1796 + }
1797 + }
1798 + $text_price = $this->get_price($event,true);
1799 + $class_item = array(
1800 + $this->is_future($event) ? 'event_future' : 'event_past',
1801 + 'status-'.strtolower(str_replace('Event', '', $event->status)),
1802 + 'location-type-'.strtolower(str_replace('EventAttendanceMode', '', $event->attendance_mode)),
1803 + );
1804 + $taxonomies= get_taxonomies('','names');
1805 + $post_terms = [];
1806 + $terms = wp_get_post_terms($event->ID, $taxonomies);
1807 + foreach($terms as $term){
1808 + $class_item[] = $term->taxonomy.'-'.$term->slug;
1809 + }
1810 + if ($ep_settings['emptylink'] == 0 && empty($event->post_content)) {
1811 + $event->permalink = '#' . $id . $this->list_id;
1812 + }
1813 + elseif(empty($event->permalink)){
1814 + $event->permalink=$event->guid;
1815 + }
1816 + $html.=str_replace(
1817 + apply_filters('eventpost_item_scheme_entities', array(
1818 + '%child%',
1819 + '%class%',
1820 + '%color%',
1821 + '%event_link%',
1822 + '%event_thumbnail%',
1823 + '%event_title%',
1824 + '%event_price%',
1825 + '%event_date%',
1826 + '%event_cat%',
1827 + '%event_location%',
1828 + '%event_excerpt%',
1829 + '%style%',
1830 + )), apply_filters('eventpost_item_scheme_values', array(
1831 + $child,
1832 + implode(' ', $class_item),
1833 + $this->get_post_color($event->ID, $this->settings['default_color'],true),
1834 + $event->permalink,
1835 + $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>' : '',
1836 + $event->post_title,
1837 + $event->post_type == 'product' ? $text_price : '',
1838 + $this->get_singledate($event, '', $context),
1839 + $this->get_singlecat($event, '', $context),
1840 + $this->get_singleloc($event, '', $context),
1841 + $excerpt == true && $event->description!='' ? '<span class="event_exerpt">'.$event->description.'</span>' : '',
1842 + $item_child_style,
1843 + ), $event), $item_schema
1844 + );
1136 1845
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);
1846 + }
1847 + if($id == 'event_geolist'){
1848 + if($height==''){
1849 + $height = '300px';
1850 + }
1851 + if($width==''){
1852 + $width = '100%';
1853 + }
1854 + $attributes .= ' data-tile="'.esc_attr($tile).'"
1855 + data-width="'.esc_attr($width).'"
1856 + data-height="'.esc_attr($height).'"
1857 + data-zoom="'.esc_attr($zoom).'"
1858 + data-map_position="'.esc_attr($map_position).'"
1859 + data-latitude="'.esc_attr($latitude).'"
1860 + data-longitude="'.esc_attr($longitude).'"
1861 + data-pop_element_schema="'.esc_attr($pop_element_schema).'"
1862 + data-htmlPop_element_schema="'.esc_attr($htmlPop_element_schema).'"
1863 + data-list="'.esc_attr($list).'"
1864 + data-disabled-interactions="';
1865 + // add data-position avec ma variables
1866 + foreach($this->map_interactions as $int_key=>$int_name){
1867 + $attributes.=$atts[$int_key]==false ? esc_attr($int_key).', ' : '';
1868 + }
1869 + $attributes.='" ';
1870 + }
1871 + $pagination = '';
1872 + if($pages && $this->pagination){
1873 + global $wp_rewrite;
1874 + $paged = ( get_query_var( 'page' ) ) ? absint( get_query_var( 'page' ) ) : 1;
1875 + $pagination = paginate_links( array(
1876 + 'prev_text' => __('« Previous Events', 'event-post'),
1877 + 'next_text' => __('Next Events »', 'event-post'),
1878 + 'current' => $paged,
1879 + 'total' => $this->pagination['max_num_pages'],
1880 + )
1881 + );
1882 + }
1203 1883
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 - }
1884 + if($context == 'events_only'){
1885 + $ret = $html;
1886 + }else{
1887 + $classes = [
1888 + $class,
1889 + $className,
1890 + 'className',
1891 + $id == 'event_geolist' && $list ? ' has-list list-'.esc_attr($list) : ' no-list',
1892 + ];
1893 + if(!empty($align)){
1894 + $classes[] = 'align'.esc_attr($align);
1895 + }
1896 + if($id === 'event_timeline' && ($previous_year || $previous_month)){
1897 + $classes[] = 'has-time-separators';
1898 + }
1899 + $ret.=str_replace(
1900 + array(
1901 + '%type%',
1902 + '%id%',
1903 + '%class%',
1904 + '%listid%',
1905 + '%style%',
1906 + '%attributes%',
1907 + '%list%',
1908 + '%pagination%',
1909 + '%prev_arrow%',
1910 + '%next_arrow%',
1911 + '%number%'
1912 + ), array(
1913 + $type,
1914 + $id,
1915 + esc_attr(implode(' ', $classes)),
1916 + $id . $this->list_id,
1917 + (!empty($width) ? 'width:' . esc_attr($width) . ';' : '') . (!empty($height) ? 'height:' . esc_attr($height) . ';' : '') . esc_attr($style),
1918 + $attributes,
1919 + $html,
1920 + $pagination,
1921 + $prev_arrow,
1922 + $next_arrow
1923 + ), $container_schema
1924 + );
1925 + }
1235 1926
1236 - $arg['meta_query'] = $meta_query;
1927 + }
1928 + elseif(filter_input(INPUT_POST, 'action')=='bulk_do_shortcode'){
1929 + 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>';
1930 + }
1931 + return apply_filters('eventpost_listevents', $ret, $id.$this->list_id, $atts, $events, $context);
1932 + }
1237 1933
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 1934
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);
1935 + /**
1936 + * Get events
1937 + *
1938 + * @param array $atts
1939 + *
1940 + * @filter eventpost_params
1941 + * @filter eventpost_get_items
1942 + *
1943 + * @return array of post_ids which are events
1944 + */
1945 + public function get_events($atts) {
1946 + if(isset($atts['future'])){
1947 + $atts['future'] = filter_var( $atts['future'], FILTER_VALIDATE_BOOLEAN);
1948 + }
1949 + if(isset($atts['past'])){
1950 + $atts['past'] = filter_var( $atts['past'], FILTER_VALIDATE_BOOLEAN);
1951 + }
1952 + if(isset($atts['geo'])){
1953 + $atts['geo'] = filter_var( $atts['geo'], FILTER_VALIDATE_BOOLEAN);
1954 + }
1955 + if(isset($atts['pages'])){
1956 + $atts['pages'] = filter_var( $atts['pages'], FILTER_VALIDATE_BOOLEAN);
1957 + }
1958 +
1959 +
1960 +
1961 + $requete = (shortcode_atts(apply_filters('eventpost_params', array(
1962 + 'nb' => 5,
1963 + 'future' => true,
1964 + 'past' => false,
1965 + 'geo' => 0,
1966 + 'cat' => '',
1967 + 'tag' => '',
1968 + 'date' => '',
1969 + 'orderby' => 'meta_value',
1970 + 'orderbykey' => $this->META_START,
1971 + 'order' => 'ASC',
1972 + 'tax_name' => '',
1973 + 'tax_term' => '',
1974 + 'paged' => 1,
1975 + 'post_type'=> $this->settings['posttypes']
1976 + ), 'get_events'), $atts));
1977 + if(!isset($requete['paged']) || $requete['paged'] == ""){
1978 + $requete['paged'] = ( get_query_var( 'page' ) ) ? absint( get_query_var( 'page' ) ) : 1;
1979 + }
1980 + extract($requete);
1981 + wp_reset_query();
1982 +
1983 +
1984 + $arg = array(
1985 + 'post_status' => 'publish',
1986 + 'post_type' => $post_type,
1987 + 'posts_per_page' => $nb,
1988 + 'paged' => $paged,
1989 + 'meta_key' => $orderbykey,
1990 + 'orderby' => $orderby,
1991 + 'order' => $order
1992 + );
1993 +
1994 + if($tax_name=='category'){
1995 + $tax_name='';
1996 + $cat=$tax_term;
1997 + }
1998 + elseif($tax_name=='post-tag'){
1999 + $tax_name='';
2000 + $tag=$tax_term;
2001 + }
2002 +
2003 + // CUSTOM TAXONOMY
2004 + if ($tax_name != '' && $tax_term != '') {
2005 + $arg['tax_query'] = array(
2006 + array(
2007 + 'taxonomy' => $tax_name,
2008 + 'field' => 'slug',
2009 + 'terms' => $tax_term,
2010 + ),
2011 + );
2012 + }
2013 + // CAT
2014 + if ($cat != '') {
2015 + if (preg_match('/[a-zA-Z]/i', $cat)) {
2016 + $arg['category_name'] = $cat;
2017 + } else {
2018 + $arg['cat'] = $cat;
2019 + }
2020 + }
2021 + // TAG
2022 + if ($tag != '') {
2023 + $arg['tag'] = $tag;
2024 + }
2025 + // DATES
2026 + $meta_query = array(
2027 + array(
2028 + 'key' => $this->META_END,
2029 + 'value' => '',
2030 + 'compare' => '!='
2031 + ),
2032 + array(
2033 + 'key' => $this->META_END,
2034 + 'value' => '0:0:00 0:',
2035 + 'compare' => '!='
2036 + ),
2037 + array(
2038 + 'key' => $this->META_END,
2039 + 'value' => ':00',
2040 + 'compare' => '!='
2041 + ),
2042 + array(
2043 + 'key' => $this->META_START,
2044 + 'value' => '',
2045 + 'compare' => '!='
2046 + ),
2047 + array(
2048 + 'key' => $this->META_START,
2049 + 'value' => '0:0:00 0:',
2050 + 'compare' => '!='
2051 + )
2052 + );
2053 + if ($future == 0 && $past == 0) {
2054 + $meta_query = array();
2055 + $arg['meta_key'] = null;
2056 + $arg['orderby'] = null;
2057 + $arg['order'] = null;
2058 + }
2059 + elseif ($future == 1 && $past == 0) {
2060 + $meta_query[] = array(
2061 + 'key' => $this->META_END,
2062 + 'value' => current_time('mysql'),
2063 + 'compare' => '>=',
2064 + //'type'=>'DATETIME'
2065 + );
2066 + }
2067 + elseif ($future == 0 && $past == 1) {
2068 + $meta_query[] = array(
2069 + 'key' => $this->META_END,
2070 + 'value' => current_time('mysql'),
2071 + 'compare' => '<=',
2072 + //'type'=>'DATETIME'
2073 + );
2074 + }
2075 + if ($date != '') {
2076 + $date = date('Y-m-d', $date);
2077 +
2078 + $meta_query = array(
2079 + array(
2080 + 'key' => $this->META_END,
2081 + 'value' => $date . ' 00:00:00',
2082 + 'compare' => '>=',
2083 + 'type' => 'DATETIME'
2084 + ),
2085 + array(
2086 + 'key' => $this->META_START,
2087 + 'value' => $date . ' 23:59:59',
2088 + 'compare' => '<=',
2089 + 'type' => 'DATETIME'
2090 + )
2091 + );
2092 + }
2093 + // GEO
2094 + if ($geo == 1) {
2095 + $meta_query[] = array(
2096 + 'key' => $this->META_LAT,
2097 + 'value' => '',
2098 + 'compare' => '!='
2099 + );
2100 + $meta_query[] = array(
2101 + 'key' => $this->META_LONG,
2102 + 'value' => '',
2103 + 'compare' => '!='
2104 + );
2105 + $arg['meta_key'] = $this->META_LAT;
2106 + $arg['orderby'] = 'meta_value';
2107 + $arg['order'] = 'DESC';
2108 + }
2109 +
2110 + $arg['meta_query'] = $meta_query;
2111 +
2112 + $query_md5 = 'eventpost_' . md5(wp_json_encode($requete, true));
2113 + // Check if cache is activated
2114 + if ($this->settings['cache'] == 1 && false !== ( $cached_events = get_transient($query_md5) )) {
2115 + return apply_filters('eventpost_get_items', is_array($cached_events) ? $cached_events : array(), $requete, $arg);
2116 + }
2117 +
2118 + $events = apply_filters('eventpost_get', '', $requete, $arg);
2119 + if ('' === $events) {
2120 + global $wpdb;
2121 + $query = new WP_Query($arg);
2122 + $events = $wpdb->get_col($query->request);
2123 + $this->pagination = array(
2124 + 'found_posts' => $query->found_posts,
2125 + 'max_num_pages' => $query->max_num_pages,
2126 + );
2127 + foreach ($events as $k => $post) {
2128 + $event = $this->retreive($post);
2129 + if ($event != false){
2130 + $events[$k] = $event;
2131 + }
2132 + }
2133 + }
2134 + if ($this->settings['cache'] == 1){
2135 + set_transient($query_md5, $events, 5 * MINUTE_IN_SECONDS);
2136 + }
2137 + return apply_filters('eventpost_get_items', $events, $requete, $arg);
1256 2138 }
1257 - return apply_filters('eventpost_get_items', $events, $requete, $arg);
1258 - }
1259 2139
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 = '';
2140 + /**
2141 + * Checks if the given event is in the future or not
2142 + *
2143 + * @param object $event
2144 + * @param boolean $exact Future status has to be calculated against time or entire day
2145 + *
2146 + * @return boolean
2147 + */
2148 + function is_future($event, $exact=false){
2149 + $match = current_time('timestamp');
2150 + // if EXACT is false, end date is set to begining of the current day
2151 + if(!$exact){
2152 + $match = mktime(0, 0, 0, date('m', $match), date('d', $match), date('Y', $match));
2153 + }
2154 + return ($event->time_end >= $match);
1278 2155 }
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';
2156 +
2157 + /**
2158 + * Checks if the given event is completed or not
2159 + *
2160 + * @param object $event
2161 + * @param boolean $exact Past status has to be calculated against time or entire day
2162 + *
2163 + * @return boolean
2164 + */
2165 + function is_past($event, $exact=false){
2166 + $match = current_time('timestamp');
2167 + // if EXACT is false or full day event, end date is set to end of the current day
2168 + if(!$exact || ( date('H:i:s', $event->time_start) == '00:00:00' && date('H:i:s', $event->time_end) == '00:00:00' )){
2169 + $match = mktime(23, 59, 59, date('m', $match), date('d', $match), date('Y', $match));
2170 + }
2171 + return ($event->time_end < $match);
1294 2172 }
1295 2173
1296 - $EventPost_cache[$ob->ID] = apply_filters('eventpost_retreive', $ob);
1297 - return $EventPost_cache[$ob->ID];
1298 - }
2174 + /**
2175 + * Checks if an event is online
2176 + *
2177 + * @param $event
2178 + *
2179 + * @return boolean
2180 + */
2181 + function is_online($event){
2182 + return (in_array($event->attendance_mode, array('MixedEventAttendanceMode', 'OnlineEventAttendanceMode')));
2183 + }
1299 2184
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);
2185 + /**
2186 + * Checks if an event is offline
2187 + *
2188 + * @param $event
2189 + *
2190 + * @return boolean
2191 + */
2192 + function is_offline($event){
2193 + return (in_array($event->attendance_mode, array('MixedEventAttendanceMode', 'OfflineEventAttendanceMode')));
2194 + }
1308 2195
1309 - if(!$term){
1310 - return $term;
1311 - }
2196 + /**
2197 + * Populates a WP_Post object with event datas
2198 + *
2199 + * @param object $event
2200 + *
2201 + * @return object
2202 + */
2203 + public function retreive($event = null) {
2204 + global $EventPost_cache;
2205 + $ob = get_post($event);
2206 + if(!$ob){
2207 + return false;
2208 + }
2209 + if(is_object($ob) && $ob->start){
2210 + return $ob;
2211 + }
2212 + if(is_object($ob) && isset($EventPost_cache[$ob->ID])){
2213 + return $EventPost_cache[$ob->ID];
2214 + }
2215 + $ob->start = get_post_meta($ob->ID, $this->META_START, true);
2216 + $ob->end = get_post_meta($ob->ID, $this->META_END, true);
2217 + if (!$this->dateisvalid($ob->start)){
2218 + $ob->start = '';
2219 + }
2220 + if (!$this->dateisvalid($ob->end)){
2221 + $ob->end = '';
2222 + }
2223 + $ob->root_ID = $ob->ID;
2224 + $ob->time_start = !empty($ob->start) ? strtotime($ob->start) : '';
2225 + $ob->time_end = !empty($ob->end) ? strtotime($ob->end) : '';
2226 + $ob->virtual_location = get_post_meta($ob->ID, $this->META_VIRTUAL_LOCATION, true);
2227 + $ob->virtual_location = esc_url($ob->virtual_location);
2228 + $ob->organization = get_post_meta($ob->ID, $this->META_ORGANIZATION, true);
2229 + $ob->offer = get_post_meta($ob->ID, $this->META_OFFER, true);
2230 + if(empty($ob->offer)){
2231 + $ob->offer = array(
2232 + 'url' => null,
2233 + 'price' => null,
2234 + 'currency' => null,
2235 + );
2236 + }
2237 + $ob->address = get_post_meta($ob->ID, $this->META_ADD, true);
2238 + $ob->lat = $this->sanitize_coordinate(get_post_meta($ob->ID, $this->META_LAT, true));
2239 + $ob->long = $this->sanitize_coordinate(get_post_meta($ob->ID, $this->META_LONG, true));
2240 + $ob->attendance_mode = (null != $att_mod = get_post_meta($ob->ID, $this->META_ATTENDANCE_MODE, true)) ? $att_mod : array_keys($this->attendance_modes)[0];
2241 + $ob->status = (null != $status = get_post_meta($ob->ID, $this->META_STATUS, true)) ? $status : array_keys($this->statuses)[0];
2242 + $ob->color = $this->get_post_color($ob->ID);
2243 + $ob->icon = $this->get_post_icon($ob->ID);
2244 + $ob->Taxonomies = get_the_category($ob->ID);
2245 + $ob->permalink = get_permalink($ob->ID);
2246 + $ob->blog_id = get_current_blog_id();
2247 + $ob->description = $ob->post_excerpt ? $ob->post_excerpt : str_replace('&nbsp;', ' ', preg_replace("/\n+/", "\n", trim(wp_strip_all_tags(excerpt_remove_blocks($ob->post_content)))));
2248 + $EventPost_cache[$ob->ID] = apply_filters('eventpost_retreive', $ob);
2249 + return $EventPost_cache[$ob->ID];
2250 + }
1312 2251
1313 - $term->start = $term->end = $term->time_start = $term->time_end = Null;
2252 + /**
2253 + * Fetch terms of a post
2254 + *
2255 + * @param mixed $_term
2256 + * @param string $taxonomy
2257 + * @param string $post_type
2258 + */
2259 + public function retreive_term($_term=null, $taxonomy='category', $post_type='post') {
2260 + $term = get_term($_term, $taxonomy);
1314 2261
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 - );
2262 + if(!$term){
2263 + return $term;
2264 + }
1324 2265
1325 - $events = $this->get_events($request);
2266 + $term->start = $term->end = $term->time_start = $term->time_end = Null;
1326 2267
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 - }
2268 + $request = array(
2269 + 'post_type'=>$post_type,
2270 + 'tax_name'=>$term->taxonomy,
2271 + 'tax_term'=>$term->slug,
2272 + 'future'=>true,
2273 + 'past'=>true,
2274 + 'nb'=>-1,
2275 + 'order'=>'ASC'
2276 + );
1334 2277
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 - }
2278 + $events = $this->get_events($request);
1343 2279
1344 - return $term;
2280 + $term->events_count = count($events);
2281 + if($term->events_count){
2282 + $term->start = $events[0]->start;
2283 + $term->time_start = $events[0]->time_start;
2284 + $term->end = $events[$term->events_count-1]->end;
2285 + $term->time_end = $events[$term->events_count-1]->time_end;
2286 + }
1345 2287
1346 - }
2288 + $request['order']='DESC';
2289 + $request['nb']=1;
2290 + $request['orderbykey']=$this->META_END;
2291 + $events = $this->get_events($request);
2292 + if(count($events)){
2293 + $term->end = $events[0]->end;
2294 + $term->time_end = $events[0]->time_end;
2295 + }
1347 2296
1348 - /** ADMIN ISSUES * */
2297 + return $term;
1349 2298
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 2299 }
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 2300
1374 - $language = get_bloginfo('language');
1375 - if (strpos($language, '-') > -1) {
1376 - $language = strtolower(substr($language, 0, 2));
1377 - }
1378 - $colors = $this->get_colors();
1379 - ?>
2301 + // ADMIN ISSUES
1380 2302
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 - ?>
2303 + /**
2304 + * Add custom boxes in posts edit page
2305 + */
2306 + public function add_custom_box() {
2307 + foreach($this->settings['posttypes'] as $posttype){
2308 + add_meta_box(
2309 + 'event_post_date',
2310 + __('Event date', 'event-post'),
2311 + array(&$this, 'inner_custom_box_date'),
2312 + $posttype,
2313 + apply_filters('eventpost_add_custom_box_position', $this->settings['adminpos'], $posttype),
2314 + 'core',
2315 + array(
2316 + '__block_editor_compatible_meta_box' => true,
2317 + )
2318 + );
2319 + add_meta_box(
2320 + 'event_post_loc',
2321 + __('Location', 'event-post'),
2322 + array(&$this, 'inner_custom_box_loc'),
2323 + $posttype,
2324 + apply_filters('eventpost_add_custom_box_position', $this->settings['adminpos'], $posttype),
2325 + 'core',
2326 + array(
2327 + '__block_editor_compatible_meta_box' => true,
2328 + )
2329 + );
2330 + do_action('eventpost_add_custom_box', $posttype);
2331 + }
2332 + }
1448 2333
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>
2334 + /**
2335 + * Displays the date custom box
2336 + */
2337 + public function inner_custom_box_date() {
1455 2338
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 2339
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 2340
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>
2341 + wp_nonce_field(plugin_basename(__FILE__), 'eventpost_nonce');
2342 + $post_id = get_the_ID();
2343 + $event = $this->retreive($post_id);
2344 + if ($event != false){
2345 + $start_date = $event->start;
2346 + $end_date = $event->end;
2347 + $eventcolor = $event->color;
2348 + $eventicon = $event->icon;
1484 2349
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 - }
2350 + $language = get_bloginfo('language');
2351 + if (strpos($language, '-') > -1) {
2352 + $language = strtolower(substr($language, 0, 2));
2353 + }
2354 + $colors = $this->get_colors();
2355 + include (plugin_dir_path(__FILE__) . 'views/admin/custombox-date.php');
2356 + do_action ('eventpost_custom_box_date', $event);
2357 + }
2358 + }
1492 2359
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>
2360 + /**
2361 + * Displays the location custom box
2362 + */
2363 + public function inner_custom_box_loc($post) {
2364 + $event = $this->retreive($post);
2365 + if ($event != false){
2366 + include (plugin_dir_path(__FILE__) . 'views/admin/custombox-location.php');
2367 + do_action ('eventpost_custom_box_loc', $event);
2368 + $this->load_map_scripts();
2369 + }
2370 + }
1509 2371
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>
2372 + public function icon_color_fields($item_id, $meta_color,$value_color,$meta_icon,$value_icon ){
2373 + ?>
2374 + <div class="eventpost-misc-pub-section event-color-section">
2375 + <span class="screen-reader-text"><?php esc_html_e('Color:', 'event-post'); ?></span>
1516 2376
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>
2377 + <input class="color-field-post eventpost-colorpicker"
2378 + type="text"
2379 + name="<?php echo esc_attr($meta_color); ?>"
2380 + value="<?php echo esc_attr($value_color); ?>"
2381 + id="color-field<?php echo esc_attr($item_id); ?>"/>
1534 2382
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>
2383 + <select style="font-family : dashicons;" class="eventpost-iconpicker" name="<?php echo esc_attr($meta_icon); ?>">
2384 + <option value=""><?php esc_attr_e('None','event-post') ?></option>
2385 + <?php
2386 + foreach($this->DashIcons->icons as $class => $unicode){
2387 + ?>
2388 + <option value="<?php echo esc_attr($class) ?>" <?php selected($value_icon, $class, true); ?>>&#x<?php esc_attr_e($unicode) ?>; <?php echo esc_html($class) ?></option><?php // phpcs:ignore WordPress.WP.I18n ?>
2389 + <?php
2390 + }
2391 + ?>
2392 + </select>
2393 + <div class="custom-marker-container">
2394 + <p><?php esc_html_e('An image was found in your custom folder for this color', 'event-post')?> <span class="color-hex"></span> </p>
2395 + <img src="" class="image-marker">
2396 + </div>
2397 + </div>
1549 2398
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 2399
1604 - /**
1605 - *
1606 - * @param string $column_name
1607 - * @param boolean $bulk
1608 - */
2400 + <?php
2401 + }
2402 +
2403 + /**
2404 + * Quick edit
2405 + *
2406 + * @param string $column_name
2407 + * @param boolean $bulk
2408 + */
1609 2409 function quick_edit( $column_name, $post_type, $bulk=false) {
1610 2410
1611 2411 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 - }
2412 + static $eventpostprintNonceBulk = TRUE;
2413 + if ($eventpostprintNonceBulk) {
2414 + $eventpostprintNonceBulk = FALSE;
2415 + }
2416 + $fields = $this->bulk_edit_fields;
2417 + echo '<input type="hidden" name="eventpost-bulk-editor" id="eventpost-bulk-editor" value="eventpost-bulk-editor">';
2418 + }
2419 + else {
2420 + static $eventpostprintNonce = TRUE;
2421 + if ($eventpostprintNonce) {
2422 + $eventpostprintNonce = FALSE;
2423 + }
2424 + $fields = $this->quick_edit_fields;
2425 + }
2426 + wp_nonce_field(plugin_basename(__FILE__), 'eventpost_nonce');
2427 + if(isset($fields[$column_name])): ?>
2428 + <fieldset class="inline-edit-col-left inline-edit-<?php echo esc_attr($column_name); ?>">
2429 + <div class="inline-edit-group">
2430 + <?php foreach ($fields[$column_name] as $fieldname=>$fieldlabel): ?>
2431 + <fieldset class="inline-edit-col inline-edit-<?php echo esc_attr($fieldname); ?>">
2432 + <div class="inline-edit-col column-<?php echo esc_attr($fieldname); ?>">
2433 + <label class="inline-edit-group">
2434 + <span class="title"><?php echo esc_html($fieldlabel); ?></span>
2435 + <span class="input-text-wrap">
2436 + <?php echo wp_kses($this->inline_field($fieldname, $bulk), $this->kses_tags); ?>
2437 + </span>
2438 + </label>
2439 + </div>
2440 + </fieldset>
2441 + <?php endforeach; ?>
2442 + </div>
2443 + </fieldset>
2444 + <?php endif;
2445 + }
1646 2446
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 - }
2447 + /**
2448 + * Inline field in bulk edit
2449 + *
2450 + * @param type $fieldname
2451 + *
2452 + * @return string
2453 + */
2454 + function inline_field($fieldname, $bulk){
2455 + return apply_filters('eventpost_inline_field', '<input name="'.esc_attr($fieldname).'" class="eventpost-inline-'.esc_attr($fieldname).'" value="" type="text">', $fieldname, $bulk);
2456 + }
1655 2457
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 - }
2458 + function inline_field_color($html, $fieldname, $bulk){
2459 + if($fieldname==$this->META_COLOR){
2460 + $html='';
2461 + if($bulk){
2462 + $html.= '<span class="eventpost-bulk-colorpicker-button link">'.esc_html(__('No Change', 'event-post')).'</span>';
2463 + }
2464 + $html .= '
1674 2465
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 - }
2466 + <input class="eventpost-inline-colorpicker eventpost-inline-'.esc_attr($fieldname).' '.($bulk?'is-bulk':'no-bulk').'" type="color" name="'.esc_attr($fieldname).'" >';
2467 + }
2468 + return $html;
2469 + }
2470 + function inline_field_icon($html, $fieldname, $bulk){
2471 + if($fieldname==$this->META_ICON){
2472 + if($bulk){
2473 + $html.= '<span class="eventpost-bulk-icon-button link">'.__('No Change', 'event-post').'</span>';
2474 + }
2475 + $html = '<select class="eventpost-inline-colorpicker eventpost-inline-'.$fieldname.' '.($bulk?'is-bulk':'no-bulk').'"
2476 + type="text"
2477 + name="'.$fieldname.'"
2478 + style="font-family : dashicons">
2479 + <option value="">'.__("None", 'event-post').'</option>';
2480 + foreach($this->DashIcons->icons as $class => $unicode){
2481 + $html .= '<option value="'.$class.'">&#x'.$unicode.'; '.$class.'</option>';
2482 + }
2483 + $html .= '</select>';
1683 2484
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;
2485 + }
2486 + return $html;
1699 2487 }
1700 2488
1701 - if (!wp_verify_nonce(filter_input(INPUT_POST, 'eventpost_nonce', FILTER_SANITIZE_STRING), plugin_basename(__FILE__))){
1702 - return;
2489 +
2490 + /**
2491 + * Bulk edit
2492 + *
2493 + * @param type $column_name
2494 + * @param type $post_type
2495 + */
2496 + function bulk_edit($column_name, $post_type){
2497 + $this->quick_edit($column_name, $post_type, true);
1703 2498 }
1704 2499
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);
2500 + /**
2501 + * Saves data from quick-edit via `wp_ajax_inline-save` action
2502 + *
2503 + * @return void
2504 + */
2505 + function inline_save(){
2506 + $post_id = absint(filter_input(INPUT_POST, 'post_ID', FILTER_SANITIZE_NUMBER_INT));
2507 + $this->save_postdata($post_id);
1720 2508 }
2509 + /**
2510 + * When the post is saved, saves our custom data
2511 + *
2512 + * @param int $post_id
2513 + *
2514 + * @return void
2515 + */
2516 + public function save_postdata($post_id) {
2517 + if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
2518 + return;
2519 + }
1721 2520
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 - }
2521 + if (!wp_verify_nonce((string) filter_input(INPUT_POST, 'eventpost_nonce'), plugin_basename(__FILE__))){
2522 + return;
2523 + }
1736 2524
1737 - $post_ids = (!empty($_POST['post_ids']) ) ? $_POST['post_ids'] : array();
1738 - }
2525 + $post_id = absint($post_id);
2526 + if (!$post_id || !current_user_can('edit_post', $post_id)) {
2527 + return;
2528 + }
1739 2529
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 - }
2530 + // Clean color or no color
2531 + if (false !== $color = filter_input(INPUT_POST, $this->META_COLOR)) {
2532 + update_post_meta($post_id, $this->META_COLOR, sanitize_text_field($color));
2533 + }
2534 + // Clean color or no color
2535 + if (false !== $icon = filter_input(INPUT_POST, $this->META_ICON)) {
2536 + update_post_meta($post_id, $this->META_ICON, sanitize_text_field($icon));
2537 + }
2538 + if (false !== $attendance_mode = filter_input(INPUT_POST, $this->META_ATTENDANCE_MODE)) {
2539 + update_post_meta($post_id, $this->META_ATTENDANCE_MODE, sanitize_text_field($attendance_mode));
2540 + }
2541 + if (false !== $status = filter_input(INPUT_POST, $this->META_STATUS)) {
2542 + update_post_meta($post_id, $this->META_STATUS, sanitize_text_field($status));
2543 + }
2544 + $virtual_location = filter_input(INPUT_POST, $this->META_VIRTUAL_LOCATION, FILTER_SANITIZE_URL);
2545 + if ($virtual_location !== null && $virtual_location !== false) {
2546 + update_post_meta($post_id, $this->META_VIRTUAL_LOCATION, sanitize_url($virtual_location));
2547 + }
2548 + if (false !== $organization = filter_input(INPUT_POST, $this->META_ORGANIZATION)) {
2549 + update_post_meta($post_id, $this->META_ORGANIZATION, sanitize_text_field($organization));
2550 + }
2551 + $offer_url = filter_input(INPUT_POST, "{$this->META_OFFER}_url", FILTER_SANITIZE_URL);
2552 + $offer_price = filter_input(INPUT_POST, "{$this->META_OFFER}_price");
2553 + $offer_currency = filter_input(INPUT_POST, "{$this->META_OFFER}_currency");
2554 + if ($offer_url || ($offer_price && $offer_currency) ) {
2555 + // Format floating
2556 + $offer_price = $offer_price ? str_replace(',', '.', $offer_price) : null;
2557 + update_post_meta($post_id, $this->META_OFFER, array(
2558 + 'url' => $offer_url ? sanitize_text_field($offer_url) : null,
2559 + 'price' => $offer_price ? (float) $offer_price : null,
2560 + 'currency' => $offer_currency ? sanitize_text_field($offer_currency) : null,
2561 + ));
2562 + }
2563 + else{
2564 + delete_post_meta($post_id, $this->META_OFFER);
2565 + }
2566 + // Clean date or no date
2567 + if ((false !== $start = filter_input(INPUT_POST, $this->META_START)) &&
2568 + (false !== $end = filter_input(INPUT_POST, $this->META_END)) &&
2569 + '' != $start &&
2570 + '' != $end) {
2571 + update_post_meta($post_id, $this->META_START, sanitize_text_field(substr($start,0,16).':00'));
2572 + update_post_meta($post_id, $this->META_END, sanitize_text_field(substr($end,0,16).':00'));
2573 + }
2574 + else {
2575 + delete_post_meta($post_id, $this->META_START);
2576 + delete_post_meta($post_id, $this->META_END);
2577 + }
1760 2578
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 - }
2579 + // Clean location or no location
2580 + if ((false !== $lat = filter_input(INPUT_POST, $this->META_LAT)) &&
2581 + (false !== $long = filter_input(INPUT_POST, $this->META_LONG)) &&
2582 + '' != $lat &&
2583 + '' != $long) {
2584 + update_post_meta($post_id, $this->META_ADD, sanitize_text_field(filter_input(INPUT_POST, $this->META_ADD)));
2585 + update_post_meta($post_id, $this->META_LAT, $this->sanitize_coordinate(sanitize_text_field($lat)));
2586 + update_post_meta($post_id, $this->META_LONG, $this->sanitize_coordinate(sanitize_text_field($long)));
2587 + }
2588 + else {
2589 + delete_post_meta($post_id, $this->META_ADD);
2590 + delete_post_meta($post_id, $this->META_LAT);
2591 + delete_post_meta($post_id, $this->META_LONG);
2592 + }
1794 2593
2594 + $post_ids = (!empty($_POST['post_ids']) ) ? $_POST['post_ids'] : array();
2595 + }
1795 2596
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));
2597 + /**
2598 + * Saves data from bulk-edit
2599 + * Uses bulk_edit_posts hook
2600 + *
2601 + * @see https://developer.wordpress.org/reference/hooks/bulk_edit_posts/
2602 + *
2603 + * @return void
2604 + */
2605 + function save_bulkdatas(array $post_ids, array $shared_post_data) {
2606 + if (!wp_verify_nonce(filter_input(INPUT_GET, 'eventpost_nonce'), plugin_basename(__FILE__))){
2607 + return;
2608 + }
2609 + $current_post_type = isset($shared_post_data['post_type']) ? $shared_post_data['post_type'] : 'post';
2610 + if (in_array($current_post_type, $this->settings['posttypes'])) {
2611 + if (!empty($post_ids) && is_array($post_ids)) {
2612 + foreach ($post_ids as $post_id) {
2613 + if(! current_user_can( 'edit_post', $post_id )){
2614 + continue;
2615 + }
2616 + foreach ($this->bulk_edit_fields as $sets) {
2617 + foreach ($sets as $fieldname => $fieldlabel) {
2618 + if (isset($shared_post_data[$fieldname])) {
2619 + update_post_meta($post_id, $fieldname, $shared_post_data[$fieldname]);
2620 + }
2621 + }
2622 + }
2623 + }
2624 + }
2625 + }
2626 + }
1810 2627
1811 - $annee = substr($date, 0, 4);
1812 - $mois = substr($date, 5);
2628 + /**
2629 + * Displays a date for calendar cell
2630 + *
2631 + * @param string $date
2632 + * @param string $cat
2633 + * @param boolean $display
2634 + *
2635 + * @return boolean
2636 + */
2637 + public function display_caldate($date, $cat = '', $display = false, $colored=true, $thumbnail='', $title='',$tax_name='' ,$tax_term='') {
2638 + $events = $this->get_events(array('nb' => -1, 'date' => $date, 'cat' => $cat, 'retreive' => true,'tax_name' => $tax_name ,'tax_term' => $tax_term));
2639 + $nb = count($events);
2640 + $ret = "";
2641 + $price = "";
2642 + if(!$display && !$nb){
2643 + $ret = date('j', $date);
2644 + }
2645 + $price = '';
2646 + if($nb){
2647 + if ($display || $title) {
2648 + $ret='<ul>';
2649 + foreach ($events as $event) {
2650 + $price = $this->get_price($event, true);
2651 + if ($this->settings['emptylink'] == 0 && empty($event->post_content)) {
2652 + $event->guid = '#';
2653 + }
2654 + $ret.='<li>'
2655 + // Translators: %s is the event title
2656 + . '<a href="' . $event->permalink . '" title="'.esc_attr(sprintf(__('View event: %s', 'event-post'), $event->post_title)).'">'
2657 + . '<h4>' . $event->post_title . '</h4>'
2658 + . '<span class="event_price">' . $price . '</span>'
2659 + .$this->get_single($event)
2660 + . (!empty($thumbnail) ? '<span class="event_thumbnail_wrap">' . get_the_post_thumbnail($event->ID, $thumbnail) . '</span>' : '')
2661 + .'</a>'
2662 + . '</li>';
2663 + }
2664 + $ret.='</ul>';
2665 + }
2666 + if ($display) {
2667 + // return $ret;
2668 + }
2669 + elseif($title) {
2670 + $ret = '<span '.($colored?' style="color:#'.$events[0]->color.'"':'').'>'.date('j', $date).'</span>'.$ret;
2671 + }
2672 + else {
2673 + $ret = '<button data-event="'. $tax_term .'" data-date="' . date('Y-m-d', $date).'"'
2674 + .' class="'.apply_filters( 'event_post_class_calendar_link', 'eventpost_cal_link' ).'"'.($colored?' style="background-color:#'.$events[0]->color.'"':'')
2675 + // Translators: %1$d is the number of events, %2$s is the date
2676 + .' 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']))).'"'
2677 + .'>'
2678 + . date('j', $date)
2679 + . '</button>';
2680 + }
2681 + }
2682 + return apply_filters('eventpost_display_caldate', $ret, $events, $date, $cat ,$price, $display ,$colored ,$thumbnail ,$title ,$tax_name ,$tax_term );
2683 + }
1813 2684
1814 - $time = mktime(0, 0, 0, $mois, 1, $annee);
1815 2685
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);
2686 + /**
2687 + * Returns a calendar HTML
2688 + *
2689 + * @param array $atts
2690 + *
2691 + * @filter eventpost_params
2692 + *
2693 + * @return string
2694 + */
2695 + public function calendar($atts) {
2696 + extract(shortcode_atts(apply_filters('eventpost_params', array(
2697 + 'date' => date('Y-n'),
2698 + 'cat' => '',
2699 + 'mondayfirst' => 0, //1 : weeks starts on monday
2700 + 'datepicker' => 1,
2701 + 'colored' => 1,
2702 + 'display_title'=>0,
2703 + 'tax_name' => '',
2704 + 'tax_term' => '',
2705 + 'thumbnail'=>'',
2706 + ), 'calendar'), $atts));
1820 2707
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>';
2708 + if($date && !preg_match('#[0-9][0-9][0-9][0-9]-[0-9][0-9]?#i', $date)){
2709 + $date = date('Y-n', strtotime($date));
2710 + }
2711 + if(!$date){
2712 + $date = date('Y-n');
2713 + }
1854 2714
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;
2715 + $annee = substr($date, 0, 4);
2716 + $mois = substr($date, 5);
1870 2717
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 - }
2718 + $time = mktime(0, 0, 0, $mois, 1, $annee);
1883 2719
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 - }
2720 + $prev_year = strtotime('-1 Year', $time);
2721 + $next_year = strtotime('+1 Year', $time);
2722 + $prev_month = strtotime('-1 Month', $time);
2723 + $next_month = strtotime('+1 Month', $time);
1898 2724
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 - }
2725 + $JourMax = date("t", $time);
2726 + $NoJour = -date("w", $time);
2727 + if ($mondayfirst == 0) {
2728 + $NoJour +=1;
2729 + } else {
2730 + $NoJour +=2;
2731 + $this->Week[] = array_shift($this->Week);
2732 + }
2733 + if ($NoJour > 0 && $mondayfirst == 1) {
2734 + $NoJour -=7;
2735 + }
2736 + $ret = '<table class="event-post-calendar-table">'
2737 + . '<caption class="screen-reader-text">'
2738 + . __('A calendar of events', 'event-post')
2739 + . '</caption>';
2740 + $ret.='<thead><tr><th colspan="7">';
2741 + if ($datepicker == 1) {
2742 + $ret.='<div class="eventpost-calendar-header">';
2743 + // Translators: %s is the year
2744 + $ret.='<span class="eventpost-cal-year"><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 eventpost-cal-bt-prev">&laquo;</button><span class="eventpost-cal-header-text">';
2745 + $ret.=$annee;
2746 + // Translators: %s is the year
2747 + $ret.='</span><button data-date="' . date('Y-n', $next_year) . '" title="'.sprintf(__('Switch to %s', 'event-post'), date('Y', $next_year)).'" class="eventpost_cal_bt eventpost-cal-bt-next">&raquo;</button></span>';
2748 + // Translators: %s is the month name
2749 + $ret.='<span class="eventpost-cal-month"><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 eventpost-cal-bt-prev eventpost-cal-bt-prev-month">&laquo;</button><span class="eventpost-cal-header-text">';
2750 + $ret.=$this->NomDuMois[abs($mois)];
2751 + // Translators: %s is the month name
2752 + $ret.='</span><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 eventpost-cal-bt-next eventpost-cal-bt-next-month">&raquo;</button> </span>';
2753 + $ret.='<span class="eventpost-cal-today"><button data-date="' . date('Y-n') . '" class="eventpost_cal_bt">' . __('Today', 'event-post') . '</button></span>';
2754 + $ret.='</div>';
2755 + }
2756 + $ret.='</th></tr><tr class="event_post_cal_days">';
2757 + for ($w = 0; $w < 7; $w++) {
2758 + $ret.='<th scope="col">' . strtoupper(substr($this->Week[$w], 0, 1)) . '</th>';
2759 + }
2760 + $ret.='</tr>';
2761 + $ret.='</thead>';
1906 2762
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 - }
2763 + $ret.='<tbody>';
2764 + $sqldate = date('Y-m', $time);
2765 + $cejour = date('Y-m-d');
2766 + for ($semaine = 0; $semaine <= 5; $semaine++) { // 6 semaines par mois
2767 + $tr_row_content ='';
2768 + for ($journee = 0; $journee <= 6; $journee++) { // 7 jours par semaine
2769 + if ($NoJour > 0 && $NoJour <= $JourMax) { // si le jour est valide a afficher
2770 + $td = '<td class="event_post_day">';
2771 + if ($sqldate . '-' . ($NoJour<10?'0':'').$NoJour == $cejour) {
2772 + $td = '<td class="event_post_day_now">';
2773 + }
2774 + if ($sqldate . '-' . ($NoJour<10?'0':'').$NoJour < $cejour){
2775 + $td = '<td class="event_post_day_over">'; // Patch ahf
2776 + }
2777 + $tr_row_content.=$td;
2778 + $tr_row_content.= $this->display_caldate(mktime(0, 0, 0, $mois, $NoJour, $annee), $cat, false, $colored, $thumbnail, $display_title ,$tax_name ,$tax_term);
2779 + $tr_row_content.='</td>';
2780 + } else {
2781 + $tr_row_content.='<td></td>';
2782 + }
2783 + $NoJour ++;
2784 + }
2785 + if($tr_row_content){
2786 + $ret.='<tr>'.$tr_row_content.'</tr>';
2787 + }
1917 2788
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++;
2789 + }
2790 + $ret.='</tbody></table>';
2791 + return $ret;
2792 + }
1931 2793
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 : '';
2794 + /**
2795 + * Echoes a list of event, should be called via AJAX
2796 + *
2797 + * @return void
2798 + */
2799 + public function ajaxlist(){
2800 + echo wp_kses($this->list_events(array(
2801 + 'nb' => esc_attr(FILTER_INPUT(INPUT_POST, 'nb')),
2802 + 'future' => esc_attr(FILTER_INPUT(INPUT_POST, 'future')),
2803 + 'past' => esc_attr(FILTER_INPUT(INPUT_POST, 'past')),
2804 + 'geo' => esc_attr(FILTER_INPUT(INPUT_POST, 'geo')),
2805 + 'width' => esc_attr(FILTER_INPUT(INPUT_POST, 'width')),
2806 + 'height' => esc_attr(FILTER_INPUT(INPUT_POST, 'height')),
2807 + 'zoom' => esc_attr(FILTER_INPUT(INPUT_POST, 'zoom')),
2808 + 'tile' => esc_attr(FILTER_INPUT(INPUT_POST, 'tile')),
2809 + 'title' => esc_attr(FILTER_INPUT(INPUT_POST, 'title')),
2810 + 'before_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'before_title')),
2811 + 'after_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'after_title')),
2812 + 'cat' => esc_attr(FILTER_INPUT(INPUT_POST, 'cat')),
2813 + 'tag' => esc_attr(FILTER_INPUT(INPUT_POST, 'tag')),
2814 + 'events' => esc_attr(FILTER_INPUT(INPUT_POST, 'events')),
2815 + 'style' => esc_attr(FILTER_INPUT(INPUT_POST, 'style')),
2816 + 'thumbnail' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail')),
2817 + 'thumbnail_size' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail_size')),
2818 + 'excerpt' => esc_attr(FILTER_INPUT(INPUT_POST, 'excerpt')),
2819 + 'orderby' => esc_attr(FILTER_INPUT(INPUT_POST, 'orderby')),
2820 + 'order' => esc_attr(FILTER_INPUT(INPUT_POST, 'order')),
2821 + 'class' => esc_attr(FILTER_INPUT(INPUT_POST, 'class')),
2822 + 'pages' => esc_attr(FILTER_INPUT(INPUT_POST, 'pages')),
2823 + ), esc_attr(FILTER_INPUT(INPUT_POST, 'list_type'))), $this->kses_tags);
2824 + exit;
2825 + }
1937 2826
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 - }
2827 + /**
2828 + * Echoes a list of event, should be called via AJAX
2829 + *
2830 + * @return void
2831 + */
2832 + public function ajaxTimeline(){
2833 + echo wp_kses($this->list_events(array(
2834 + 'nb' => esc_attr(FILTER_INPUT(INPUT_POST, 'nb')),
2835 + 'future' => esc_attr(FILTER_INPUT(INPUT_POST, 'future')),
2836 + 'past' => esc_attr(FILTER_INPUT(INPUT_POST, 'past')),
2837 + 'geo' => esc_attr(FILTER_INPUT(INPUT_POST, 'geo')),
2838 + 'width' => esc_attr(FILTER_INPUT(INPUT_POST, 'width')),
2839 + 'height' => esc_attr(FILTER_INPUT(INPUT_POST, 'height')),
2840 + 'zoom' => esc_attr(FILTER_INPUT(INPUT_POST, 'zoom')),
2841 + 'tile' => esc_attr(FILTER_INPUT(INPUT_POST, 'tile')),
2842 + 'title' => esc_attr(FILTER_INPUT(INPUT_POST, 'title')),
2843 + 'before_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'before_title')),
2844 + 'after_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'after_title')),
2845 + 'cat' => esc_attr(FILTER_INPUT(INPUT_POST, 'cat')),
2846 + 'tag' => esc_attr(FILTER_INPUT(INPUT_POST, 'tag')),
2847 + 'events' => esc_attr(FILTER_INPUT(INPUT_POST, 'events')),
2848 + 'style' => esc_attr(FILTER_INPUT(INPUT_POST, 'style')),
2849 + 'thumbnail' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail')),
2850 + 'thumbnail_size' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail_size')),
2851 + 'excerpt' => esc_attr(FILTER_INPUT(INPUT_POST, 'excerpt')),
2852 + 'orderby' => esc_attr(FILTER_INPUT(INPUT_POST, 'orderby')),
2853 + 'order' => esc_attr(FILTER_INPUT(INPUT_POST, 'order')),
2854 + 'class' => esc_attr(FILTER_INPUT(INPUT_POST, 'class')),
2855 + 'pages' => esc_attr(FILTER_INPUT(INPUT_POST, 'pages')),
2856 + ), esc_attr(FILTER_INPUT(INPUT_POST, 'list_type'))), $this->kses_tags);
2857 + exit;
2858 + }
2859 + /**
2860 + * Echoes next page of events, should be called via AJAX
2861 + *
2862 + * @return void
2863 + */
2864 + public function ajaxGetNextPage(){
2865 + $response = [
2866 + "success" => false,
2867 + "next_query" => false,
2868 + ];
2869 + if(isset($_POST['query'])){
2870 + parse_str($_POST['query'],$query);
2871 + foreach($query as $key => $value){
2872 + $query[$key] = esc_attr($value);
2873 + }
2874 + if(isset($_POST['paged'])){
2875 + $query["paged"] = esc_attr($_POST['paged']);
2876 + }else{
2877 + $response['message'] = __('Page number missing', 'event-post');
2878 + }
2879 + $query['container_schema'] = $this->timeline_shema['container'];
2880 + $query['item_schema'] = $this->timeline_shema['item'];
2881 + $html = $this->list_events($query,'event_timeline','events_only');
2882 + if($html == ""){
2883 + $response['message'] = __('No more to load', 'event-post');
2884 + }else{
2885 + $query["paged"] = $query["paged"] + 1;
2886 + $next_html = $this->list_events($query,'event_timeline','events_only');
2887 + $response = [
2888 + "success" => true,
2889 + "html" => $html,
2890 + "next_query" => $next_html == "" ? false : true,
2891 + ];
2892 + }
2893 + }else{
2894 + $response['message'] = __('Query missing', 'event-post');
2895 + }
2896 + wp_send_json($response);
2897 + exit;
2898 + }
1946 2899
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');
2900 + /**
2901 + * Echoes the content of the calendar in ajax context
2902 + *
2903 + * @return void
2904 + */
2905 + public function ajaxcal() {
2906 + $method = isset($_GET['action']) ? INPUT_GET : INPUT_POST;
2907 + echo wp_kses($this->calendar(array(
2908 + 'date' => esc_attr(FILTER_INPUT($method, 'date')),
2909 + 'cat' => esc_attr(FILTER_INPUT($method, 'cat')),
2910 + 'mondayfirst' => esc_attr(FILTER_INPUT($method, 'mf')),
2911 + 'datepicker' => esc_attr(FILTER_INPUT($method, 'dp')),
2912 + 'colored' => esc_attr(FILTER_INPUT($method, 'color')),
2913 + 'display_title' => esc_attr(FILTER_INPUT($method, 'display_title')),
2914 + 'thumbnail' => esc_attr(FILTER_INPUT($method, 'thumbnail')),
2915 + 'tax_name' => esc_attr(FILTER_INPUT($method, 'tax_name')),
2916 + 'tax_term' => esc_attr(FILTER_INPUT($method, 'tax_term')),
2917 + )), $this->kses_tags);
2918 + exit();
2919 + }
1951 2920
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 - }
2921 + /**
2922 + * Echoes the date of the calendar in ajax context
2923 + */
2924 + public function ajaxdate() {
2925 + echo wp_kses($this->display_caldate(
2926 + strtotime(esc_attr(FILTER_INPUT(INPUT_GET, 'date'))),
2927 + esc_attr(FILTER_INPUT(INPUT_GET, 'cat')),
2928 + true,
2929 + esc_attr(FILTER_INPUT(INPUT_GET, 'color')),
2930 + esc_attr(FILTER_INPUT(INPUT_GET, 'thumbnail')),
2931 + esc_attr(FILTER_INPUT(INPUT_GET, 'display_title')),
2932 + esc_attr(FILTER_INPUT(INPUT_GET, 'tax_name')),
2933 + esc_attr(FILTER_INPUT(INPUT_GET, 'tax_term'))
2934 + ), $this->kses_tags);
2935 + exit();
2936 + }
1964 2937
1965 - if ($from || $to) {
2938 + /**
2939 + * Echoes a date in ajax context
2940 + */
2941 + public function HumanDate() {
2942 + if (isset($_REQUEST['date']) && !empty($_REQUEST['date'])) {
2943 + $date = strtotime($_REQUEST['date']);
2944 + echo esc_html($this->human_date($date, $this->settings['dateformat']).(date('H:i', $date)=='00:00' ? '' : ' '. date($this->settings['timeformat'], $date)));
2945 + exit();
2946 + }
2947 + }
1966 2948
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 - }
2949 + /**
2950 + * Displays a search form
2951 + *
2952 + * @param type $atts
2953 + *
2954 + * @return type
2955 + */
2956 + public function search($atts) {
2957 + $params = shortcode_atts(apply_filters('eventpost_params', array(
2958 + 'dates' => true,
2959 + 'q' => true,
2960 + 'tax' => false,
2961 + ), 'search'), $atts);
2962 + $this->list_id++;
1992 2963
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 - }
2964 + $list_id = $this->list_id;
2965 + $q = (false !== $q = filter_input(INPUT_GET, 'q')) ? $q : '';
2966 + $from = (false !== $from = filter_input(INPUT_GET, 'from')) ? $from : '';
2967 + $to = (false !== $to = filter_input(INPUT_GET, 'to')) ? $to : '';
2968 + $tax = (false !== $tax = filter_input(INPUT_GET, 'tax')) ? $tax : '';
2018 2969
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 - }
2970 + $cleaned_from = $this->date_cleanup($from);
2971 + $cleaned_to = $this->date_cleanup($to);
2972 + if(empty($cleaned_from)){
2973 + $from=false;
2974 + }
2975 + if(empty($cleaned_to)){
2976 + $to=false;
2977 + }
2030 2978
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);
2979 + // Search form
2980 + $this->admin_scripts(null, true);
2981 + wp_enqueue_style('jquery-ui', plugins_url('/css/jquery-ui.css', __FILE__), false, filemtime( "/$block_js" ));
2982 + include (plugin_dir_path(__FILE__) . 'views/search-form.php');
2041 2983
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';
2984 + // Results
2985 + if ($list_id == filter_input(INPUT_GET, 'evenpost_search')) {
2986 + $arg = array(
2987 + 'post_type' => $this->settings['posttypes'],
2988 + 'meta_key' => $this->META_START,
2989 + 'orderby' => 'meta_value',
2990 + 'order' => 'ASC',
2991 + 's' => $q
2992 + );
2993 + if ($tax) {
2994 + $arg['cat'] = $tax;
2995 + }
2996 +
2997 + if ($from || $to) {
2998 +
2999 + $arg['meta_query'] = array();
3000 + if ($from) {
3001 + $arg['meta_query'][] = array(
3002 + 'key' => $this->META_START,
3003 + 'value' => $from,
3004 + 'compare' => '>=',
3005 + 'type' => 'DATETIME'
3006 + );
3007 + }
3008 + if ($to) {
3009 + $arg['meta_query'][] = $meta_query = array(
3010 + array(
3011 + 'key' => $this->META_END,
3012 + 'value' => $to,
3013 + 'compare' => '<=',
3014 + 'type' => 'DATETIME'
3015 + ),
3016 + );
3017 + }
3018 + }
3019 + $events = new WP_Query($arg);
3020 + include (plugin_dir_path(__FILE__) . 'views/search-results.php');
3021 + wp_reset_query();
2047 3022 }
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 - }
3023 + }
2062 3024
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 - }
3025 + /**
3026 + * Geocodes an address using OpenStreetMap Nominatim API and cache the result in a transient for 30 days
3027 + *
3028 + * @param string $address
3029 + * @param boolean $single_result Whether to return only the first result or all results
3030 + *
3031 + * @return array|false|string The geocoding result(s) or false on failure
3032 + */
3033 + public function geocode(string $address, bool $single_result = false){
3034 + $transient_name = 'eventpost_osquery_' . $address;
3035 + $val = get_transient($transient_name);
3036 + if (false === $val || empty($val) || !is_string($val)) {
3037 + $language = get_bloginfo('language');
3038 + if (strpos($language, '-') > -1) {
3039 + $language = strtolower(substr($language, 0, 2));
3040 + }
3041 + $remote_val = wp_safe_remote_request('https://nominatim.openstreetmap.org/search?q=' . rawurlencode($address) . '&format=json&accept-language=' . $language, [
3042 + 'user-agent' => getenv('HTTP_USER_AGENT') ?? 'WordPress/' . get_bloginfo('version') . '; ' . get_bloginfo('url'),
3043 + 'headers' => [
3044 + 'Referer' => get_bloginfo('url'),
3045 + ],
3046 + 'timeout' => 5,
3047 + ]);
3048 + $remote_body = wp_remote_retrieve_body($remote_val);
3049 + if(strstr($remote_body, '<html>')){
3050 + $val = [
3051 + [
3052 + 'lat' => '',
3053 + 'lon' => '',
3054 + 'display_name' => strip_tags($remote_body),
3055 + ]
3056 + ];
3057 + }
3058 + else{
3059 + $val = json_decode($remote_body);
3060 + if($val){
3061 + set_transient($transient_name, $val, 30 * DAY_IN_SECONDS);
3062 + }
3063 + }
3064 + }
3065 + if($single_result && is_array($val) && count($val) > 0){
3066 + $val = $val[0];
3067 + }
3068 + return $val;
3069 + }
2071 3070
2072 - /** ADMIN PAGES **/
3071 + /**
3072 + * AJAX Get lat long from address
3073 + */
3074 + public function GetLatLong() {
3075 + if (isset($_REQUEST['q']) && !empty($_REQUEST['q'])) {
3076 + // verifier le cache
3077 + $q = $_REQUEST['q'];
3078 + header('Content-Type: application/json');
3079 + $val = $this->geocode($q);
3080 + wp_send_json( $val );
3081 + exit();
3082 + }
3083 + }
2073 3084
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 - }
3085 + /**
3086 + * Alters columns
3087 + *
3088 + * @param array $defaults
3089 + *
3090 + * @filter eventpost_columns_head
3091 + *
3092 + * @return array
3093 + */
3094 + public function columns_head($defaults) {
3095 + $defaults['event'] = __('Event', 'event-post');
3096 + $defaults['location'] = __('Location', 'event-post');
3097 + return apply_filters('eventpost_columns_head', $defaults);
3098 + }
2099 3099
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 - }
3100 + /**
3101 + * Echoes content of a row in a given column
3102 + *
3103 + * @param string $column_name
3104 + * @param int $post_id
3105 + *
3106 + * @action eventpost_columns_content
3107 + */
3108 + public function columns_content($column_name, $post_id) {
3109 + if ($column_name == 'location') {
3110 + $lat = $this->sanitize_coordinate(get_post_meta($post_id, $this->META_LAT, true));
3111 + $lon = $this->sanitize_coordinate(get_post_meta($post_id, $this->META_LONG, true));
2122 3112
2123 - /**
2124 - * @action eventpost_register_settings
2125 - */
2126 - public function register_settings(){
2127 - register_setting( 'eventpost-settings', 'ep_settings' );
3113 + if (!empty($lat) && !empty($lon)) {
3114 + add_thickbox();
3115 + $color = $this->get_post_color($post_id, $this->settings['default_color'], true);
3116 + $icon = $this->get_post_icon($post_id, $this->settings['default_icon'], true);
3117 + if ($color == ''){
3118 + $color = '777777';
3119 + }
3120 + if ($icon == ''){
3121 + $icon = 'location';
3122 + }
3123 + echo wp_kses( '<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">'
3124 + . '<i class="dashicons dashicons-'.$icon.'" style="color:#'.$color.';"></i>'
3125 + . '<span class="screen-reader-text">'.__('View on a map', 'event-post').'</span>'
3126 + . get_post_meta($post_id, $this->META_ADD, true)
3127 + . '</a> ', $this->kses_tags);
3128 + }
3129 + $this->column_edit_hidden_fields($post_id, 'location');
3130 + }
3131 + if ($column_name == 'event') {
3132 + echo wp_kses($this->print_date($post_id, false), $this->kses_tags);
3133 + $this->column_edit_hidden_fields($post_id, 'event');
3134 + }
3135 + do_action('eventpost_columns_content', $column_name, $post_id);
3136 + }
2128 3137
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 - );
3138 + function column_edit_hidden_fields($post_id, $set){
3139 + $event = $this->retreive($post_id);
3140 + $html = '<div class="hidden">';
3141 + if ($event != false){
3142 + foreach($this->quick_edit_fields[$set] as $fieldname=>$fieldlabel){
3143 + $html .= '<span class="inline-edit-value '.$fieldname.'">'.esc_attr($event->$fieldname).'</span>';
3144 + }
3145 + }
3146 + $html .= '</div>';
3147 + echo wp_kses($html, $this->kses_tags);
3148 + }
2184 3149
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 - );
3150 + // ADMIN PAGES
2235 3151
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 - );
3152 + /**
3153 + * Adds items to the native "right now" dashboard widget
3154 + *
3155 + * @param array $elements
3156 + *
3157 + * @return array
3158 + */
3159 + public function dashboard_right_now($elements){
3160 + $nb_date = count($this->get_events(array('future'=>1, 'past'=>1, 'nb'=>-1)));
3161 + $nb_geo = count($this->get_events(array('future'=>1, 'past'=>1, 'geo'=>1, 'nb'=>-1)));
3162 + if($nb_date){
3163 + // Translators: %d is the number of events
3164 + array_push($elements, '<i class="dashicons dashicons-calendar"></i> <i href="edit.php?post_type=post">'.sprintf(__('%d Events','event-post'), $nb_date)."</i>");
3165 + }
3166 + if($nb_geo){
3167 + // Translators: %d is the number of geolocalized events
3168 + 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>");
3169 + }
3170 + return $elements;
3171 + }
2260 3172
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 - );
3173 + /*
3174 + * Feed
3175 + * generate ICS or VCS files from a category
3176 + */
2305 3177
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 - );
3178 + /**
3179 + * Get a date formatted for ICS
3180 + *
3181 + * @param timestamp $timestamp
3182 + *
3183 + * @return string
3184 + */
3185 + public function ics_date($timestamp){
3186 + return date("Ymd",$timestamp).'T'.date("His",$timestamp);
3187 + }
2354 3188
2355 - do_action('eventpost_register_settings');
2356 - }
2357 - function settings_section_callback( $arg ) {
2358 - echo '<hr>';
2359 - }
3189 + public function get_gmt_offset(){
3190 + $gmt_offset = get_option('gmt_offset ');
3191 + $codegmt = 0;
3192 + if ($gmt_offset != 0 && substr($gmt_offset, 0, 1) != '-' && substr($gmt_offset, 0, 1) != '+') {
3193 + $codegmt = $gmt_offset * -1;
3194 + $gmt_offset = '+' . $gmt_offset;
3195 + }
3196 + if(abs($gmt_offset < 10)){
3197 + $gmt_offset = substr($gmt_offset, 0, 1).'0'.substr($gmt_offset, 1);
3198 + }
3199 + return $gmt_offset;
3200 + }
2360 3201
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 - }
3202 + /**
3203 + * Outputs an ICS or VCS file for a given event
3204 + *
3205 + * @param int $event_id
3206 + * @param string $format
3207 + *
3208 + * @return void
3209 + */
3210 + private function generate_ics($event_id, $format){
3211 + $allowed_formats = array('ics', 'vcs');
3212 + $event_id = intval($event_id);
3213 + $format = sanitize_text_field($format);
3214 + if (in_array($format, $allowed_formats)) {
3215 + $export_file = plugin_dir_path(__FILE__) . 'inc/export/' . $format . '.php';
3216 + if (is_numeric($event_id) && file_exists($export_file)) {
3217 + $event = $this->retreive($event_id);
3218 + if($event->post_status != 'publish'){
3219 + wp_die(esc_html__('Event not found.', 'event-post'), 404);
3220 + }
3221 + include $export_file;
3222 + exit;
3223 + }
3224 + }
3225 + wp_die(esc_html__('Invalid request.', 'event-post'), 400);
3226 + }
3227 +
2453 3228
2454 - /*
2455 - * feed
2456 - * generate ICS or VCS files from a category
2457 - */
3229 + public function parse_request(){
3230 + global $wp;
3231 + if (preg_match('#^event-feed#i', $wp->request, $match)) {
3232 + $this->feed();
3233 + exit;
3234 + }
3235 + if (preg_match('#^eventpost/([0-9]*)\.(ics|vcs)#i', $wp->request, $match)) {
3236 + $this->generate_ics($match[1], $match[2]);
3237 + }
3238 + }
2458 3239
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 - }
3240 + public function export(){
3241 + if(false !== $event_id=\filter_input(INPUT_GET, 'event_id',FILTER_SANITIZE_NUMBER_INT)){
3242 + $format = \filter_input(INPUT_GET, 'format');
3243 + $this->generate_ics($event_id, $format);
3244 + }
3245 + }
2467 3246
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 3247
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";
3248 + /**
3249 + * Outputs an ICS document
3250 + *
3251 + * Filters can be applied to the criteria used to retrieve events in GET parameters:
3252 + * - cat : category slug
3253 + * - tag : tag slug
3254 + * - tax_name : custom taxonomy name
3255 + * - tax_term : custom taxonomy term slug
3256 + * - nb : number of events to retrieve (default 10)
3257 + * - future : retreive future events
3258 + * - past : retreive past events
3259 + *
3260 + * @return void
3261 + */
3262 + public function feed(){
3263 + $criteria = array(
3264 + 'nb'=>10,
3265 + );
3266 + if(false !== $cat=\filter_input(INPUT_GET, 'cat')){
3267 + $criteria['cat'] = sanitize_text_field($cat);
3268 + }
3269 + if(false !== $tag=\filter_input(INPUT_GET, 'tag')){
3270 + $criteria['tag'] = sanitize_text_field($tag);
3271 + }
3272 + if(false !== $tax_name=\filter_input(INPUT_GET, 'tax_name')){
3273 + $criteria['tax_name'] = sanitize_text_field($tax_name);
3274 + }
3275 + if(false !== $tax_term=\filter_input(INPUT_GET, 'tax_term')){
3276 + $criteria['tax_term'] = sanitize_text_field($tax_term);
3277 + }
3278 + if(false !== $nb=\filter_input(INPUT_GET, 'nb', FILTER_SANITIZE_NUMBER_INT)){
3279 + $criteria['nb'] = sanitize_text_field($nb);
3280 + }
3281 + if(false !== $future=\filter_input(INPUT_GET, 'future', FILTER_SANITIZE_NUMBER_INT)){
3282 + $criteria['future'] = sanitize_text_field($future);
3283 + }
3284 + if(false !== $past=\filter_input(INPUT_GET, 'past', FILTER_SANITIZE_NUMBER_INT)){
3285 + $criteria['past'] = sanitize_text_field($past);
3286 + }
3287 + $vtz = get_option('timezone_string');
3288 + $gmt = $this->get_gmt_offset();
3289 + date_default_timezone_set($vtz);
3290 + $separator = "\n";
2490 3291
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;" );
3292 + header("content-type:text/calendar");
3293 + header("Pragma: public");
3294 + header("Expires: 0");
3295 + header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
3296 + header("Cache-Control: public");
3297 + header("Content-Disposition: attachment; filename=". str_replace('+','-',rawurlencode(get_option('blogname').'-'.$cat)).".ics;" );
2497 3298
2498 - $props = array();
3299 + $props = array();
2499 3300
2500 - // General
2501 - $props[] = 'BEGIN:VCALENDAR';
2502 - $props[] = 'PRODID://WordPress//Event-Post V'. file_get_contents(('VERSION')).'//EN';
2503 - $props[] = 'VERSION:2.0';
3301 + // General
3302 + $props[] = 'BEGIN:VCALENDAR';
3303 + $props[] = 'PRODID://WordPress//Event-Post-V'.$this->version.'//EN';
3304 + $props[] = 'VERSION:2.0';
3305 + // Timezone
3306 + if(!empty($vtz)){
3307 + array_push($props,
3308 + 'BEGIN:VTIMEZONE',
3309 + 'TZID:'.$vtz,
3310 + 'BEGIN:DAYLIGHT',
3311 + 'TZOFFSETFROM:+0100',
3312 + 'TZOFFSETTO:'.($gmt).'00',
3313 + 'DTSTART:19700329T020000',
3314 + 'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3',
3315 + 'END:DAYLIGHT',
3316 + 'BEGIN:STANDARD',
3317 + 'TZOFFSETFROM:'.($gmt).'00',
3318 + 'TZOFFSETTO:+0100',
3319 + 'TZNAME:CET',
3320 + 'DTSTART:19701025T030000',
3321 + 'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10',
3322 + 'END:STANDARD',
3323 + 'END:VTIMEZONE'
3324 + );
3325 + }
2504 3326
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 - }
3327 + // Events
3328 + $events=$this->get_events($criteria);
3329 + foreach ($events as $event) {
3330 + if($event->time_start && $event->time_end){
3331 + $description = wordwrap(
3332 + str_replace(
3333 + ['\\', ';', ',', "\r", "\n"],
3334 + ['\\\\', '\;', '\,', '', '\n'],
3335 + wp_strip_all_tags($event->description . "\n\n" . $event->permalink)
3336 + ),
3337 + 70,
3338 + "\n ",
3339 + true
3340 + );
3341 + array_push($props,
3342 + 'BEGIN:VEVENT',
3343 + 'CREATED:'.$this->ics_date(strtotime($event->post_date)).'Z',
3344 + 'LAST-MODIFIED:'.$this->ics_date(strtotime($event->post_modified)).'Z',
3345 + 'SUMMARY:'.$event->post_title,
3346 + 'UID:'.md5(site_url()."_eventpost_".$event->ID),
3347 + 'LOCATION:'.str_replace(',','\,',$event->address),
3348 + 'DTSTAMP:'.$this->ics_date($event->time_start).(!empty($vtz)?'':'Z'),
3349 + 'DTSTART'.(!empty($vtz)?';TZID='.$vtz:'').':'.$this->ics_date($event->time_start).(!empty($vtz)?'':'Z'),
3350 + 'DTEND'.(!empty($vtz)?';TZID='.$vtz:'').':'.$this->ics_date($event->time_end).(!empty($vtz)?'':'Z'),
3351 + 'DESCRIPTION:'.$description,
3352 + 'END:VEVENT'
3353 + );
3354 + }
3355 + }
2526 3356
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 - }
3357 + // End
3358 + $props[] = 'END:VCALENDAR';
2543 3359
2544 - // End
2545 - $props[] = 'END:VCALENDAR';
2546 -
2547 - echo implode($separator, $props);
2548 - exit;
3360 + echo esc_html(implode($separator, $props));
3361 + exit;
2549 3362 }
2550 - }
2551 3363 }