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