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 -2435 5.65.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
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,1459 +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 - $item_child_style = 'width : '.((100/$nb) - 2).'%;';
1291 - $attributes .= ' data-nb="'.$nb.'" data-filter="'.http_build_query($atts).'" ';
1292 - }
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 + }
1293 1093
1294 - 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();
1295 1119
1296 - $class_item = array(
1297 - $this->is_future($event) ? 'event_future' : 'event_past',
1298 - 'status-'.$event->status,
1299 - 'location-type-'.$event->attendance_mode,
1300 - );
1301 - $taxonomies= get_taxonomies('','names');
1302 - $post_terms = [];
1303 - $terms = wp_get_post_terms($event->ID, $taxonomies);
1304 - foreach($terms as $term){
1305 - $class_item[] = $term->taxonomy.'-'.$term->name;
1306 - }
1307 - if ($ep_settings['emptylink'] == 0 && empty($event->post_content)) {
1308 - $event->permalink = '#' . $id . $this->list_id;
1309 - }
1310 - elseif(empty($event->permalink)){
1311 - $event->permalink=$event->guid;
1312 - }
1313 - $html.=str_replace(
1314 - apply_filters('eventpost_item_scheme_entities', array(
1315 - '%child%',
1316 - '%class%',
1317 - '%color%',
1318 - '%event_link%',
1319 - '%event_thumbnail%',
1320 - '%event_title%',
1321 - '%event_date%',
1322 - '%event_cat%',
1323 - '%event_location%',
1324 - '%event_excerpt%',
1325 - '%style%',
1326 - )), apply_filters('eventpost_item_scheme_values', array(
1327 - $child,
1328 - implode(' ', $class_item),
1329 - $this->get_post_color($event->ID, $this->settings['default_color'],true),
1330 - $event->permalink,
1331 - $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>' : '',
1332 - $event->post_title,
1333 - $this->get_singledate($event, '', $context),
1334 - $this->get_singlecat($event, '', $context),
1335 - $this->get_singleloc($event, '', $context),
1336 - $excerpt == true && $event->post_excerpt!='' ? '<span class="event_exerpt">'.$event->post_excerpt.'</span>' : '',
1337 - $item_child_style,
1338 - ), $event), $item_schema
1339 - );
1120 + $arg = array(
1121 + 'post_type' => $post_type,
1122 + 'posts_per_page' => $nb,
1123 + 'meta_key' => $orderbykey,
1124 + 'orderby' => $orderby,
1125 + 'order' => $order
1126 + );
1340 1127
1341 - }
1342 - if($id == 'event_geolist'){
1343 - if($height==''){
1344 - $height = '300px';
1345 - }
1346 - if($width==''){
1347 - $width = '100%';
1348 - }
1349 - $attributes .= ' data-tile="'.$tile.'"
1350 - data-width="'.$width.'"
1351 - data-height="'.$height.'"
1352 - data-zoom="'.$zoom.'"
1353 - data-map_position="'.$map_position.'"
1354 - data-latitude="'.$latitude.'"
1355 - data-longitude="'.$longitude.'"
1356 - data-pop_element_schema="'.$pop_element_schema.'"
1357 - data-htmlPop_element_schema="'.esc_attr($htmlPop_element_schema).'"
1358 - data-list="'.$list.'"
1359 - data-disabled-interactions="';
1360 - // add data-position avec ma variables
1361 - foreach($this->map_interactions as $int_key=>$int_name){
1362 - $attributes.=$atts[$int_key]==false ? $int_key.', ' : '';
1363 - }
1364 - $attributes.='" ';
1365 - }
1366 - $pagination = '';
1367 - if($pages && $this->pagination){
1368 - global $wp_rewrite;
1369 - $paged = ( get_query_var( 'page' ) ) ? absint( get_query_var( 'page' ) ) : 1;
1370 - $pagination = paginate_links( array(
1371 - 'prev_text' => __('« Previous Events', 'event-post'),
1372 - 'next_text' => __('Next Events »', 'event-post'),
1373 - 'current' => $paged,
1374 - 'total' => $this->pagination['max_num_pages'],
1375 - )
1376 - );
1377 - }
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 + }
1378 1136
1379 - if($context == 'events_only'){
1380 - $ret = $html;
1381 - }else{
1382 - $ret.=str_replace(
1383 - array(
1384 - '%type%',
1385 - '%id%',
1386 - '%class%',
1387 - '%listid%',
1388 - '%style%',
1389 - '%attributes%',
1390 - '%list%',
1391 - '%pagination%',
1392 - '%prev_arrow%',
1393 - '%next_arrow%',
1394 - '%number%'
1395 - ), array(
1396 - $type,
1397 - $id,
1398 - $class.($className ? ' '.$className : '').($id == 'event_geolist' && $list ? ' has-list list-'.$list : ' no-list'),
1399 - $id . $this->list_id,
1400 - (!empty($width) ? 'width:' . $width . ';' : '') . (!empty($height) ? 'height:' . $height . ';' : '') . $style,
1401 - $attributes,
1402 - $html,
1403 - $pagination,
1404 - $prev_arrow,
1405 - $next_arrow
1406 - ), $container_schema
1407 - );
1408 - }
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);
1409 1203
1410 - }
1411 - elseif(filter_input(INPUT_POST, 'action')=='bulk_do_shortcode'){
1412 - 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>';
1413 - }
1414 - return apply_filters('eventpost_listevents', $ret, $id.$this->list_id, $atts, $events, $context);
1415 - }
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 + }
1416 1235
1236 + $arg['meta_query'] = $meta_query;
1417 1237
1418 - /**
1419 - * get_events
1420 - * @param array $atts
1421 - * @filter eventpost_params
1422 - * @filter eventpost_get_items
1423 - * @return array of post_ids which are events
1424 - */
1425 - public function get_events($atts) {
1426 - if(isset($atts['future'])){
1427 - $atts['future'] = filter_var( $atts['future'], FILTER_VALIDATE_BOOLEAN);
1428 - }
1429 - if(isset($atts['past'])){
1430 - $atts['past'] = filter_var( $atts['past'], FILTER_VALIDATE_BOOLEAN);
1431 - }
1432 - if(isset($atts['geo'])){
1433 - $atts['geo'] = filter_var( $atts['geo'], FILTER_VALIDATE_BOOLEAN);
1434 - }
1435 - if(isset($atts['pages'])){
1436 - $atts['pages'] = filter_var( $atts['pages'], FILTER_VALIDATE_BOOLEAN);
1437 - }
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 + }
1438 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 + }
1439 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 + }
1440 1295
1441 - $requete = (shortcode_atts(apply_filters('eventpost_params', array(
1442 - 'nb' => 5,
1443 - 'future' => true,
1444 - 'past' => false,
1445 - 'geo' => 0,
1446 - 'cat' => '',
1447 - 'tag' => '',
1448 - 'date' => '',
1449 - 'orderby' => 'meta_value',
1450 - 'orderbykey' => $this->META_START,
1451 - 'order' => 'ASC',
1452 - 'tax_name' => '',
1453 - 'tax_term' => '',
1454 - 'paged' => 1,
1455 - 'post_type'=> $this->settings['posttypes']
1456 - ), 'get_events'), $atts));
1457 - if(!isset($requete['paged']) || $requete['paged'] == ""){
1458 - $requete['paged'] = ( get_query_var( 'page' ) ) ? absint( get_query_var( 'page' ) ) : 1;
1459 - }
1460 - extract($requete);
1461 - wp_reset_query();
1296 + $EventPost_cache[$ob->ID] = apply_filters('eventpost_retreive', $ob);
1297 + return $EventPost_cache[$ob->ID];
1298 + }
1462 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);
1463 1308
1464 - $arg = array(
1465 - 'post_status' => 'publish',
1466 - 'post_type' => $post_type,
1467 - 'posts_per_page' => $nb,
1468 - 'paged' => $paged,
1469 - 'meta_key' => $orderbykey,
1470 - 'orderby' => $orderby,
1471 - 'order' => $order
1472 - );
1309 + if(!$term){
1310 + return $term;
1311 + }
1473 1312
1474 - if($tax_name=='category'){
1475 - $tax_name='';
1476 - $cat=$tax_term;
1477 - }
1478 - elseif($tax_name=='post-tag'){
1479 - $tax_name='';
1480 - $tag=$tax_term;
1481 - }
1313 + $term->start = $term->end = $term->time_start = $term->time_end = Null;
1482 1314
1483 - // CUSTOM TAXONOMY
1484 - if ($tax_name != '' && $tax_term != '') {
1485 - $arg['tax_query'] = array(
1486 - array(
1487 - 'taxonomy' => $tax_name,
1488 - 'field' => 'slug',
1489 - 'terms' => $tax_term,
1490 - ),
1491 - );
1492 - }
1493 - // CAT
1494 - if ($cat != '') {
1495 - if (preg_match('/[a-zA-Z]/i', $cat)) {
1496 - $arg['category_name'] = $cat;
1497 - } else {
1498 - $arg['cat'] = $cat;
1499 - }
1500 - }
1501 - // TAG
1502 - if ($tag != '') {
1503 - $arg['tag'] = $tag;
1504 - }
1505 - // DATES
1506 - $meta_query = array(
1507 - array(
1508 - 'key' => $this->META_END,
1509 - 'value' => '',
1510 - 'compare' => '!='
1511 - ),
1512 - array(
1513 - 'key' => $this->META_END,
1514 - 'value' => '0:0:00 0:',
1515 - 'compare' => '!='
1516 - ),
1517 - array(
1518 - 'key' => $this->META_END,
1519 - 'value' => ':00',
1520 - 'compare' => '!='
1521 - ),
1522 - array(
1523 - 'key' => $this->META_START,
1524 - 'value' => '',
1525 - 'compare' => '!='
1526 - ),
1527 - array(
1528 - 'key' => $this->META_START,
1529 - 'value' => '0:0:00 0:',
1530 - 'compare' => '!='
1531 - )
1532 - );
1533 - if ($future == 0 && $past == 0) {
1534 - $meta_query = array();
1535 - $arg['meta_key'] = null;
1536 - $arg['orderby'] = null;
1537 - $arg['order'] = null;
1538 - }
1539 - elseif ($future == 1 && $past == 0) {
1540 - $meta_query[] = array(
1541 - 'key' => $this->META_END,
1542 - 'value' => current_time('mysql'),
1543 - 'compare' => '>=',
1544 - //'type'=>'DATETIME'
1545 - );
1546 - }
1547 - elseif ($future == 0 && $past == 1) {
1548 - $meta_query[] = array(
1549 - 'key' => $this->META_END,
1550 - 'value' => current_time('mysql'),
1551 - 'compare' => '<=',
1552 - //'type'=>'DATETIME'
1553 - );
1554 - }
1555 - if ($date != '') {
1556 - $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 + );
1557 1324
1558 - $meta_query = array(
1559 - array(
1560 - 'key' => $this->META_END,
1561 - 'value' => $date . ' 00:00:00',
1562 - 'compare' => '>=',
1563 - 'type' => 'DATETIME'
1564 - ),
1565 - array(
1566 - 'key' => $this->META_START,
1567 - 'value' => $date . ' 23:59:59',
1568 - 'compare' => '<=',
1569 - 'type' => 'DATETIME'
1570 - )
1571 - );
1572 - }
1573 - // GEO
1574 - if ($geo == 1) {
1575 - $meta_query[] = array(
1576 - 'key' => $this->META_LAT,
1577 - 'value' => '',
1578 - 'compare' => '!='
1579 - );
1580 - $meta_query[] = array(
1581 - 'key' => $this->META_LONG,
1582 - 'value' => '',
1583 - 'compare' => '!='
1584 - );
1585 - $arg['meta_key'] = $this->META_LAT;
1586 - $arg['orderby'] = 'meta_value';
1587 - $arg['order'] = 'DESC';
1588 - }
1325 + $events = $this->get_events($request);
1589 1326
1590 - $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 + }
1591 1334
1592 - $query_md5 = 'eventpost_' . md5(var_export($requete, true));
1593 - // Check if cache is activated
1594 - if ($this->settings['cache'] == 1 && false !== ( $cached_events = get_transient($query_md5) )) {
1595 - return apply_filters('eventpost_get_items', is_array($cached_events) ? $cached_events : array(), $requete, $arg);
1596 - }
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 + }
1597 1343
1598 - $events = apply_filters('eventpost_get', '', $requete, $arg);
1599 - if ('' === $events) {
1600 - global $wpdb;
1601 - $query = new WP_Query($arg);
1602 - $events = $wpdb->get_col($query->request);
1603 - $this->pagination = array(
1604 - 'found_posts' => $query->found_posts,
1605 - 'max_num_pages' => $query->max_num_pages,
1606 - );
1607 - foreach ($events as $k => $post) {
1608 - $event = $this->retreive($post);
1609 - $events[$k] = $event;
1610 - }
1611 - }
1612 - if ($this->settings['cache'] == 1){
1613 - set_transient($query_md5, $events, 5 * MINUTE_IN_SECONDS);
1614 - }
1615 - return apply_filters('eventpost_get_items', $events, $requete, $arg);
1616 - }
1344 + return $term;
1617 1345
1618 - /**
1619 - * Checks if the given event is in the future or not
1620 - *
1621 - * @param object $event
1622 - * @param boolean $exact Future status has to be calculated against time or entire day
1623 - * @return boolean
1624 - */
1625 - function is_future($event, $exact=false){
1626 - $match = current_time('timestamp');
1627 - // if EXACT is false, end date is set to begining of the current day
1628 - if(!$exact){
1629 - $match = mktime(0, 0, 0, date('m', $match), date('d', $match), date('Y', $match));
1630 - }
1631 - return ($event->time_end >= $match);
1632 - }
1346 + }
1633 1347
1634 - /**
1635 - * Checks if the given event is completed or not
1636 - *
1637 - * @param object $event
1638 - * @param boolean $exact Past status has to be calculated against time or entire day
1639 - * @return boolean
1640 - */
1641 - function is_past($event, $exact=false){
1642 - $match = current_time('timestamp');
1643 - // if EXACT is false or full day event, end date is set to end of the current day
1644 - if(!$exact || ( date('H:i:s', $event->time_start) == '00:00:00' && date('H:i:s', $event->time_end) == '00:00:00' )){
1645 - $match = mktime(23, 59, 59, date('m', $match), date('d', $match), date('Y', $match));
1646 - }
1647 - return ($event->time_end < $match);
1648 - }
1348 + /** ADMIN ISSUES * */
1649 1349
1650 - /**
1651 - * Checks if an event is online
1652 - * @param $event
1653 - * @return boolean
1654 - */
1655 - function is_online($event){
1656 - 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');
1657 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;
1658 1373
1659 - /**
1660 - * Checks if an event is offline
1661 - * @param $event
1662 - * @return boolean
1663 - */
1664 - function is_offline($event){
1665 - return (in_array($event->attendance_mode, array('MixedEventAttendanceMode', 'OfflineEventAttendanceMode')));
1666 - }
1374 + $language = get_bloginfo('language');
1375 + if (strpos($language, '-') > -1) {
1376 + $language = strtolower(substr($language, 0, 2));
1377 + }
1378 + $colors = $this->get_colors();
1379 + ?>
1667 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 + ?>
1668 1448
1669 - /**
1670 - *
1671 - * @param object $event
1672 - * @return object
1673 - */
1674 - public function retreive($event = null) {
1675 - global $EventPost_cache;
1676 - $ob = get_post($event);
1677 - if(is_object($ob) && $ob->start){
1678 - return $ob;
1679 - }
1680 - if(is_object($ob) && isset($EventPost_cache[$ob->ID])){
1681 - return $EventPost_cache[$ob->ID];
1682 - }
1683 - $ob->start = get_post_meta($ob->ID, $this->META_START, true);
1684 - $ob->end = get_post_meta($ob->ID, $this->META_END, true);
1685 - if (!$this->dateisvalid($ob->start)){
1686 - $ob->start = '';
1687 - }
1688 - if (!$this->dateisvalid($ob->end)){
1689 - $ob->end = '';
1690 - }
1691 - $ob->root_ID = $ob->ID;
1692 - $ob->time_start = !empty($ob->start) ? strtotime($ob->start) : '';
1693 - $ob->time_end = !empty($ob->end) ? strtotime($ob->end) : '';
1694 - $ob->virtual_location = get_post_meta($ob->ID, $this->META_VIRTUAL_LOCATION, true);
1695 - $ob->address = get_post_meta($ob->ID, $this->META_ADD, true);
1696 - $ob->lat = get_post_meta($ob->ID, $this->META_LAT, true);
1697 - $ob->long = get_post_meta($ob->ID, $this->META_LONG, true);
1698 - $ob->attendance_mode = (null != $att_mod = get_post_meta($ob->ID, $this->META_ATTENDANCE_MODE, true)) ? $att_mod : array_keys($this->attendance_modes)[0];
1699 - $ob->status = (null != $status = get_post_meta($ob->ID, $this->META_STATUS, true)) ? $status : array_keys($this->statuses)[0];
1700 - $ob->color = $this->get_post_color($ob->ID);
1701 - $ob->icon = $this->get_post_icon($ob->ID);
1702 - $ob->categories = get_the_category($ob->ID);
1703 - $ob->permalink = get_permalink($ob->ID);
1704 - $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>
1705 1455
1706 - $EventPost_cache[$ob->ID] = apply_filters('eventpost_retreive', $ob);
1707 - return $EventPost_cache[$ob->ID];
1708 - }
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>
1709 1462
1710 - /**
1711 - *
1712 - * @param mixte $_term
1713 - * @param string $taxonomy
1714 - * @param string $post_type
1715 - */
1716 - public function retreive_term($_term=null, $taxonomy='category', $post_type='post') {
1717 - $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>
1718 1471
1719 - if(!$term){
1720 - return $term;
1721 - }
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>
1722 1484
1723 - $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 + }
1724 1492
1725 - $request = array(
1726 - 'post_type'=>$post_type,
1727 - 'tax_name'=>$term->taxonomy,
1728 - 'tax_term'=>$term->slug,
1729 - 'future'=>true,
1730 - 'past'=>true,
1731 - 'nb'=>-1,
1732 - 'order'=>'ASC'
1733 - );
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>
1734 1509
1735 - $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>
1736 1516
1737 - $term->events_count = count($events);
1738 - if($term->events_count){
1739 - $term->start = $events[0]->start;
1740 - $term->time_start = $events[0]->time_start;
1741 - $term->end = $events[$term->events_count-1]->end;
1742 - $term->time_end = $events[$term->events_count-1]->time_end;
1743 - }
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>
1744 1534
1745 - $request['order']='DESC';
1746 - $request['nb']=1;
1747 - $request['orderbykey']=$this->META_END;
1748 - $events = $this->get_events($request);
1749 - if(count($events)){
1750 - $term->end = $events[0]->end;
1751 - $term->time_end = $events[0]->time_end;
1752 - }
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>
1753 1549
1754 - 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 + }
1755 1603
1756 - }
1604 + /**
1605 + *
1606 + * @param string $column_name
1607 + * @param boolean $bulk
1608 + */
1609 + function quick_edit( $column_name, $post_type, $bulk=false) {
1757 1610
1758 - /** 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 + }
1759 1646
1760 - /**
1761 - * add custom boxes in posts edit page
1762 - */
1763 - public function add_custom_box() {
1764 - foreach($this->settings['posttypes'] as $posttype){
1765 - add_meta_box(
1766 - 'event_post_date',
1767 - __('Event date', 'event-post'),
1768 - array(&$this, 'inner_custom_box_date'),
1769 - $posttype,
1770 - apply_filters('eventpost_add_custom_box_position', $this->settings['adminpos'], $posttype),
1771 - 'core',
1772 - array(
1773 - '__block_editor_compatible_meta_box' => true,
1774 - )
1775 - );
1776 - add_meta_box(
1777 - 'event_post_loc',
1778 - __('Location', 'event-post'),
1779 - array(&$this, 'inner_custom_box_loc'),
1780 - $posttype,
1781 - apply_filters('eventpost_add_custom_box_position', $this->settings['adminpos'], $posttype),
1782 - 'core',
1783 - array(
1784 - '__block_editor_compatible_meta_box' => true,
1785 - )
1786 - );
1787 - do_action('eventpost_add_custom_box', $posttype);
1788 - }
1789 - }
1790 - /**
1791 - * display the date custom box
1792 - */
1793 - 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 + }
1794 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 + }
1795 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 + }
1796 1683
1797 - wp_nonce_field(plugin_basename(__FILE__), 'eventpost_nonce');
1798 - $post_id = get_the_ID();
1799 - $event = $this->retreive($post_id);
1800 - $start_date = $event->start;
1801 - $end_date = $event->end;
1802 - $eventcolor = $event->color;
1803 - $eventicon = $event->icon;
1804 -
1805 - $language = get_bloginfo('language');
1806 - if (strpos($language, '-') > -1) {
1807 - $language = strtolower(substr($language, 0, 2));
1808 - }
1809 - $colors = $this->get_colors();
1810 - include (plugin_dir_path(__FILE__) . 'views/admin/custombox-date.php');
1811 - 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;
1812 1699 }
1813 - /**
1814 - * displays the location custom box
1815 - */
1816 - public function inner_custom_box_loc($post) {
1817 - $event = $this->retreive($post);
1818 - include (plugin_dir_path(__FILE__) . 'views/admin/custombox-location.php');
1819 - do_action ('eventpost_custom_box_loc', $event);
1820 - $this->load_map_scripts();
1821 - }
1822 1700
1823 - public function icon_color_fields($item_id, $meta_color,$value_color,$meta_icon,$value_icon ){
1824 - ?>
1825 - <div class="eventpost-misc-pub-section event-color-section">
1826 - <span class="screen-reader-text"><?php _e('Color:', 'event-post'); ?></span>
1827 -
1828 - <input class="color-field-post eventpost-colorpicker"
1829 - type="text"
1830 - name="<?php echo $meta_color; ?>"
1831 - value="<?php echo $value_color; ?>"
1832 - id="color-field<?php echo $item_id; ?>"/>
1833 -
1834 - <select style="font-family : dashicons;" class="eventpost-iconpicker" name="<?php echo $meta_icon; ?>">
1835 - <option value=""><?php echo __('None','event-post') ?></option>
1836 - <?php
1837 - foreach($this->DashIcons->icons as $class => $unicode){
1838 - ?>
1839 - <option value="<?php echo $class ?>" <?php selected($value_icon, $class, true); ?>>&#x<?php echo $unicode ?>; <?php echo $class ?></option>
1840 - <?php
1841 - }
1842 - ?>
1843 - </select>
1844 - <div class="custom-marker-container">
1845 - <p><?php echo __('An image was found in your custom folder for this color', 'event-post')?> <span class="color-hex"></span> </p>
1846 - <img src="" class="image-marker">
1847 - </div>
1848 - </div>
1849 -
1850 -
1851 - <?php
1701 + if (!wp_verify_nonce(filter_input(INPUT_POST, 'eventpost_nonce', FILTER_SANITIZE_STRING), plugin_basename(__FILE__))){
1702 + return;
1852 1703 }
1853 1704
1854 - /**
1855 - *
1856 - * @param string $column_name
1857 - * @param boolean $bulk
1858 - */
1859 - function quick_edit( $column_name, $post_type, $bulk=false) {
1860 -
1861 - if ($bulk) {
1862 - static $eventpostprintNonceBulk = TRUE;
1863 - if ($eventpostprintNonceBulk) {
1864 - $eventpostprintNonceBulk = FALSE;
1865 - }
1866 - $fields = $this->bulk_edit_fields;
1867 - echo '<input type="hidden" name="eventpost-bulk-editor" id="eventpost-bulk-editor" value="eventpost-bulk-editor">';
1868 - }
1869 - else {
1870 - static $eventpostprintNonce = TRUE;
1871 - if ($eventpostprintNonce) {
1872 - $eventpostprintNonce = FALSE;
1873 - }
1874 - $fields = $this->quick_edit_fields;
1875 - }
1876 - wp_nonce_field(plugin_basename(__FILE__), 'eventpost_nonce');
1877 - if(isset($fields[$column_name])): ?>
1878 - <fieldset class="inline-edit-col-left inline-edit-<?php echo $column_name; ?>">
1879 - <div class="inline-edit-group">
1880 - <?php foreach ($fields[$column_name] as $fieldname=>$fieldlabel): ?>
1881 - <fieldset class="inline-edit-col inline-edit-<?php echo $fieldname; ?>">
1882 - <div class="inline-edit-col column-<?php echo $fieldname; ?>">
1883 - <label class="inline-edit-group">
1884 - <span class="title"><?php echo $fieldlabel; ?></span>
1885 - <span class="input-text-wrap">
1886 - <?php echo $this->inline_field($fieldname, $bulk); ?>
1887 - </span>
1888 - </label>
1889 - </div>
1890 - </fieldset>
1891 - <?php endforeach; ?>
1892 - </div>
1893 - </fieldset>
1894 - <?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);
1895 1720 }
1896 1721
1897 - /**
1898 - *
1899 - * @param type $fieldname
1900 - * @return type
1901 - */
1902 - function inline_field($fieldname, $bulk){
1903 - 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);
1904 1730 }
1905 -
1906 - function inline_field_color($html, $fieldname, $bulk){
1907 - if($fieldname==$this->META_COLOR){
1908 - $html='';
1909 - if($bulk){
1910 - $html.= '<span class="eventpost-bulk-colorpicker-button link">'.__('No Change', 'event-post').'</span>';
1911 - }
1912 - $html .= '
1913 -
1914 - <input class="eventpost-inline-colorpicker eventpost-inline-'.$fieldname.' '.($bulk?'is-bulk':'no-bulk').'" type="text" name="'.$fieldname.'" >';
1915 - }
1916 - 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);
1917 1735 }
1918 - function inline_field_icon($html, $fieldname, $bulk){
1919 - if($fieldname==$this->META_ICON){
1920 - if($bulk){
1921 - $html.= '<span class="eventpost-bulk-icon-button link">'.__('No Change', 'event-post').'</span>';
1922 - }
1923 - $html = '<select class="eventpost-inline-colorpicker eventpost-inline-'.$fieldname.' '.($bulk?'is-bulk':'no-bulk').'"
1924 - type="text"
1925 - name="'.$fieldname.'"
1926 - style="font-family : dashicons">
1927 - <option value="">'.__("None", 'event-post').'</option>';
1928 - foreach($this->DashIcons->icons as $class => $unicode){
1929 - $html .= '<option value="'.$class.'">&#x'.$unicode.'; '.$class.'</option>';
1930 1736
1931 - }
1932 - $html .= '</select>';
1737 + $post_ids = (!empty($_POST['post_ids']) ) ? $_POST['post_ids'] : array();
1738 + }
1933 1739
1934 - }
1935 - return $html;
1936 - }
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 + }
1937 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 + }
1938 1794
1939 - /**
1940 - *
1941 - * @param type $column_name
1942 - * @param type $post_type
1943 - */
1944 - function bulk_edit($column_name, $post_type){
1945 - $this->quick_edit($column_name, $post_type, true);
1946 - }
1947 1795
1948 - /**
1949 - * Saves data from quick-edit via `wp_ajax_inline-save` action
1950 - * @return void
1951 - */
1952 - function inline_save(){
1953 - $post_id = filter_input(INPUT_POST, 'post_ID', FILTER_SANITIZE_NUMBER_INT);
1954 - $this->save_postdata($post_id);
1955 - }
1956 - /**
1957 - * When the post is saved, saves our custom data
1958 - * @param int $post_id
1959 - * @return void
1960 - */
1961 - public function save_postdata($post_id) {
1962 - if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
1963 - return;
1964 - }
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));
1965 1810
1966 - if (!wp_verify_nonce(filter_input(INPUT_POST, 'eventpost_nonce', FILTER_SANITIZE_STRING), plugin_basename(__FILE__))){
1967 - return;
1968 - }
1811 + $annee = substr($date, 0, 4);
1812 + $mois = substr($date, 5);
1969 1813
1970 - // Clean color or no color
1971 - if (false !== $color = filter_input(INPUT_POST, $this->META_COLOR, FILTER_SANITIZE_STRING)) {
1972 - update_post_meta($post_id, $this->META_COLOR, $color);
1973 - }
1974 - // Clean color or no color
1975 - if (false !== $icon = filter_input(INPUT_POST, $this->META_ICON, FILTER_SANITIZE_STRING)) {
1976 - update_post_meta($post_id, $this->META_ICON, $icon);
1977 - }
1978 - if (false !== $attendance_mode = filter_input(INPUT_POST, $this->META_ATTENDANCE_MODE, FILTER_SANITIZE_STRING)) {
1979 - update_post_meta($post_id, $this->META_ATTENDANCE_MODE, $attendance_mode);
1980 - }
1981 - if (false !== $status = filter_input(INPUT_POST, $this->META_STATUS, FILTER_SANITIZE_STRING)) {
1982 - update_post_meta($post_id, $this->META_STATUS, $status);
1983 - }
1984 - if (false !== $virtual_location = filter_input(INPUT_POST, $this->META_VIRTUAL_LOCATION, FILTER_SANITIZE_URL)) {
1985 - update_post_meta($post_id, $this->META_VIRTUAL_LOCATION, $virtual_location);
1986 - }
1987 - // Clean date or no date
1988 - if ((false !== $start = filter_input(INPUT_POST, $this->META_START, FILTER_SANITIZE_STRING)) &&
1989 - (false !== $end = filter_input(INPUT_POST, $this->META_END, FILTER_SANITIZE_STRING)) &&
1990 - '' != $start &&
1991 - '' != $end) {
1992 - update_post_meta($post_id, $this->META_START, substr($start,0,16).':00');
1993 - update_post_meta($post_id, $this->META_END, substr($end,0,16).':00');
1994 - }
1995 - else {
1996 - delete_post_meta($post_id, $this->META_START);
1997 - delete_post_meta($post_id, $this->META_END);
1998 - }
1814 + $time = mktime(0, 0, 0, $mois, 1, $annee);
1999 1815
2000 - // Clean location or no location
2001 - if ((false !== $lat = filter_input(INPUT_POST, $this->META_LAT, FILTER_SANITIZE_STRING)) &&
2002 - (false !== $long = filter_input(INPUT_POST, $this->META_LONG, FILTER_SANITIZE_STRING)) &&
2003 - '' != $lat &&
2004 - '' != $long) {
2005 - update_post_meta($post_id, $this->META_ADD, filter_input(INPUT_POST, $this->META_ADD, FILTER_SANITIZE_STRING));
2006 - update_post_meta($post_id, $this->META_LAT, $lat);
2007 - update_post_meta($post_id, $this->META_LONG, $long);
2008 - }
2009 - else {
2010 - delete_post_meta($post_id, $this->META_ADD);
2011 - delete_post_meta($post_id, $this->META_LAT);
2012 - delete_post_meta($post_id, $this->META_LONG);
2013 - }
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);
2014 1820
2015 - $post_ids = (!empty($_POST['post_ids']) ) ? $_POST['post_ids'] : array();
2016 - }
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>';
2017 1854
2018 - /**
2019 - * Saves data from bulk-edit
2020 - * Should be used via AJAX
2021 - *
2022 - * outputs JSON
2023 - * @return void
2024 - */
2025 - function save_bulkdatas() {
2026 - $current_post_type = isset($_POST['post_type']) ? $_POST['post_type'] : 'post';
2027 - if (in_array($current_post_type, $this->settings['posttypes'])) {
2028 - $post_ids = (!empty($_POST['post_ids']) ) ? $_POST['post_ids'] : array();
2029 - if (!empty($post_ids) && is_array($post_ids)) {
2030 - foreach ($this->bulk_edit_fields as $sets) {
2031 - foreach ($sets as $fieldname => $fieldlabel) {
2032 - if ((false != $value = filter_input(INPUT_POST, $fieldname))) {
2033 - foreach ($post_ids as $post_id) {
2034 - update_post_meta($post_id, $fieldname, $value);
2035 - }
2036 - }
2037 - }
2038 - }
2039 - }
2040 - wp_send_json(true);
2041 - exit;
2042 - }
2043 - wp_send_json(false);
2044 - }
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;
2045 1870
2046 - /**
2047 - *
2048 - * @param string $date
2049 - * @param string $cat
2050 - * @param boolean $display
2051 - * @return boolean
2052 - */
2053 - public function display_caldate($date, $cat = '', $display = false, $colored=true, $thumbnail='', $title='',$tax_name='' ,$tax_term='') {
2054 - $events = $this->get_events(array('nb' => -1, 'date' => $date, 'cat' => $cat, 'retreive' => true,'tax_name' => $tax_name ,'tax_term' => $tax_term));
2055 - $nb = count($events);
2056 - $ret = "";
2057 - if(!$display && !$nb){
2058 - $ret = date('j', $date);
2059 - }
2060 - if($nb){
2061 - if ($display || $title) {
2062 - $ret='<ul>';
2063 - foreach ($events as $event) {
2064 - if ($this->settings['emptylink'] == 0 && empty($event->post_content)) {
2065 - $event->guid = '#';
2066 - }
2067 - $ret.='<li>'
2068 - . '<a href="' . $event->permalink . '" title="'.esc_attr(sprintf(__('View event: %s', 'event-post'), $event->post_title)).'">'
2069 - . '<h4>' . $event->post_title . '</h4>'
2070 - .$this->get_single($event)
2071 - . (!empty($thumbnail) ? '<span class="event_thumbnail_wrap">' . get_the_post_thumbnail($event->ID, $thumbnail) . '</span>' : '')
2072 - .'</a>'
2073 - . '</li>';
2074 - }
2075 - $ret.='</ul>';
2076 - }
2077 - if ($display) {
2078 - // return $ret;
2079 - }
2080 - elseif($title) {
2081 - $ret = '<span '.($colored?' style="color:#'.$events[0]->color.'"':'').'>'.date('j', $date).'</span>'.$ret;
2082 - }
2083 - else {
2084 - $ret = '<button data-event="'. $tax_term .'" data-date="' . date('Y-m-d', $date).'"'
2085 - .' class="'.apply_filters( 'event_post_class_calendar_link', 'eventpost_cal_link' ).'"'.($colored?' style="background-color:#'.$events[0]->color.'"':'')
2086 - .' 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']))).'"'
2087 - .'>'
2088 - . date('j', $date)
2089 - . '</button>';
2090 - }
2091 - }
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 + }
2092 1883
2093 - return apply_filters('eventpost_display_caldate', $ret, $events, $date, $cat ,$display ,$colored ,$thumbnail ,$title ,$tax_name ,$tax_term );
2094 - }
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 + }
2095 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 + }
2096 1906
2097 - /**
2098 - * @param array $atts
2099 - * @filter eventpost_params
2100 - * @return string
2101 - */
2102 - public function calendar($atts) {
2103 - extract(shortcode_atts(apply_filters('eventpost_params', array(
2104 - 'date' => date('Y-n'),
2105 - 'cat' => '',
2106 - 'mondayfirst' => 0, //1 : weeks starts on monday
2107 - 'datepicker' => 1,
2108 - 'colored' => 1,
2109 - 'display_title'=>0,
2110 - 'tax_name' => '',
2111 - 'tax_term' => '',
2112 - 'thumbnail'=>'',
2113 - ), '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 + }
2114 1917
2115 - if($date && !preg_match('#[0-9][0-9][0-9][0-9]-[0-9][0-9]?#i', $date)){
2116 - $date = date('Y-n', strtotime($date));
2117 - }
2118 - if(!$date){
2119 - $date = date('Y-n');
2120 - }
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++;
2121 1931
2122 - $annee = substr($date, 0, 4);
2123 - $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 : '';
2124 1937
2125 - $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 + }
2126 1946
2127 - $prev_year = strtotime('-1 Year', $time);
2128 - $next_year = strtotime('+1 Year', $time);
2129 - $prev_month = strtotime('-1 Month', $time);
2130 - $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');
2131 1951
2132 - $JourMax = date("t", $time);
2133 - $NoJour = -date("w", $time);
2134 - if ($mondayfirst == 0) {
2135 - $NoJour +=1;
2136 - } else {
2137 - $NoJour +=2;
2138 - $this->Week[] = array_shift($this->Week);
2139 - }
2140 - if ($NoJour > 0 && $mondayfirst == 1) {
2141 - $NoJour -=7;
2142 - }
2143 - $ret = '<table class="event-post-calendar-table">'
2144 - . '<caption class="screen-reader-text">'
2145 - . __('A calendar of events', 'event-post')
2146 - . '</caption>';
2147 - $ret.='<thead><tr><th colspan="7">';
2148 - if ($datepicker == 1) {
2149 - $ret.='<div class="eventpost-calendar-header">';
2150 - $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">';
2151 - $ret.=$annee;
2152 - $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>';
2153 - $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">';
2154 - $ret.=$this->NomDuMois[abs($mois)];
2155 - $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>';
2156 - $ret.='<span class="eventpost-cal-today"><button data-date="' . date('Y-n') . '" class="eventpost_cal_bt">' . __('Today', 'event-post') . '</button></span>';
2157 - $ret.='</div>';
2158 - }
2159 - $ret.='</th></tr><tr class="event_post_cal_days">';
2160 - for ($w = 0; $w < 7; $w++) {
2161 - $ret.='<th scope="col">' . strtoupper(substr($this->Week[$w], 0, 1)) . '</th>';
2162 - }
2163 - $ret.='</tr>';
2164 - $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 + }
2165 1964
2166 - $ret.='<tbody>';
2167 - $sqldate = date('Y-m', $time);
2168 - $cejour = date('Y-m-d');
2169 - for ($semaine = 0; $semaine <= 5; $semaine++) { // 6 semaines par mois
2170 - $tr_row_content ='';
2171 - for ($journee = 0; $journee <= 6; $journee++) { // 7 jours par semaine
2172 - if ($NoJour > 0 && $NoJour <= $JourMax) { // si le jour est valide a afficher
2173 - $td = '<td class="event_post_day">';
2174 - if ($sqldate . '-' . ($NoJour<10?'0':'').$NoJour == $cejour) {
2175 - $td = '<td class="event_post_day_now">';
2176 - }
2177 - if ($sqldate . '-' . ($NoJour<10?'0':'').$NoJour < $cejour){
2178 - $td = '<td class="event_post_day_over">'; // Patch ahf
2179 - }
2180 - $tr_row_content.=$td;
2181 - $tr_row_content.= $this->display_caldate(mktime(0, 0, 0, $mois, $NoJour, $annee), $cat, false, $colored, $thumbnail, $display_title ,$tax_name ,$tax_term);
2182 - $tr_row_content.='</td>';
2183 - } else {
2184 - $tr_row_content.='<td></td>';
2185 - }
2186 - $NoJour ++;
2187 - }
2188 - if($tr_row_content){
2189 - $ret.='<tr>'.$tr_row_content.'</tr>';
2190 - }
1965 + if ($from || $to) {
2191 1966
2192 - }
2193 - $ret.='</tbody></table>';
2194 - return $ret;
2195 - }
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 + }
2196 1992
2197 - /**
2198 - * echoes a list of event, should be called via AJAX
2199 - *
2200 - * @return void
2201 - */
2202 - public function ajaxlist(){
2203 - echo $this->list_events(array(
2204 - 'nb' => esc_attr(FILTER_INPUT(INPUT_POST, 'nb')),
2205 - 'future' => esc_attr(FILTER_INPUT(INPUT_POST, 'future')),
2206 - 'past' => esc_attr(FILTER_INPUT(INPUT_POST, 'past')),
2207 - 'geo' => esc_attr(FILTER_INPUT(INPUT_POST, 'geo')),
2208 - 'width' => esc_attr(FILTER_INPUT(INPUT_POST, 'width')),
2209 - 'height' => esc_attr(FILTER_INPUT(INPUT_POST, 'height')),
2210 - 'zoom' => esc_attr(FILTER_INPUT(INPUT_POST, 'zoom')),
2211 - 'tile' => esc_attr(FILTER_INPUT(INPUT_POST, 'tile')),
2212 - 'title' => esc_attr(FILTER_INPUT(INPUT_POST, 'title')),
2213 - 'before_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'before_title')),
2214 - 'after_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'after_title')),
2215 - 'cat' => esc_attr(FILTER_INPUT(INPUT_POST, 'cat')),
2216 - 'tag' => esc_attr(FILTER_INPUT(INPUT_POST, 'tag')),
2217 - 'events' => esc_attr(FILTER_INPUT(INPUT_POST, 'events')),
2218 - 'style' => esc_attr(FILTER_INPUT(INPUT_POST, 'style')),
2219 - 'thumbnail' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail')),
2220 - 'thumbnail_size' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail_size')),
2221 - 'excerpt' => esc_attr(FILTER_INPUT(INPUT_POST, 'excerpt')),
2222 - 'orderby' => esc_attr(FILTER_INPUT(INPUT_POST, 'orderby')),
2223 - 'order' => esc_attr(FILTER_INPUT(INPUT_POST, 'order')),
2224 - 'class' => esc_attr(FILTER_INPUT(INPUT_POST, 'class')),
2225 - 'pages' => esc_attr(FILTER_INPUT(INPUT_POST, 'pages')),
2226 - ), esc_attr(FILTER_INPUT(INPUT_POST, 'list_type')));
2227 - exit;
2228 - }
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 + }
2229 2018
2230 - /**
2231 - * echoes a list of event, should be called via AJAX
2232 - *
2233 - * @return void
2234 - */
2235 - public function ajaxTimeline(){
2236 - echo $this->list_events(array(
2237 - 'nb' => esc_attr(FILTER_INPUT(INPUT_POST, 'nb')),
2238 - 'future' => esc_attr(FILTER_INPUT(INPUT_POST, 'future')),
2239 - 'past' => esc_attr(FILTER_INPUT(INPUT_POST, 'past')),
2240 - 'geo' => esc_attr(FILTER_INPUT(INPUT_POST, 'geo')),
2241 - 'width' => esc_attr(FILTER_INPUT(INPUT_POST, 'width')),
2242 - 'height' => esc_attr(FILTER_INPUT(INPUT_POST, 'height')),
2243 - 'zoom' => esc_attr(FILTER_INPUT(INPUT_POST, 'zoom')),
2244 - 'tile' => esc_attr(FILTER_INPUT(INPUT_POST, 'tile')),
2245 - 'title' => esc_attr(FILTER_INPUT(INPUT_POST, 'title')),
2246 - 'before_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'before_title')),
2247 - 'after_title' => esc_attr(FILTER_INPUT(INPUT_POST, 'after_title')),
2248 - 'cat' => esc_attr(FILTER_INPUT(INPUT_POST, 'cat')),
2249 - 'tag' => esc_attr(FILTER_INPUT(INPUT_POST, 'tag')),
2250 - 'events' => esc_attr(FILTER_INPUT(INPUT_POST, 'events')),
2251 - 'style' => esc_attr(FILTER_INPUT(INPUT_POST, 'style')),
2252 - 'thumbnail' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail')),
2253 - 'thumbnail_size' => esc_attr(FILTER_INPUT(INPUT_POST, 'thumbnail_size')),
2254 - 'excerpt' => esc_attr(FILTER_INPUT(INPUT_POST, 'excerpt')),
2255 - 'orderby' => esc_attr(FILTER_INPUT(INPUT_POST, 'orderby')),
2256 - 'order' => esc_attr(FILTER_INPUT(INPUT_POST, 'order')),
2257 - 'class' => esc_attr(FILTER_INPUT(INPUT_POST, 'class')),
2258 - 'pages' => esc_attr(FILTER_INPUT(INPUT_POST, 'pages')),
2259 - ), esc_attr(FILTER_INPUT(INPUT_POST, 'list_type')));
2260 - exit;
2261 - }
2262 - /**
2263 - * echoes next page of events, should be called via AJAX
2264 - *
2265 - * @return void
2266 - */
2267 - public function ajaxGetNextPage(){
2268 - $response = [
2269 - "success" => false,
2270 - "next_query" => false,
2271 - ];
2272 - if(isset($_POST['query'])){
2273 - parse_str($_POST['query'],$query);
2274 - foreach($query as $key => $value){
2275 - $query[$key] = esc_attr($value);
2276 - }
2277 - if(isset($_POST['paged'])){
2278 - $query["paged"] = esc_attr($_POST['paged']);
2279 - }else{
2280 - $response['message'] = __('Page number missing');
2281 - }
2282 - $query['container_schema'] = $this->timeline_shema['container'];
2283 - $query['item_schema'] = $this->timeline_shema['item'];
2284 - $html = $this->list_events($query,'event_timeline','events_only');
2285 - if($html == ""){
2286 - $response['message'] = __('No more to load');
2287 - }else{
2288 - $query["paged"] = $query["paged"] + 1;
2289 - $next_html = $this->list_events($query,'event_timeline','events_only');
2290 - $response = [
2291 - "success" => true,
2292 - "html" => $html,
2293 - "next_query" => $next_html == "" ? false : true,
2294 - ];
2295 - }
2296 - }else{
2297 - $response['message'] = __('Query missing');
2298 - }
2299 - wp_send_json($response);
2300 - exit;
2301 - }
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 + }
2302 2030
2303 - /**
2304 - * echoes the content of the calendar in ajax context
2305 - * @return void
2306 - */
2307 - public function ajaxcal() {
2308 - $method = isset($_GET['action']) ? INPUT_GET : INPUT_POST;
2309 - echo $this->calendar(array(
2310 - 'date' => esc_attr(FILTER_INPUT($method, 'date')),
2311 - 'cat' => esc_attr(FILTER_INPUT($method, 'cat')),
2312 - 'mondayfirst' => esc_attr(FILTER_INPUT($method, 'mf')),
2313 - 'datepicker' => esc_attr(FILTER_INPUT($method, 'dp')),
2314 - 'colored' => esc_attr(FILTER_INPUT($method, 'color')),
2315 - 'display_title' => esc_attr(FILTER_INPUT($method, 'display_title')),
2316 - 'thumbnail' => esc_attr(FILTER_INPUT($method, 'thumbnail')),
2317 - 'tax_name' => esc_attr(FILTER_INPUT($method, 'tax_name')),
2318 - 'tax_term' => esc_attr(FILTER_INPUT($method, 'tax_term')),
2319 - ));
2320 - exit();
2321 - }
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);
2322 2041
2323 - /**
2324 - * echoes the date of the calendar in ajax context
2325 - */
2326 - public function ajaxdate() {
2327 - echo $this->display_caldate(
2328 - strtotime(esc_attr(FILTER_INPUT(INPUT_GET, 'date'))),
2329 - esc_attr(FILTER_INPUT(INPUT_GET, 'cat')),
2330 - true,
2331 - esc_attr(FILTER_INPUT(INPUT_GET, 'color')),
2332 - esc_attr(FILTER_INPUT(INPUT_GET, 'thumbnail')),
2333 - esc_attr(FILTER_INPUT(INPUT_GET, 'display_title')),
2334 - esc_attr(FILTER_INPUT(INPUT_GET, 'tax_name')),
2335 - esc_attr(FILTER_INPUT(INPUT_GET, 'tax_term'))
2336 - );
2337 - exit();
2338 - }
2339 -
2340 - /**
2341 - * echoes a date in ajax context
2342 - */
2343 - public function HumanDate() {
2344 - if (isset($_REQUEST['date']) && !empty($_REQUEST['date'])) {
2345 - $date = strtotime($_REQUEST['date']);
2346 - echo $this->human_date($date, $this->settings['dateformat']).(date('H:i', $date)=='00:00' ? '' : ' '. date($this->settings['timeformat'], $date));
2347 - 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';
2348 2047 }
2349 - }
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 + }
2350 2062
2351 - /**
2352 - * Displays a search form
2353 - *
2354 - * @param type $atts
2355 - * @return type
2356 - */
2357 - public function search($atts) {
2358 - $params = shortcode_atts(apply_filters('eventpost_params', array(
2359 - 'dates' => true,
2360 - 'q' => true,
2361 - 'tax' => false,
2362 - ), 'search'), $atts);
2363 - $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 + }
2364 2071
2365 - $list_id = $this->list_id;
2366 - $q = (false !== $q = filter_input(INPUT_GET, 'q')) ? $q : '';
2367 - $from = (false !== $from = filter_input(INPUT_GET, 'from')) ? $from : '';
2368 - $to = (false !== $to = filter_input(INPUT_GET, 'to')) ? $to : '';
2369 - $tax = (false !== $tax = filter_input(INPUT_GET, 'tax')) ? $tax : '';
2072 + /** ADMIN PAGES **/
2370 2073
2371 - $cleaned_from = $this->date_cleanup($from);
2372 - $cleaned_to = $this->date_cleanup($to);
2373 - if(empty($cleaned_from)){
2374 - $from=false;
2375 - }
2376 - if(empty($cleaned_to)){
2377 - $to=false;
2378 - }
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 + }
2379 2099
2380 - // Search form
2381 - $this->admin_scripts(null, true);
2382 - wp_enqueue_style('jquery-ui', plugins_url('/css/jquery-ui.css', __FILE__), false, filemtime( "/$block_js" ));
2383 - 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 + }
2384 2122
2385 - // Results
2386 - if ($list_id == filter_input(INPUT_GET, 'evenpost_search')) {
2387 - $arg = array(
2388 - 'post_type' => $this->settings['posttypes'],
2389 - 'meta_key' => $this->META_START,
2390 - 'orderby' => 'meta_value',
2391 - 'order' => 'ASC',
2392 - 's' => $q
2393 - );
2394 - if ($tax) {
2395 - $arg['cat'] = $tax;
2396 - }
2123 + /**
2124 + * @action eventpost_register_settings
2125 + */
2126 + public function register_settings(){
2127 + register_setting( 'eventpost-settings', 'ep_settings' );
2397 2128
2398 - 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 + );
2399 2184
2400 - $arg['meta_query'] = array();
2401 - if ($from) {
2402 - $arg['meta_query'][] = array(
2403 - 'key' => $this->META_START,
2404 - 'value' => $from,
2405 - 'compare' => '>=',
2406 - 'type' => 'DATETIME'
2407 - );
2408 - }
2409 - if ($to) {
2410 - $arg['meta_query'][] = $meta_query = array(
2411 - array(
2412 - 'key' => $this->META_END,
2413 - 'value' => $to,
2414 - 'compare' => '<=',
2415 - 'type' => 'DATETIME'
2416 - ),
2417 - );
2418 - }
2419 - }
2420 - $events = new WP_Query($arg);
2421 - include (plugin_dir_path(__FILE__) . 'views/search-results.php');
2422 - wp_reset_query();
2423 - }
2424 - }
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 + );
2425 2235
2426 - /**
2427 - * AJAX Get lat long from address
2428 - */
2429 - public function GetLatLong() {
2430 - if (isset($_REQUEST['q']) && !empty($_REQUEST['q'])) {
2431 - // verifier le cache
2432 - $q = $_REQUEST['q'];
2433 - header('Content-Type: application/json');
2434 - $transient_name = 'eventpost_osquery_' . $q;
2435 - $val = get_transient($transient_name);
2436 - if (false === $val || empty($val) || !is_string($val)) {
2437 - $language = get_bloginfo('language');
2438 - if (strpos($language, '-') > -1) {
2439 - $language = strtolower(substr($language, 0, 2));
2440 - }
2441 - $remote_val = wp_safe_remote_request('http://nominatim.openstreetmap.org/search?q=' . urlencode($q) . '&format=json&accept-language=' . $language);
2442 - if(json_decode($remote_val['body'])){
2443 - $val = $remote_val['body'];
2444 - }
2445 - set_transient($transient_name, $val, 30 * DAY_IN_SECONDS);
2446 - }
2447 - echo $val;
2448 - exit();
2449 - }
2450 - }
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 + );
2451 2260
2452 - /**
2453 - * alters columns
2454 - * @param array $defaults
2455 - * @return array
2456 - * @filter eventpost_columns_head
2457 - */
2458 - public function columns_head($defaults) {
2459 - $defaults['event'] = __('Event', 'event-post');
2460 - $defaults['location'] = __('Location', 'event-post');
2461 - return apply_filters('eventpost_columns_head', $defaults);
2462 - }
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 + );
2463 2305
2464 - /**
2465 - * echoes content of a row in a given column
2466 - * @param string $column_name
2467 - * @param int $post_id
2468 - * @action eventpost_columns_content
2469 - */
2470 - public function columns_content($column_name, $post_id) {
2471 - if ($column_name == 'location') {
2472 - $lat = get_post_meta($post_id, $this->META_LAT, true);
2473 - $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 + );
2474 2354
2475 - if (!empty($lat) && !empty($lon)) {
2476 - add_thickbox();
2477 - $color = $this->get_post_color($post_id, $this->settings['default_color'], true);
2478 - $icon = $this->get_post_icon($post_id, $this->settings['default_icon'], true);
2479 - if ($color == ''){
2480 - $color = '777777';
2481 - }
2482 - if ($icon == ''){
2483 - $icon = 'location';
2484 - }
2485 - 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">'
2486 - . '<i class="dashicons dashicons-'.$icon.'" style="color:#'.$color.';"></i>'
2487 - . '<span class="screen-reader-text">'.__('View on a map', 'event-post').'</span>'
2488 - . get_post_meta($post_id, $this->META_ADD, true)
2489 - . '</a> ';
2490 - }
2491 - $this->column_edit_hidden_fields($post_id, 'location');
2492 - }
2493 - if ($column_name == 'event') {
2494 - echo $this->print_date($post_id, false);
2495 - $this->column_edit_hidden_fields($post_id, 'event');
2496 - }
2497 - do_action('eventpost_columns_content', $column_name, $post_id);
2498 - }
2355 + do_action('eventpost_register_settings');
2356 + }
2357 + function settings_section_callback( $arg ) {
2358 + echo '<hr>';
2359 + }
2499 2360
2500 - function column_edit_hidden_fields($post_id, $set){
2501 - $event = $this->retreive($post_id);
2502 - echo '<div class="hidden">';
2503 - foreach($this->quick_edit_fields[$set] as $fieldname=>$fieldlabel){
2504 - echo'<span class="inline-edit-value '.$fieldname.'">'.esc_attr($event->$fieldname).'</span>';
2505 - }
2506 - echo '</div>';
2507 - }
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 + }
2508 2453
2509 - /** ADMIN PAGES **/
2454 + /*
2455 + * feed
2456 + * generate ICS or VCS files from a category
2457 + */
2510 2458
2511 - /**
2512 - * adds items to the native "right now" dashboard widget
2513 - * @param array $elements
2514 - * @return array
2515 - */
2516 - public function dashboard_right_now($elements){
2517 - $nb_date = count($this->get_events(array('future'=>1, 'past'=>1, 'nb'=>-1)));
2518 - $nb_geo = count($this->get_events(array('future'=>1, 'past'=>1, 'geo'=>1, 'nb'=>-1)));
2519 - if($nb_date){
2520 - array_push($elements, '<i class="dashicons dashicons-calendar"></i> <i href="edit.php?post_type=post">'.sprintf(__('%d Events','event-post'), $nb_date)."</i>");
2521 - }
2522 - if($nb_geo){
2523 - 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>");
2524 - }
2525 - return $elements;
2526 - }
2527 -
2528 - /*
2529 - * feed
2530 - * generate ICS or VCS files from a category
2531 - */
2532 -
2533 - /**
2534 - *
2535 - * @param timestamp $timestamp
2536 - * @return string
2537 - */
2538 - public function ics_date($timestamp){
2459 + /**
2460 + *
2461 + * @param timestamp $timestamp
2462 + * @return string
2463 + */
2464 + public function ics_date($timestamp){
2539 2465 return date("Ymd",$timestamp).'T'.date("His",$timestamp);
2540 - }
2466 + }
2541 2467
2542 - public function get_gmt_offset(){
2543 - $gmt_offset = get_option('gmt_offset ');
2544 - $codegmt = 0;
2545 - if ($gmt_offset != 0 && substr($gmt_offset, 0, 1) != '-' && substr($gmt_offset, 0, 1) != '+') {
2546 - $codegmt = $gmt_offset * -1;
2547 - $gmt_offset = '+' . $gmt_offset;
2548 - }
2549 - if(abs($gmt_offset < 10)){
2550 - $gmt_offset = substr($gmt_offset, 0, 1).'0'.substr($gmt_offset, 1);
2551 - }
2552 - return $gmt_offset;
2553 - }
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 + }
2554 2480
2555 - private function generate_ics($event_id, $format){
2556 - $export_file = plugin_dir_path(__FILE__).'inc/export/'.$format.'.php';
2557 - if(is_numeric($event_id) && file_exists($export_file)){
2558 - $event = $this->retreive($event_id);
2559 - include $export_file;
2560 - exit;
2561 - }
2562 - }
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";
2563 2490
2564 - public function parse_request(){
2565 - global $wp;
2566 - if (preg_match('#^event-feed#i', $wp->request, $match)) {
2567 - $this->feed();
2568 - exit;
2569 - }
2570 - if (preg_match('#^eventpost/([0-9]*)\.(ics|vcs)#i', $wp->request, $match)) {
2571 - $this->generate_ics($match[1], $match[2]);
2572 - }
2573 - }
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;" );
2574 2497
2575 - public function export(){
2576 - if(false !== $event_id=\filter_input(INPUT_GET, 'event_id',FILTER_SANITIZE_NUMBER_INT)){
2577 - $format = \filter_input(INPUT_GET, 'format',FILTER_SANITIZE_STRING);
2578 - $this->generate_ics($event_id, $format);
2579 - }
2580 - }
2498 + $props = array();
2581 2499
2500 + // General
2501 + $props[] = 'BEGIN:VCALENDAR';
2502 + $props[] = 'PRODID://WordPress//Event-Post V'. file_get_contents(('VERSION')).'//EN';
2503 + $props[] = 'VERSION:2.0';
2582 2504
2583 - /**
2584 - * outputs an ICS document
2585 - */
2586 - public function feed(){
2587 - if(false !== $cat=\filter_input(INPUT_GET, 'cat',FILTER_SANITIZE_STRING)){
2588 - $vtz = get_option('timezone_string');
2589 - $gmt = $this->get_gmt_offset();
2590 - date_default_timezone_set($vtz);
2591 - $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 + }
2592 2526
2593 - header("content-type:text/calendar");
2594 - header("Pragma: public");
2595 - header("Expires: 0");
2596 - header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
2597 - header("Cache-Control: public");
2598 - 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 + }
2599 2543
2600 - $props = array();
2544 + // End
2545 + $props[] = 'END:VCALENDAR';
2601 2546
2602 - // General
2603 - $props[] = 'BEGIN:VCALENDAR';
2604 - $props[] = 'PRODID://WordPress//Event-Post-V'. file_get_contents(('VERSION')).'//EN';
2605 - $props[] = 'VERSION:2.0';
2606 -
2607 - // Timezone
2608 - if(!empty($vtz)){
2609 - array_push($props,
2610 - 'BEGIN:VTIMEZONE',
2611 - 'TZID:'.$vtz,
2612 - 'BEGIN:DAYLIGHT',
2613 - 'TZOFFSETFROM:+0100',
2614 - 'TZOFFSETTO:'.($gmt).'00',
2615 - 'DTSTART:19700329T020000',
2616 - 'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3',
2617 - 'END:DAYLIGHT',
2618 - 'BEGIN:STANDARD',
2619 - 'TZOFFSETFROM:'.($gmt).'00',
2620 - 'TZOFFSETTO:+0100',
2621 - 'TZNAME:CET',
2622 - 'DTSTART:19701025T030000',
2623 - 'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10',
2624 - 'END:STANDARD',
2625 - 'END:VTIMEZONE'
2626 - );
2627 - }
2628 -
2629 - // Events
2630 - $events=$this->get_events(array('cat'=>$cat,'nb'=>-1));
2631 - foreach ($events as $event) {
2632 - if($event->time_start && $event->time_end){
2633 - array_push($props,
2634 - 'BEGIN:VEVENT',
2635 - 'CREATED:'.$this->ics_date(strtotime($event->post_date)).'Z',
2636 - 'LAST-MODIFIED:'.$this->ics_date(strtotime($event->post_modified)).'Z',
2637 - 'SUMMARY:'.$event->post_title,
2638 - 'UID:'.md5(site_url()."_eventpost_".$event->ID),
2639 - 'LOCATION:'.str_replace(',','\,',$event->address),
2640 - 'DTSTAMP:'.$this->ics_date($event->time_start).(!empty($vtz)?'':'Z'),
2641 - 'DTSTART'.(!empty($vtz)?';TZID='.$vtz:'').':'.$this->ics_date($event->time_start).(!empty($vtz)?'':'Z'),
2642 - 'DTEND'.(!empty($vtz)?';TZID='.$vtz:'').':'.$this->ics_date($event->time_end).(!empty($vtz)?'':'Z'),
2643 - 'DESCRIPTION:'.trim(chunk_split($event->post_excerpt."\\n\\n".$event->permalink, 60, "\n")),
2644 - 'END:VEVENT'
2645 - );
2646 - }
2647 - }
2648 -
2649 - // End
2650 - $props[] = 'END:VCALENDAR';
2651 -
2652 - echo implode($separator, $props);
2653 - exit;
2654 - }
2547 + echo implode($separator, $props);
2548 + exit;
2655 2549 }
2550 + }
2656 2551 }