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
← All changes | includes/class-wpsc-cron.php +142 -82 3.4.3 → 3.5.4 View file →
@@ -22,8 +22,9 @@
22 22
23 23 // cron event callbacks.
24 24 add_action( 'wpsc_auto_archive_closed_tickets', array( __CLASS__, 'auto_archive_closed_tickets' ) );
25 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' ) );
26 27
27 28 // run background processes.
28 29 add_action( 'wp_ajax_wpsc_run_ajax_background_process', array( __CLASS__, 'run_background_process' ) );
29 30 add_action( 'wp_ajax_nopriv_wpsc_run_ajax_background_process', array( __CLASS__, 'run_background_process' ) );
@@ -56,8 +57,10 @@
56 57 * @return void
57 58 */
58 59 public static function schedule_events() {
59 60
61 + $advanced = get_option( 'wpsc-ms-advanced-settings' );
62 +
60 63 // Schedule cron job for every five minute events.
61 64 if ( ! wp_next_scheduled( 'wpsc_cron_five_minute' ) ) {
62 65 wp_schedule_event(
63 66 time(),
@@ -84,25 +87,25 @@
84 87 );
85 88 }
86 89
87 90 // Auto-archive closed tickets.
88 - if ( ! wp_next_scheduled( 'wpsc_auto_archive_closed_tickets' ) ) {
89 - wp_schedule_event(
90 - time(),
91 - 'hourly',
92 - 'wpsc_auto_archive_closed_tickets'
93 - );
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 94 }
95 95
96 - // Permanently delete tickets.
97 - if ( ! wp_next_scheduled( 'wpsc_permanently_delete_archive_tickets' ) ) {
98 - wp_schedule_event(
99 - time(),
100 - 'hourly',
101 - 'wpsc_permanently_delete_archive_tickets'
102 - );
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' );
103 100 }
104 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 +
105 108 // Attachment garbage collector.
106 109 if ( ! wp_next_scheduled( 'wpsc_attach_garbage_collector' ) ) {
107 110 wp_schedule_event(
108 111 time(),
@@ -155,68 +158,57 @@
155 158 public static function auto_archive_closed_tickets() {
156 159
157 160 $tz = wp_timezone();
158 161 $today = new DateTime( 'now', $tz );
159 - $transient_label = 'wpsc_auto_archive_closed_tickets_cron_' . $today->format( 'Y-m-d' );
160 - $cron_status = get_transient( $transient_label );
161 - if ( false === $cron_status ) {
162 - $cron_status = 'active';
163 - }
164 -
165 - // return if today's tickets finished checking.
166 - if ( $cron_status == 'finished' ) {
167 - return;
168 - }
169 -
162 + $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
170 163 $ad_settings = get_option( 'wpsc-tl-ms-advanced' );
171 - $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
172 -
173 - if ( ! $ms_settings['auto-archive-tickets-time'] ) {
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 ) {
174 167 return;
175 168 }
176 169
170 + // Find the date after which tickets should be archived.
177 171 $age = clone $today;
178 - switch ( $ms_settings['auto-archive-tickets-unit'] ) {
179 -
172 + switch ( $unit ) {
180 173 case 'days':
181 - $age->sub( new DateInterval( 'P' . $ms_settings['auto-archive-tickets-time'] . 'D' ) );
174 + $age->sub( new DateInterval( 'P' . $time . 'D' ) );
182 175 break;
183 176
184 177 case 'month':
185 - $age->sub( new DateInterval( 'P' . $ms_settings['auto-archive-tickets-time'] . 'M' ) );
178 + $age->sub( new DateInterval( 'P' . $time . 'M' ) );
186 179 break;
187 180
188 181 case 'year':
189 - $age->sub( new DateInterval( 'P' . $ms_settings['auto-archive-tickets-time'] . 'Y' ) );
182 + $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
190 183 break;
191 184 }
192 185
193 - $tickets = WPSC_Ticket::find(
194 - array(
195 - 'items_per_page' => 20,
196 - 'orderby' => 'date_closed',
197 - 'order' => 'ASC',
198 - 'meta_query' => array(
199 - 'relation' => 'AND',
200 - array(
201 - 'slug' => 'status',
202 - 'compare' => 'IN',
203 - 'val' => $ad_settings['closed-ticket-statuses'],
204 - ),
205 - array(
206 - 'slug' => 'date_closed',
207 - 'compare' => '<',
208 - 'val' => $age->format( 'Y-m-d' ),
209 - ),
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'],
210 197 ),
211 - )
198 + array(
199 + 'slug' => 'date_closed',
200 + 'compare' => '<',
201 + 'val' => $age->format( 'Y-m-d' ),
202 + ),
203 + ),
212 204 );
213 - // update cron status.
214 - delete_transient( $transient_label );
215 - $cron_status = $tickets['has_next_page'] ? 'active' : 'finished';
216 - set_transient( $transient_label, $cron_status, MINUTE_IN_SECONDS * 60 * 24 );
217 205
218 - // archive applicable tickets.
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.
219 211 if ( $tickets['total_items'] > 0 ) {
220 212 foreach ( $tickets['results'] as $ticket ) {
221 213 WPSC_Individual_Ticket::$ticket = $ticket;
222 214 WPSC_Individual_Ticket::archive_ticket();
@@ -221,8 +213,15 @@
221 213 WPSC_Individual_Ticket::$ticket = $ticket;
222 214 WPSC_Individual_Ticket::archive_ticket();
223 215 }
224 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 + }
225 224 }
226 225
227 226 /**
228 227 * Permenently delete tickets after x days/months/years
@@ -232,47 +231,37 @@
232 231 public static function permanently_delete_archive_tickets() {
233 232
234 233 $tz = wp_timezone();
235 234 $today = new DateTime( 'now', $tz );
236 - $transient_label = 'wpsc_permanently_delete_archive_tickets_cron_' . $today->format( 'Y-m-d' );
237 - $cron_status = get_transient( $transient_label );
238 - if ( false === $cron_status ) {
239 - $cron_status = 'active';
240 - }
241 -
242 - // return if today's tickets finished checking.
243 - if ( $cron_status == 'finished' ) {
244 - return;
245 - }
246 -
247 235 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
248 -
249 - if ( ! $ms_settings['permanent-archive-tickets-time'] ) {
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 ) {
250 239 return;
251 240 }
252 241
242 + // find the date before which tickets to be deleted.
253 243 $age = clone $today;
254 - switch ( $ms_settings['permanent-archive-tickets-unit'] ) {
255 -
244 + switch ( $unit ) {
256 245 case 'days':
257 - $age->sub( new DateInterval( 'P' . $ms_settings['permanent-archive-tickets-time'] . 'D' ) );
246 + $age->sub( new DateInterval( 'P' . $time . 'D' ) );
258 247 break;
259 248
260 249 case 'month':
261 - $age->sub( new DateInterval( 'P' . $ms_settings['permanent-archive-tickets-time'] . 'M' ) );
250 + $age->sub( new DateInterval( 'P' . $time . 'M' ) );
262 251 break;
263 252
264 253 case 'year':
265 - $age->sub( new DateInterval( 'P' . $ms_settings['permanent-archive-tickets-time'] . 'Y' ) );
254 + $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
266 255 break;
267 256 }
268 257
258 + // get tickets to be deleted.
269 259 $tickets = WPSC_Archive_Ticket::find(
270 260 array(
271 - 'items_per_page' => 5,
272 - 'orderby' => 'date_closed',
261 + 'items_per_page' => 25,
262 + 'orderby' => 'date_updated',
273 263 'order' => 'ASC',
274 - 'is_active' => 0,
275 264 'meta_query' => array(
276 265 'relation' => 'AND',
277 266 array(
278 267 'slug' => 'date_updated',
@@ -282,18 +271,89 @@
282 271 ),
283 272 )
284 273 );
285 274
286 - // update cron status.
287 - delete_transient( $transient_label );
288 - $cron_status = $tickets['has_next_page'] ? 'active' : 'finished';
289 - set_transient( $transient_label, $cron_status, MINUTE_IN_SECONDS * 60 * 24 );
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 + }
290 281
291 - // delete applicable tickets.
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.
292 344 if ( $tickets['total_items'] > 0 ) {
293 345 foreach ( $tickets['results'] as $ticket ) {
294 - WPSC_Individual_Archive_Ticket::delete_archive_ticket( $ticket );
346 + WPSC_Individual_Ticket::$ticket = $ticket;
347 + WPSC_Individual_Ticket::delete_permanently();
295 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' );
296 356 }
297 357 }
298 358
299 359 /**