PluginProbe
SupportCandy – AI Customer Support Ticket System & Live Chatbot Agent / 3.5.4
SupportCandy – AI Customer Support Ticket System & Live Chatbot Agent v3.5.4
3.5.4 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.5.4, at includes/class-wpsc-cron.php

373 lines 10.3 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 // Arguments for fetching closed tickets to be archived.
187 $filters = array(
188 'items_per_page' => 20,
189 'orderby' => 'date_closed',
190 'order' => 'ASC',
191 'meta_query' => array(
192 'relation' => 'AND',
193 array(
194 'slug' => 'status',
195 'compare' => 'IN',
196 'val' => $ad_settings['closed-ticket-statuses'],
197 ),
198 array(
199 'slug' => 'date_closed',
200 'compare' => '<',
201 'val' => $age->format( 'Y-m-d' ),
202 ),
203 ),
204 );
205
206 $filters = apply_filters( 'wpsc_auto_archive_closed_tickets_query', $filters );
207 // Get tickets to be archive.
208 $tickets = WPSC_Ticket::find( $filters );
209
210 // Archive tickets.
211 if ( $tickets['total_items'] > 0 ) {
212 foreach ( $tickets['results'] as $ticket ) {
213 WPSC_Individual_Ticket::$ticket = $ticket;
214 WPSC_Individual_Ticket::archive_ticket();
215 }
216 }
217
218 // Schedule next run.
219 if ( $tickets['has_next_page'] ) {
220 wp_schedule_single_event( time(), 'wpsc_auto_archive_closed_tickets' );
221 } else {
222 wp_schedule_single_event( time() + DAY_IN_SECONDS, 'wpsc_auto_archive_closed_tickets' );
223 }
224 }
225
226 /**
227 * Permenently delete tickets after x days/months/years
228 *
229 * @return void
230 */
231 public static function permanently_delete_archive_tickets() {
232
233 $tz = wp_timezone();
234 $today = new DateTime( 'now', $tz );
235 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
236 $time = isset( $ms_settings['permanent-archive-tickets-time'] ) ? $ms_settings['permanent-archive-tickets-time'] : 0;
237 $unit = isset( $ms_settings['permanent-archive-tickets-unit'] ) ? $ms_settings['permanent-archive-tickets-unit'] : 'days';
238 if ( $time === 0 ) {
239 return;
240 }
241
242 // find the date before which tickets to be deleted.
243 $age = clone $today;
244 switch ( $unit ) {
245 case 'days':
246 $age->sub( new DateInterval( 'P' . $time . 'D' ) );
247 break;
248
249 case 'month':
250 $age->sub( new DateInterval( 'P' . $time . 'M' ) );
251 break;
252
253 case 'year':
254 $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
255 break;
256 }
257
258 // get tickets to be deleted.
259 $tickets = WPSC_Archive_Ticket::find(
260 array(
261 'items_per_page' => 25,
262 'orderby' => 'date_updated',
263 'order' => 'ASC',
264 'meta_query' => array(
265 'relation' => 'AND',
266 array(
267 'slug' => 'date_updated',
268 'compare' => '<',
269 'val' => $age->format( 'Y-m-d' ),
270 ),
271 ),
272 )
273 );
274
275 // Delete tickets.
276 if ( $tickets['total_items'] > 0 ) {
277 foreach ( $tickets['results'] as $ticket ) {
278 WPSC_Individual_Archive_Ticket::delete_archive_ticket( $ticket );
279 }
280 }
281
282 // schedule next run.
283 if ( $tickets['has_next_page'] ) {
284 wp_schedule_single_event( time(), 'wpsc_permanently_delete_archive_tickets' );
285 } else {
286 wp_schedule_single_event( time() + DAY_IN_SECONDS, 'wpsc_permanently_delete_archive_tickets' );
287 }
288 }
289
290 /**
291 * Permenently delete tickets after x days/months/years
292 *
293 * @return void
294 */
295 public static function permanently_delete_tickets() {
296
297 $tz = wp_timezone();
298 $today = new DateTime( 'now', $tz );
299 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
300 $time = isset( $ms_settings['permanent-delete-tickets-time'] ) ? $ms_settings['permanent-delete-tickets-time'] : 0;
301 $unit = isset( $ms_settings['permanent-delete-tickets-unit'] ) ? $ms_settings['permanent-delete-tickets-unit'] : 'days';
302 if ( $time === 0 ) {
303 return;
304 }
305
306 // find the date before which tickets to be deleted.
307 $age = clone $today;
308 switch ( $unit ) {
309 case 'days':
310 $age->sub( new DateInterval( 'P' . $time . 'D' ) );
311 break;
312
313 case 'month':
314 $age->sub( new DateInterval( 'P' . $time . 'M' ) );
315 break;
316
317 case 'year':
318 $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
319 break;
320 }
321
322 $args = array(
323 'items_per_page' => 20,
324 'orderby' => 'date_updated',
325 'order' => 'ASC',
326 'is_active' => 0,
327 );
328
329 $meta_query = array( 'relation' => 'AND' );
330
331 $meta_query[] = array(
332 'slug' => 'date_updated',
333 'compare' => '<',
334 'val' => $age->format( 'Y-m-d' ),
335 );
336
337 $filters = array_merge( $args, array( 'meta_query' => $meta_query ) );
338 $filters = apply_filters( 'wpsc_permanently_delete_tickets_query', $filters );
339
340 // get tickets to be deleted.
341 $tickets = WPSC_Ticket::find( $filters );
342
343 // Delete tickets.
344 if ( $tickets['total_items'] > 0 ) {
345 foreach ( $tickets['results'] as $ticket ) {
346 WPSC_Individual_Ticket::$ticket = $ticket;
347 WPSC_Individual_Ticket::delete_permanently();
348 }
349 }
350
351 // schedule next run.
352 if ( $tickets['has_next_page'] ) {
353 wp_schedule_single_event( time(), 'wpsc_permanently_delete_tickets' );
354 } else {
355 wp_schedule_single_event( time() + DAY_IN_SECONDS, 'wpsc_permanently_delete_tickets' );
356 }
357 }
358
359 /**
360 * Execute background processes
361 *
362 * @return void
363 */
364 public static function run_background_process() {
365
366 do_action( 'wpsc_run_ajax_background_process' );
367 wp_die();
368 }
369 }
370 endif;
371
372 WPSC_Cron::init();
373