PluginProbe
SupportCandy – AI Customer Support Ticket System & Live Chatbot Agent / 3.4.7
SupportCandy – AI Customer Support Ticket System & Live Chatbot Agent v3.4.7
3.5.3 3.5.2 3.5.1 3.4.9 3.5.0 3.4.8 3.4.7 trunk 2.3.1 3.3.6 3.3.7 3.3.8 3.3.9 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6
supportcandy / includes / class-wpsc-cron.php

class-wpsc-cron.php in SupportCandy – AI Customer Support Ticket System & Live Chatbot Agent 3.4.7, at includes/class-wpsc-cron.php

368 lines 10.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly!
4 }
5
6 if ( ! class_exists( 'WPSC_Cron' ) ) :
7
8 final class WPSC_Cron {
9
10 /**
11 * Initialize this class
12 *
13 * @return void
14 */
15 public static function init() {
16
17 // Add custom cron intervals.
18 add_filter( 'cron_schedules', array( __CLASS__, 'custom_interval' ) ); //phpcs:ignore
19
20 // Schedule cron jobs.
21 add_action( 'init', array( __CLASS__, 'schedule_events' ) );
22
23 // cron event callbacks.
24 add_action( 'wpsc_auto_archive_closed_tickets', array( __CLASS__, 'auto_archive_closed_tickets' ) );
25 add_action( 'wpsc_permanently_delete_archive_tickets', array( __CLASS__, 'permanently_delete_archive_tickets' ) );
26 add_action( 'wpsc_permanently_delete_tickets', array( __CLASS__, 'permanently_delete_tickets' ) );
27
28 // run background processes.
29 add_action( 'wp_ajax_wpsc_run_ajax_background_process', array( __CLASS__, 'run_background_process' ) );
30 add_action( 'wp_ajax_nopriv_wpsc_run_ajax_background_process', array( __CLASS__, 'run_background_process' ) );
31 }
32
33 /**
34 * Custom cron job intervals for SupportCandy
35 *
36 * @param array $schedules - schedule time.
37 * @return array
38 */
39 public static function custom_interval( $schedules ) {
40
41 $schedules['wpsc_1min'] = array(
42 'interval' => 60,
43 'display' => esc_attr__( 'Every one minute', 'supportcandy' ),
44 );
45
46 $schedules['wpsc_5min'] = array(
47 'interval' => 300,
48 'display' => esc_attr__( 'Every five minutes', 'supportcandy' ),
49 );
50
51 return $schedules;
52 }
53
54 /**
55 * Schedule cron job events for SupportCandy
56 *
57 * @return void
58 */
59 public static function schedule_events() {
60
61 $advanced = get_option( 'wpsc-ms-advanced-settings' );
62
63 // Schedule cron job for every five minute events.
64 if ( ! wp_next_scheduled( 'wpsc_cron_five_minute' ) ) {
65 wp_schedule_event(
66 time(),
67 'wpsc_5min',
68 'wpsc_cron_five_minute'
69 );
70 }
71
72 // Schedule cron job for daily events.
73 if ( ! wp_next_scheduled( 'wpsc_cron_daily' ) ) {
74 wp_schedule_event(
75 self::get_midnight_timestamp(),
76 'daily',
77 'wpsc_cron_daily'
78 );
79 }
80
81 // license checker.
82 if ( ! wp_next_scheduled( 'wpsc_license_checker' ) ) {
83 wp_schedule_event(
84 self::get_midnight_timestamp(),
85 'daily',
86 'wpsc_license_checker'
87 );
88 }
89
90 // Auto-archive closed tickets.
91 $auto_archive_time = isset( $advanced['auto-archive-tickets-time'] ) ? $advanced['auto-archive-tickets-time'] : 0;
92 if ( $auto_archive_time > 0 && ! wp_next_scheduled( 'wpsc_auto_archive_closed_tickets' ) ) {
93 wp_schedule_single_event( time(), 'wpsc_auto_archive_closed_tickets' );
94 }
95
96 // Permanently delete archive tickets.
97 $permanent_archive_time = isset( $advanced['permanent-archive-tickets-time'] ) ? $advanced['permanent-archive-tickets-time'] : 0;
98 if ( $permanent_archive_time > 0 && ! wp_next_scheduled( 'wpsc_permanently_delete_archive_tickets' ) ) {
99 wp_schedule_single_event( time(), 'wpsc_permanently_delete_archive_tickets' );
100 }
101
102 // Permanently delete deleted tickets.
103 $permanent_delete_time = isset( $advanced['permanent-delete-tickets-time'] ) ? $advanced['permanent-delete-tickets-time'] : 0;
104 if ( $permanent_delete_time > 0 && ! wp_next_scheduled( 'wpsc_permanently_delete_tickets' ) ) {
105 wp_schedule_single_event( time(), 'wpsc_permanently_delete_tickets' );
106 }
107
108 // Attachment garbage collector.
109 if ( ! wp_next_scheduled( 'wpsc_attach_garbage_collector' ) ) {
110 wp_schedule_event(
111 time(),
112 'hourly',
113 'wpsc_attach_garbage_collector'
114 );
115 }
116 }
117
118 /**
119 * Remove existing scheduled events.
120 * Can be used while deactivation of plugin or resetting schedules after an update etc.
121 *
122 * @return void
123 */
124 public static function unschedule_events() {
125
126 // Remove every five minute cron.
127 $timestamp = wp_next_scheduled( 'wpsc_cron_five_minute' );
128 if ( $timestamp ) {
129 wp_unschedule_event( $timestamp, 'wpsc_cron_five_minute' );
130 }
131
132 // Remove daily cron.
133 $timestamp = wp_next_scheduled( 'wpsc_cron_daily' );
134 if ( $timestamp ) {
135 wp_unschedule_event( $timestamp, 'wpsc_cron_daily' );
136 }
137 }
138
139 /**
140 * Provide mid-night unix timestamp
141 *
142 * @return String
143 */
144 public static function get_midnight_timestamp() {
145
146 $tz = wp_timezone();
147 $date = new DateTime( 'now', $tz );
148 $date->setTime( 0, 0, 0 );
149 $date->add( new DateInterval( 'P1D' ) );
150 return $date->getTimestamp();
151 }
152
153 /**
154 * Auto archive closed ticket after x days/months/years
155 *
156 * @return void
157 */
158 public static function auto_archive_closed_tickets() {
159
160 $tz = wp_timezone();
161 $today = new DateTime( 'now', $tz );
162 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
163 $ad_settings = get_option( 'wpsc-tl-ms-advanced' );
164 $time = isset( $ms_settings['auto-archive-tickets-time'] ) ? $ms_settings['auto-archive-tickets-time'] : 0;
165 $unit = isset( $ms_settings['auto-archive-tickets-unit'] ) ? $ms_settings['auto-archive-tickets-unit'] : 'days';
166 if ( $time === 0 ) {
167 return;
168 }
169
170 // Find the date after which tickets should be archived.
171 $age = clone $today;
172 switch ( $unit ) {
173 case 'days':
174 $age->sub( new DateInterval( 'P' . $time . 'D' ) );
175 break;
176
177 case 'month':
178 $age->sub( new DateInterval( 'P' . $time . 'M' ) );
179 break;
180
181 case 'year':
182 $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
183 break;
184 }
185
186 // Get tickets to be archive.
187 $tickets = WPSC_Ticket::find(
188 array(
189 'items_per_page' => 20,
190 'orderby' => 'date_closed',
191 'order' => 'ASC',
192 'meta_query' => array(
193 'relation' => 'AND',
194 array(
195 'slug' => 'status',
196 'compare' => 'IN',
197 'val' => $ad_settings['closed-ticket-statuses'],
198 ),
199 array(
200 'slug' => 'date_closed',
201 'compare' => '<',
202 'val' => $age->format( 'Y-m-d' ),
203 ),
204 ),
205 )
206 );
207
208 // Archive tickets.
209 if ( $tickets['total_items'] > 0 ) {
210 foreach ( $tickets['results'] as $ticket ) {
211 WPSC_Individual_Ticket::$ticket = $ticket;
212 WPSC_Individual_Ticket::archive_ticket();
213 }
214 }
215
216 // Schedule next run.
217 if ( $tickets['has_next_page'] ) {
218 wp_schedule_single_event( time(), 'wpsc_auto_archive_closed_tickets' );
219 } else {
220 wp_schedule_single_event( time() + DAY_IN_SECONDS, 'wpsc_auto_archive_closed_tickets' );
221 }
222 }
223
224 /**
225 * Permenently delete tickets after x days/months/years
226 *
227 * @return void
228 */
229 public static function permanently_delete_archive_tickets() {
230
231 $tz = wp_timezone();
232 $today = new DateTime( 'now', $tz );
233 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
234 $time = isset( $ms_settings['permanent-archive-tickets-time'] ) ? $ms_settings['permanent-archive-tickets-time'] : 0;
235 $unit = isset( $ms_settings['permanent-archive-tickets-unit'] ) ? $ms_settings['permanent-archive-tickets-unit'] : 'days';
236 if ( $time === 0 ) {
237 return;
238 }
239
240 // find the date before which tickets to be deleted.
241 $age = clone $today;
242 switch ( $unit ) {
243 case 'days':
244 $age->sub( new DateInterval( 'P' . $time . 'D' ) );
245 break;
246
247 case 'month':
248 $age->sub( new DateInterval( 'P' . $time . 'M' ) );
249 break;
250
251 case 'year':
252 $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
253 break;
254 }
255
256 // get tickets to be deleted.
257 $tickets = WPSC_Archive_Ticket::find(
258 array(
259 'items_per_page' => 25,
260 'orderby' => 'date_updated',
261 'order' => 'ASC',
262 'meta_query' => array(
263 'relation' => 'AND',
264 array(
265 'slug' => 'date_updated',
266 'compare' => '<',
267 'val' => $age->format( 'Y-m-d' ),
268 ),
269 ),
270 )
271 );
272
273 // Delete tickets.
274 if ( $tickets['total_items'] > 0 ) {
275 foreach ( $tickets['results'] as $ticket ) {
276 WPSC_Individual_Archive_Ticket::delete_archive_ticket( $ticket );
277 }
278 }
279
280 // schedule next run.
281 if ( $tickets['has_next_page'] ) {
282 wp_schedule_single_event( time(), 'wpsc_permanently_delete_archive_tickets' );
283 } else {
284 wp_schedule_single_event( time() + DAY_IN_SECONDS, 'wpsc_permanently_delete_archive_tickets' );
285 }
286 }
287
288 /**
289 * Permenently delete tickets after x days/months/years
290 *
291 * @return void
292 */
293 public static function permanently_delete_tickets() {
294
295 $tz = wp_timezone();
296 $today = new DateTime( 'now', $tz );
297 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
298 $time = isset( $ms_settings['permanent-delete-tickets-time'] ) ? $ms_settings['permanent-delete-tickets-time'] : 0;
299 $unit = isset( $ms_settings['permanent-delete-tickets-unit'] ) ? $ms_settings['permanent-delete-tickets-unit'] : 'days';
300 if ( $time === 0 ) {
301 return;
302 }
303
304 // find the date before which tickets to be deleted.
305 $age = clone $today;
306 switch ( $unit ) {
307 case 'days':
308 $age->sub( new DateInterval( 'P' . $time . 'D' ) );
309 break;
310
311 case 'month':
312 $age->sub( new DateInterval( 'P' . $time . 'M' ) );
313 break;
314
315 case 'year':
316 $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
317 break;
318 }
319
320 // get tickets to be deleted.
321 $tickets = WPSC_Ticket::find(
322 array(
323 'items_per_page' => 20,
324 'orderby' => 'date_closed',
325 'order' => 'ASC',
326 'is_active' => 0,
327 'meta_query' => array(
328 'relation' => 'AND',
329 array(
330 'slug' => 'date_updated',
331 'compare' => '<',
332 'val' => $age->format( 'Y-m-d' ),
333 ),
334 ),
335 )
336 );
337
338 // Delete tickets.
339 if ( $tickets['total_items'] > 0 ) {
340 foreach ( $tickets['results'] as $ticket ) {
341 WPSC_Individual_Ticket::$ticket = $ticket;
342 WPSC_Individual_Ticket::delete_permanently();
343 }
344 }
345
346 // schedule next run.
347 if ( $tickets['has_next_page'] ) {
348 wp_schedule_single_event( time(), 'wpsc_permanently_delete_tickets' );
349 } else {
350 wp_schedule_single_event( time() + DAY_IN_SECONDS, 'wpsc_permanently_delete_tickets' );
351 }
352 }
353
354 /**
355 * Execute background processes
356 *
357 * @return void
358 */
359 public static function run_background_process() {
360
361 do_action( 'wpsc_run_ajax_background_process' );
362 wp_die();
363 }
364 }
365 endif;
366
367 WPSC_Cron::init();
368