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 +147 -89 3.4.0 → 3.5.4 View file →
@@ -20,10 +20,11 @@
20 20 // Schedule cron jobs.
21 21 add_action( 'init', array( __CLASS__, 'schedule_events' ) );
22 22
23 23 // cron event callbacks.
24 - add_action( 'wpsc_auto_delete_closed_tickets', array( __CLASS__, 'auto_delete_closed_tickets' ) );
25 - add_action( 'wpsc_permenently_delete_tickets', array( __CLASS__, 'permenently_delete_tickets' ) );
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' ) );
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(),
@@ -83,26 +86,26 @@
83 86 'wpsc_license_checker'
84 87 );
85 88 }
86 89
87 - // Auto-delete closed tickets.
88 - if ( ! wp_next_scheduled( 'wpsc_auto_delete_closed_tickets' ) ) {
89 - wp_schedule_event(
90 - time(),
91 - 'hourly',
92 - 'wpsc_auto_delete_closed_tickets'
93 - );
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 94 }
95 95
96 - // Permenently delete tickets.
97 - if ( ! wp_next_scheduled( 'wpsc_permenently_delete_tickets' ) ) {
98 - wp_schedule_event(
99 - time(),
100 - 'hourly',
101 - 'wpsc_permenently_delete_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(),
@@ -147,64 +150,122 @@
147 150 return $date->getTimestamp();
148 151 }
149 152
150 153 /**
151 - * Auto delete closed ticket after x days/months/years
154 + * Auto archive closed ticket after x days/months/years
152 155 *
153 156 * @return void
154 157 */
155 - public static function auto_delete_closed_tickets() {
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_delete_closed_tickets_cron_' . $today->format( 'Y-m-d' );
160 - $cron_status = get_transient( $transient_label );
161 - if ( false === $cron_status ) {
162 - $cron_status = 'active';
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;
163 168 }
164 169
165 - // return if today's tickets finished checking.
166 - if ( $cron_status == 'finished' ) {
167 - return;
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;
168 184 }
169 185
170 - $ad_settings = get_option( 'wpsc-tl-ms-advanced' );
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 );
171 235 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
172 -
173 - if ( ! $ms_settings['auto-delete-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 ) {
174 239 return;
175 240 }
176 241
242 + // find the date before which tickets to be deleted.
177 243 $age = clone $today;
178 - switch ( $ms_settings['auto-delete-tickets-unit'] ) {
179 -
244 + switch ( $unit ) {
180 245 case 'days':
181 - $age->sub( new DateInterval( 'P' . $ms_settings['auto-delete-tickets-time'] . 'D' ) );
246 + $age->sub( new DateInterval( 'P' . $time . 'D' ) );
182 247 break;
183 248
184 249 case 'month':
185 - $age->sub( new DateInterval( 'P' . $ms_settings['auto-delete-tickets-time'] . 'M' ) );
250 + $age->sub( new DateInterval( 'P' . $time . 'M' ) );
186 251 break;
187 252
188 253 case 'year':
189 - $age->sub( new DateInterval( 'P' . $ms_settings['auto-delete-tickets-time'] . 'Y' ) );
254 + $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
190 255 break;
191 256 }
192 257
193 - $tickets = WPSC_Ticket::find(
258 + // get tickets to be deleted.
259 + $tickets = WPSC_Archive_Ticket::find(
194 260 array(
195 - 'items_per_page' => 20,
196 - 'orderby' => 'date_closed',
261 + 'items_per_page' => 25,
262 + 'orderby' => 'date_updated',
197 263 'order' => 'ASC',
198 264 'meta_query' => array(
199 265 'relation' => 'AND',
200 266 array(
201 - 'slug' => 'status',
202 - 'compare' => 'IN',
203 - 'val' => $ad_settings['closed-ticket-statuses'],
204 - ),
205 - array(
206 - 'slug' => 'date_closed',
267 + 'slug' => 'date_updated',
207 268 'compare' => '<',
208 269 'val' => $age->format( 'Y-m-d' ),
209 270 ),
210 271 ),
@@ -210,20 +271,21 @@
210 271 ),
211 272 )
212 273 );
213 274
214 - // update cron status.
215 - delete_transient( $transient_label );
216 - $cron_status = $tickets['has_next_page'] ? 'active' : 'finished';
217 - set_transient( $transient_label, $cron_status, MINUTE_IN_SECONDS * 60 * 24 );
218 -
219 - // delete applicable tickets.
275 + // Delete tickets.
220 276 if ( $tickets['total_items'] > 0 ) {
221 277 foreach ( $tickets['results'] as $ticket ) {
222 - WPSC_Individual_Ticket::$ticket = $ticket;
223 - WPSC_Individual_Ticket::delete_ticket();
278 + WPSC_Individual_Archive_Ticket::delete_archive_ticket( $ticket );
224 279 }
225 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 + }
226 288 }
227 289
228 290 /**
229 291 * Permenently delete tickets after x days/months/years
@@ -229,73 +291,69 @@
229 291 * Permenently delete tickets after x days/months/years
230 292 *
231 293 * @return void
232 294 */
233 - public static function permenently_delete_tickets() {
295 + public static function permanently_delete_tickets() {
234 296
235 297 $tz = wp_timezone();
236 298 $today = new DateTime( 'now', $tz );
237 - $transient_label = 'wpsc_permenently_delete_tickets_cron_' . $today->format( 'Y-m-d' );
238 - $cron_status = get_transient( $transient_label );
239 - if ( false === $cron_status ) {
240 - $cron_status = 'active';
241 - }
242 -
243 - // return if today's tickets finished checking.
244 - if ( $cron_status == 'finished' ) {
245 - return;
246 - }
247 -
248 299 $ms_settings = get_option( 'wpsc-ms-advanced-settings' );
249 -
250 - if ( ! $ms_settings['permanent-delete-tickets-time'] ) {
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 ) {
251 303 return;
252 304 }
253 305
306 + // find the date before which tickets to be deleted.
254 307 $age = clone $today;
255 - switch ( $ms_settings['permanent-delete-tickets-unit'] ) {
256 -
308 + switch ( $unit ) {
257 309 case 'days':
258 - $age->sub( new DateInterval( 'P' . $ms_settings['permanent-delete-tickets-time'] . 'D' ) );
310 + $age->sub( new DateInterval( 'P' . $time . 'D' ) );
259 311 break;
260 312
261 313 case 'month':
262 - $age->sub( new DateInterval( 'P' . $ms_settings['permanent-delete-tickets-time'] . 'M' ) );
314 + $age->sub( new DateInterval( 'P' . $time . 'M' ) );
263 315 break;
264 316
265 317 case 'year':
266 - $age->sub( new DateInterval( 'P' . $ms_settings['permanent-delete-tickets-time'] . 'Y' ) );
318 + $age->sub( new DateInterval( 'P' . $time . 'Y' ) );
267 319 break;
268 320 }
269 321
270 - $tickets = WPSC_Ticket::find(
271 - array(
272 - 'items_per_page' => 5,
273 - 'orderby' => 'date_closed',
274 - 'order' => 'ASC',
275 - 'is_active' => 0,
276 - 'meta_query' => array(
277 - 'relation' => 'AND',
278 - array(
279 - 'slug' => 'date_updated',
280 - 'compare' => '<',
281 - 'val' => $age->format( 'Y-m-d' ),
282 - ),
283 - ),
284 - )
322 + $args = array(
323 + 'items_per_page' => 20,
324 + 'orderby' => 'date_updated',
325 + 'order' => 'ASC',
326 + 'is_active' => 0,
285 327 );
286 328
287 - // update cron status.
288 - delete_transient( $transient_label );
289 - $cron_status = $tickets['has_next_page'] ? 'active' : 'finished';
290 - set_transient( $transient_label, $cron_status, MINUTE_IN_SECONDS * 60 * 24 );
329 + $meta_query = array( 'relation' => 'AND' );
291 330
292 - // delete applicable tickets.
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.
293 344 if ( $tickets['total_items'] > 0 ) {
294 345 foreach ( $tickets['results'] as $ticket ) {
295 346 WPSC_Individual_Ticket::$ticket = $ticket;
296 347 WPSC_Individual_Ticket::delete_permanently();
297 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' );
298 356 }
299 357 }
300 358
301 359 /**