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