@@ -35,13 +35,13 @@ discard block |
||
35 | 35 | |
36 | 36 | <div class="contact-details-buttons"> |
37 | 37 | <?php |
38 | - if ($att_check instanceof EE_Attendee |
|
39 | - && EE_Registry::instance()->CAP->current_user_can( |
|
40 | - 'ee_edit_contact', |
|
41 | - 'view_or_edit_contact_button', |
|
42 | - $att_check->ID() |
|
43 | - )) : |
|
44 | - ?> |
|
38 | + if ($att_check instanceof EE_Attendee |
|
39 | + && EE_Registry::instance()->CAP->current_user_can( |
|
40 | + 'ee_edit_contact', |
|
41 | + 'view_or_edit_contact_button', |
|
42 | + $att_check->ID() |
|
43 | + )) : |
|
44 | + ?> |
|
45 | 45 | <a class="button button-small" href="<?php echo $att_edit_link; ?>" |
46 | 46 | title="<?php echo esc_attr($att_edit_label); ?>"> |
47 | 47 | <span class="ee-icon ee-icon-user-edit"></span><?php echo $att_edit_label; ?> |
@@ -49,15 +49,15 @@ discard block |
||
49 | 49 | <?php if (! empty($create_link)) : ?> |
50 | 50 | <a class="button button-small" href="<?php echo $create_link; ?>" |
51 | 51 | title="<?php |
52 | - esc_attr_e( |
|
53 | - 'This registration shares the contact details for the primary registration in this group. If you\'d like this registration to have its own details, you can do so by clicking this button', |
|
54 | - 'event_espresso' |
|
55 | - ); ?>"> |
|
52 | + esc_attr_e( |
|
53 | + 'This registration shares the contact details for the primary registration in this group. If you\'d like this registration to have its own details, you can do so by clicking this button', |
|
54 | + 'event_espresso' |
|
55 | + ); ?>"> |
|
56 | 56 | <span class="ee-icon ee-icon-user-add-new"></span><?php echo $create_label; ?> |
57 | 57 | </a> |
58 | 58 | <?php endif; ?> |
59 | 59 | <div style="clear:both"></div> |
60 | 60 | <?php |
61 | - endif; |
|
61 | + endif; |
|
62 | 62 | ?> |
63 | 63 | </div> |
@@ -2,7 +2,7 @@ discard block |
||
2 | 2 | <div class="clearfix"> |
3 | 3 | <span class="admin-side-mbox-label-spn lt-grey-txt float-left"> |
4 | 4 | <?php esc_html_e('Name', 'event_espresso'); ?> |
5 | - </span><?php echo $fname . ' ' . $lname; ?> |
|
5 | + </span><?php echo $fname.' '.$lname; ?> |
|
6 | 6 | </div> |
7 | 7 | <div class="clearfix"> |
8 | 8 | <span class="admin-side-mbox-label-spn lt-grey-txt float-left"> |
@@ -16,7 +16,7 @@ discard block |
||
16 | 16 | <span class="admin-side-mbox-label-spn lt-grey-txt float-left"> |
17 | 17 | <?php esc_html_e('Phone #', 'event_espresso'); ?> |
18 | 18 | </span> |
19 | - <?php if (! empty($phone)) : ?> |
|
19 | + <?php if ( ! empty($phone)) : ?> |
|
20 | 20 | <a href="tel:<?php echo $phone; ?>"> |
21 | 21 | <?php echo $phone; ?> |
22 | 22 | </a> |
@@ -46,7 +46,7 @@ discard block |
||
46 | 46 | title="<?php echo esc_attr($att_edit_label); ?>"> |
47 | 47 | <span class="ee-icon ee-icon-user-edit"></span><?php echo $att_edit_label; ?> |
48 | 48 | </a> |
49 | - <?php if (! empty($create_link)) : ?> |
|
49 | + <?php if ( ! empty($create_link)) : ?> |
|
50 | 50 | <a class="button button-small" href="<?php echo $create_link; ?>" |
51 | 51 | title="<?php |
52 | 52 | esc_attr_e( |
@@ -15,596 +15,596 @@ |
||
15 | 15 | class EE_Cron_Tasks extends EE_Base |
16 | 16 | { |
17 | 17 | |
18 | - /** |
|
19 | - * WordPress doesn't allow duplicate crons within 10 minutes of the original, |
|
20 | - * so we'll set our retry time for just over 10 minutes to avoid that |
|
21 | - */ |
|
22 | - const reschedule_timeout = 605; |
|
23 | - |
|
24 | - |
|
25 | - /** |
|
26 | - * @var EE_Cron_Tasks |
|
27 | - */ |
|
28 | - private static $_instance; |
|
29 | - |
|
30 | - |
|
31 | - /** |
|
32 | - * @return EE_Cron_Tasks |
|
33 | - * @throws ReflectionException |
|
34 | - * @throws EE_Error |
|
35 | - * @throws InvalidArgumentException |
|
36 | - * @throws InvalidInterfaceException |
|
37 | - * @throws InvalidDataTypeException |
|
38 | - */ |
|
39 | - public static function instance() |
|
40 | - { |
|
41 | - if (! self::$_instance instanceof EE_Cron_Tasks) { |
|
42 | - self::$_instance = new self(); |
|
43 | - } |
|
44 | - return self::$_instance; |
|
45 | - } |
|
46 | - |
|
47 | - |
|
48 | - /** |
|
49 | - * @access private |
|
50 | - * @throws InvalidDataTypeException |
|
51 | - * @throws InvalidInterfaceException |
|
52 | - * @throws InvalidArgumentException |
|
53 | - * @throws EE_Error |
|
54 | - * @throws ReflectionException |
|
55 | - */ |
|
56 | - private function __construct() |
|
57 | - { |
|
58 | - do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
59 | - // verify that WP Cron is enabled |
|
60 | - if (defined('DISABLE_WP_CRON') |
|
61 | - && DISABLE_WP_CRON |
|
62 | - && is_admin() |
|
63 | - && ! get_option('ee_disabled_wp_cron_check') |
|
64 | - ) { |
|
65 | - /** |
|
66 | - * This needs to be delayed until after the config is loaded because EE_Cron_Tasks is constructed before |
|
67 | - * config is loaded. |
|
68 | - * This is intentionally using a anonymous function so that its not easily de-registered. Client code |
|
69 | - * wanting to not have this functionality can just register its own action at a priority after this one to |
|
70 | - * reverse any changes. |
|
71 | - */ |
|
72 | - add_action( |
|
73 | - 'AHEE__EE_System__load_core_configuration__complete', |
|
74 | - function () { |
|
75 | - EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request = true; |
|
76 | - EE_Registry::instance()->NET_CFG->update_config(true, false); |
|
77 | - add_option('ee_disabled_wp_cron_check', 1, '', false); |
|
78 | - } |
|
79 | - ); |
|
80 | - } |
|
81 | - // UPDATE TRANSACTION WITH PAYMENT |
|
82 | - add_action( |
|
83 | - 'AHEE__EE_Cron_Tasks__update_transaction_with_payment_2', |
|
84 | - array('EE_Cron_Tasks', 'setup_update_for_transaction_with_payment'), |
|
85 | - 10, |
|
86 | - 2 |
|
87 | - ); |
|
88 | - // ABANDONED / EXPIRED TRANSACTION CHECK |
|
89 | - add_action( |
|
90 | - 'AHEE__EE_Cron_Tasks__expired_transaction_check', |
|
91 | - array('EE_Cron_Tasks', 'expired_transaction_check'), |
|
92 | - 10, |
|
93 | - 1 |
|
94 | - ); |
|
95 | - // CLEAN OUT JUNK TRANSACTIONS AND RELATED DATA |
|
96 | - add_action( |
|
97 | - 'AHEE__EE_Cron_Tasks__clean_up_junk_transactions', |
|
98 | - array('EE_Cron_Tasks', 'clean_out_junk_transactions') |
|
99 | - ); |
|
100 | - // logging |
|
101 | - add_action( |
|
102 | - 'AHEE__EE_System__load_core_configuration__complete', |
|
103 | - array('EE_Cron_Tasks', 'log_scheduled_ee_crons') |
|
104 | - ); |
|
105 | - EE_Registry::instance()->load_lib('Messages_Scheduler'); |
|
106 | - // clean out old gateway logs |
|
107 | - add_action( |
|
108 | - 'AHEE_EE_Cron_Tasks__clean_out_old_gateway_logs', |
|
109 | - array('EE_Cron_Tasks', 'clean_out_old_gateway_logs') |
|
110 | - ); |
|
111 | - } |
|
112 | - |
|
113 | - |
|
114 | - /** |
|
115 | - * @access protected |
|
116 | - * @return void |
|
117 | - */ |
|
118 | - public static function log_scheduled_ee_crons() |
|
119 | - { |
|
120 | - $ee_crons = array( |
|
121 | - 'AHEE__EE_Cron_Tasks__update_transaction_with_payment', |
|
122 | - 'AHEE__EE_Cron_Tasks__finalize_abandoned_transactions', |
|
123 | - 'AHEE__EE_Cron_Tasks__clean_up_junk_transactions', |
|
124 | - ); |
|
125 | - $crons = (array) get_option('cron'); |
|
126 | - if (! is_array($crons)) { |
|
127 | - return; |
|
128 | - } |
|
129 | - foreach ($crons as $timestamp => $cron) { |
|
130 | - /** @var array[] $cron */ |
|
131 | - foreach ($ee_crons as $ee_cron) { |
|
132 | - if (isset($cron[ $ee_cron ]) && is_array($cron[ $ee_cron ])) { |
|
133 | - do_action('AHEE_log', __CLASS__, __FUNCTION__, $ee_cron, 'scheduled EE cron'); |
|
134 | - foreach ($cron[ $ee_cron ] as $ee_cron_details) { |
|
135 | - if (! empty($ee_cron_details['args'])) { |
|
136 | - do_action( |
|
137 | - 'AHEE_log', |
|
138 | - __CLASS__, |
|
139 | - __FUNCTION__, |
|
140 | - print_r($ee_cron_details['args'], true), |
|
141 | - "{$ee_cron} args" |
|
142 | - ); |
|
143 | - } |
|
144 | - } |
|
145 | - } |
|
146 | - } |
|
147 | - } |
|
148 | - } |
|
149 | - |
|
150 | - |
|
151 | - /** |
|
152 | - * reschedule_cron_for_transactions_if_maintenance_mode |
|
153 | - * if Maintenance Mode is active, this will reschedule a cron to run again in 10 minutes |
|
154 | - * |
|
155 | - * @param string $cron_task |
|
156 | - * @param array $TXN_IDs |
|
157 | - * @return bool |
|
158 | - * @throws DomainException |
|
159 | - */ |
|
160 | - public static function reschedule_cron_for_transactions_if_maintenance_mode($cron_task, array $TXN_IDs) |
|
161 | - { |
|
162 | - if (! method_exists('EE_Cron_Tasks', $cron_task)) { |
|
163 | - throw new DomainException( |
|
164 | - sprintf( |
|
165 | - __('"%1$s" is not valid method on EE_Cron_Tasks.', 'event_espresso'), |
|
166 | - $cron_task |
|
167 | - ) |
|
168 | - ); |
|
169 | - } |
|
170 | - // reschedule the cron if we can't hit the db right now |
|
171 | - if (! EE_Maintenance_Mode::instance()->models_can_query()) { |
|
172 | - foreach ($TXN_IDs as $TXN_ID => $additional_vars) { |
|
173 | - // ensure $additional_vars is an array |
|
174 | - $additional_vars = is_array($additional_vars) ? $additional_vars : array($additional_vars); |
|
175 | - // reset cron job for the TXN |
|
176 | - call_user_func_array( |
|
177 | - array('EE_Cron_Tasks', $cron_task), |
|
178 | - array_merge( |
|
179 | - array( |
|
180 | - time() + (10 * MINUTE_IN_SECONDS), |
|
181 | - $TXN_ID, |
|
182 | - ), |
|
183 | - $additional_vars |
|
184 | - ) |
|
185 | - ); |
|
186 | - } |
|
187 | - return true; |
|
188 | - } |
|
189 | - return false; |
|
190 | - } |
|
191 | - |
|
192 | - |
|
193 | - |
|
194 | - |
|
195 | - /**************** UPDATE TRANSACTION WITH PAYMENT ****************/ |
|
196 | - |
|
197 | - |
|
198 | - /** |
|
199 | - * array of TXN IDs and the payment |
|
200 | - * |
|
201 | - * @var array |
|
202 | - */ |
|
203 | - protected static $_update_transactions_with_payment = array(); |
|
204 | - |
|
205 | - |
|
206 | - /** |
|
207 | - * schedule_update_transaction_with_payment |
|
208 | - * sets a wp_schedule_single_event() for updating any TXNs that may |
|
209 | - * require updating due to recently received payments |
|
210 | - * |
|
211 | - * @param int $timestamp |
|
212 | - * @param int $TXN_ID |
|
213 | - * @param int $PAY_ID |
|
214 | - */ |
|
215 | - public static function schedule_update_transaction_with_payment( |
|
216 | - $timestamp, |
|
217 | - $TXN_ID, |
|
218 | - $PAY_ID |
|
219 | - ) { |
|
220 | - do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
221 | - // validate $TXN_ID and $timestamp |
|
222 | - $TXN_ID = absint($TXN_ID); |
|
223 | - $timestamp = absint($timestamp); |
|
224 | - if ($TXN_ID && $timestamp) { |
|
225 | - wp_schedule_single_event( |
|
226 | - $timestamp, |
|
227 | - 'AHEE__EE_Cron_Tasks__update_transaction_with_payment_2', |
|
228 | - array($TXN_ID, $PAY_ID) |
|
229 | - ); |
|
230 | - } |
|
231 | - } |
|
232 | - |
|
233 | - |
|
234 | - /** |
|
235 | - * setup_update_for_transaction_with_payment |
|
236 | - * this is the callback for the action hook: |
|
237 | - * 'AHEE__EE_Cron_Tasks__update_transaction_with_payment' |
|
238 | - * which is setup by EE_Cron_Tasks::schedule_update_transaction_with_payment(). |
|
239 | - * The passed TXN_ID and associated payment gets added to an array, and then |
|
240 | - * the EE_Cron_Tasks::update_transaction_with_payment() function is hooked into |
|
241 | - * 'shutdown' which will actually handle the processing of any |
|
242 | - * transactions requiring updating, because doing so now would be too early |
|
243 | - * and the required resources may not be available |
|
244 | - * |
|
245 | - * @param int $TXN_ID |
|
246 | - * @param int $PAY_ID |
|
247 | - */ |
|
248 | - public static function setup_update_for_transaction_with_payment($TXN_ID = 0, $PAY_ID = 0) |
|
249 | - { |
|
250 | - do_action('AHEE_log', __CLASS__, __FUNCTION__, $TXN_ID, '$TXN_ID'); |
|
251 | - if (absint($TXN_ID)) { |
|
252 | - self::$_update_transactions_with_payment[ $TXN_ID ] = $PAY_ID; |
|
253 | - add_action( |
|
254 | - 'shutdown', |
|
255 | - array('EE_Cron_Tasks', 'update_transaction_with_payment'), |
|
256 | - 5 |
|
257 | - ); |
|
258 | - } |
|
259 | - } |
|
260 | - |
|
261 | - |
|
262 | - /** |
|
263 | - * update_transaction_with_payment |
|
264 | - * loops through the self::$_abandoned_transactions array |
|
265 | - * and attempts to finalize any TXNs that have not been completed |
|
266 | - * but have had their sessions expired, most likely due to a user not |
|
267 | - * returning from an off-site payment gateway |
|
268 | - * |
|
269 | - * @throws EE_Error |
|
270 | - * @throws DomainException |
|
271 | - * @throws InvalidDataTypeException |
|
272 | - * @throws InvalidInterfaceException |
|
273 | - * @throws InvalidArgumentException |
|
274 | - * @throws ReflectionException |
|
275 | - * @throws RuntimeException |
|
276 | - */ |
|
277 | - public static function update_transaction_with_payment() |
|
278 | - { |
|
279 | - do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
280 | - if (// are there any TXNs that need cleaning up ? |
|
281 | - empty(self::$_update_transactions_with_payment) |
|
282 | - // reschedule the cron if we can't hit the db right now |
|
283 | - || EE_Cron_Tasks::reschedule_cron_for_transactions_if_maintenance_mode( |
|
284 | - 'schedule_update_transaction_with_payment', |
|
285 | - self::$_update_transactions_with_payment |
|
286 | - ) |
|
287 | - ) { |
|
288 | - return; |
|
289 | - } |
|
290 | - /** @type EE_Payment_Processor $payment_processor */ |
|
291 | - $payment_processor = EE_Registry::instance()->load_core('Payment_Processor'); |
|
292 | - // set revisit flag for payment processor |
|
293 | - $payment_processor->set_revisit(); |
|
294 | - // load EEM_Transaction |
|
295 | - EE_Registry::instance()->load_model('Transaction'); |
|
296 | - foreach (self::$_update_transactions_with_payment as $TXN_ID => $PAY_ID) { |
|
297 | - // reschedule the cron if we can't hit the db right now |
|
298 | - if (! EE_Maintenance_Mode::instance()->models_can_query()) { |
|
299 | - // reset cron job for updating the TXN |
|
300 | - EE_Cron_Tasks::schedule_update_transaction_with_payment( |
|
301 | - time() + EE_Cron_Tasks::reschedule_timeout, |
|
302 | - $TXN_ID, |
|
303 | - $PAY_ID |
|
304 | - ); |
|
305 | - continue; |
|
306 | - } |
|
307 | - $transaction = EEM_Transaction::instance()->get_one_by_ID($TXN_ID); |
|
308 | - $payment = EEM_Payment::instance()->get_one_by_ID($PAY_ID); |
|
309 | - // verify transaction |
|
310 | - if ($transaction instanceof EE_Transaction && $payment instanceof EE_Payment) { |
|
311 | - // now try to update the TXN with any payments |
|
312 | - $payment_processor->update_txn_based_on_payment($transaction, $payment, true, true); |
|
313 | - } |
|
314 | - unset(self::$_update_transactions_with_payment[ $TXN_ID ]); |
|
315 | - } |
|
316 | - } |
|
317 | - |
|
318 | - |
|
319 | - |
|
320 | - /************ END OF UPDATE TRANSACTION WITH PAYMENT ************/ |
|
321 | - |
|
322 | - |
|
323 | - /***************** EXPIRED TRANSACTION CHECK *****************/ |
|
324 | - |
|
325 | - |
|
326 | - /** |
|
327 | - * array of TXN IDs |
|
328 | - * |
|
329 | - * @var array |
|
330 | - */ |
|
331 | - protected static $_expired_transactions = array(); |
|
332 | - |
|
333 | - |
|
334 | - /** |
|
335 | - * schedule_expired_transaction_check |
|
336 | - * sets a wp_schedule_single_event() for following up on TXNs after their session has expired |
|
337 | - * |
|
338 | - * @param int $timestamp |
|
339 | - * @param int $TXN_ID |
|
340 | - */ |
|
341 | - public static function schedule_expired_transaction_check( |
|
342 | - $timestamp, |
|
343 | - $TXN_ID |
|
344 | - ) { |
|
345 | - // validate $TXN_ID and $timestamp |
|
346 | - $TXN_ID = absint($TXN_ID); |
|
347 | - $timestamp = absint($timestamp); |
|
348 | - if ($TXN_ID && $timestamp) { |
|
349 | - wp_schedule_single_event( |
|
350 | - $timestamp, |
|
351 | - 'AHEE__EE_Cron_Tasks__expired_transaction_check', |
|
352 | - array($TXN_ID) |
|
353 | - ); |
|
354 | - } |
|
355 | - } |
|
356 | - |
|
357 | - |
|
358 | - /** |
|
359 | - * expired_transaction_check |
|
360 | - * this is the callback for the action hook: |
|
361 | - * 'AHEE__EE_Cron_Tasks__transaction_session_expiration_check' |
|
362 | - * which is utilized by wp_schedule_single_event() |
|
363 | - * in \EED_Single_Page_Checkout::_initialize_transaction(). |
|
364 | - * The passed TXN_ID gets added to an array, and then the |
|
365 | - * process_expired_transactions() function is hooked into |
|
366 | - * 'AHEE__EE_System__core_loaded_and_ready' which will actually handle the |
|
367 | - * processing of any failed transactions, because doing so now would be |
|
368 | - * too early and the required resources may not be available |
|
369 | - * |
|
370 | - * @param int $TXN_ID |
|
371 | - */ |
|
372 | - public static function expired_transaction_check($TXN_ID = 0) |
|
373 | - { |
|
374 | - if (absint($TXN_ID)) { |
|
375 | - self::$_expired_transactions[ $TXN_ID ] = $TXN_ID; |
|
376 | - add_action( |
|
377 | - 'shutdown', |
|
378 | - array('EE_Cron_Tasks', 'process_expired_transactions'), |
|
379 | - 5 |
|
380 | - ); |
|
381 | - } |
|
382 | - } |
|
383 | - |
|
384 | - |
|
385 | - /** |
|
386 | - * process_expired_transactions |
|
387 | - * loops through the self::$_expired_transactions array and processes any failed TXNs |
|
388 | - * |
|
389 | - * @throws EE_Error |
|
390 | - * @throws InvalidDataTypeException |
|
391 | - * @throws InvalidInterfaceException |
|
392 | - * @throws InvalidArgumentException |
|
393 | - * @throws ReflectionException |
|
394 | - * @throws DomainException |
|
395 | - * @throws RuntimeException |
|
396 | - */ |
|
397 | - public static function process_expired_transactions() |
|
398 | - { |
|
399 | - if (// are there any TXNs that need cleaning up ? |
|
400 | - empty(self::$_expired_transactions) |
|
401 | - // reschedule the cron if we can't hit the db right now |
|
402 | - || EE_Cron_Tasks::reschedule_cron_for_transactions_if_maintenance_mode( |
|
403 | - 'schedule_expired_transaction_check', |
|
404 | - self::$_expired_transactions |
|
405 | - ) |
|
406 | - ) { |
|
407 | - return; |
|
408 | - } |
|
409 | - /** @type EE_Transaction_Processor $transaction_processor */ |
|
410 | - $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
411 | - // set revisit flag for txn processor |
|
412 | - $transaction_processor->set_revisit(); |
|
413 | - // load EEM_Transaction |
|
414 | - EE_Registry::instance()->load_model('Transaction'); |
|
415 | - foreach (self::$_expired_transactions as $TXN_ID) { |
|
416 | - $transaction = EEM_Transaction::instance()->get_one_by_ID($TXN_ID); |
|
417 | - // verify transaction and whether it is failed or not |
|
418 | - if ($transaction instanceof EE_Transaction) { |
|
419 | - switch ($transaction->status_ID()) { |
|
420 | - // Completed TXNs |
|
421 | - case EEM_Transaction::complete_status_code: |
|
422 | - /** @type EE_Transaction_Processor $transaction_processor */ |
|
423 | - $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
424 | - $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
425 | - $transaction, |
|
426 | - $transaction->last_payment() |
|
427 | - ); |
|
428 | - do_action( |
|
429 | - 'AHEE__EE_Cron_Tasks__process_expired_transactions__completed_transaction', |
|
430 | - $transaction |
|
431 | - ); |
|
432 | - break; |
|
433 | - // Overpaid TXNs |
|
434 | - case EEM_Transaction::overpaid_status_code: |
|
435 | - do_action( |
|
436 | - 'AHEE__EE_Cron_Tasks__process_expired_transactions__overpaid_transaction', |
|
437 | - $transaction |
|
438 | - ); |
|
439 | - break; |
|
440 | - // Incomplete TXNs |
|
441 | - case EEM_Transaction::incomplete_status_code: |
|
442 | - do_action( |
|
443 | - 'AHEE__EE_Cron_Tasks__process_expired_transactions__incomplete_transaction', |
|
444 | - $transaction |
|
445 | - ); |
|
446 | - // todo : move business logic into EE_Transaction_Processor for finalizing abandoned transactions |
|
447 | - break; |
|
448 | - // Abandoned TXNs |
|
449 | - case EEM_Transaction::abandoned_status_code: |
|
450 | - // run hook before updating transaction, primarily so |
|
451 | - // EED_Ticket_Sales_Monitor::process_abandoned_transactions() can release reserved tickets |
|
452 | - do_action( |
|
453 | - 'AHEE__EE_Cron_Tasks__process_expired_transactions__abandoned_transaction', |
|
454 | - $transaction |
|
455 | - ); |
|
456 | - // don't finalize the TXN if it has already been completed |
|
457 | - if ($transaction->all_reg_steps_completed() !== true) { |
|
458 | - /** @type EE_Payment_Processor $payment_processor */ |
|
459 | - $payment_processor = EE_Registry::instance()->load_core('Payment_Processor'); |
|
460 | - // let's simulate an IPN here which will trigger any notifications that need to go out |
|
461 | - $payment_processor->update_txn_based_on_payment( |
|
462 | - $transaction, |
|
463 | - $transaction->last_payment(), |
|
464 | - true, |
|
465 | - true |
|
466 | - ); |
|
467 | - } |
|
468 | - break; |
|
469 | - // Failed TXNs |
|
470 | - case EEM_Transaction::failed_status_code: |
|
471 | - do_action( |
|
472 | - 'AHEE__EE_Cron_Tasks__process_expired_transactions__failed_transaction', |
|
473 | - $transaction |
|
474 | - ); |
|
475 | - // todo : |
|
476 | - // perform garbage collection here and remove clean_out_junk_transactions() |
|
477 | - // $registrations = $transaction->registrations(); |
|
478 | - // if (! empty($registrations)) { |
|
479 | - // foreach ($registrations as $registration) { |
|
480 | - // if ($registration instanceof EE_Registration) { |
|
481 | - // $delete_registration = true; |
|
482 | - // if ($registration->attendee() instanceof EE_Attendee) { |
|
483 | - // $delete_registration = false; |
|
484 | - // } |
|
485 | - // if ($delete_registration) { |
|
486 | - // $registration->delete_permanently(); |
|
487 | - // $registration->delete_related_permanently(); |
|
488 | - // } |
|
489 | - // } |
|
490 | - // } |
|
491 | - // } |
|
492 | - break; |
|
493 | - } |
|
494 | - } |
|
495 | - unset(self::$_expired_transactions[ $TXN_ID ]); |
|
496 | - } |
|
497 | - } |
|
498 | - |
|
499 | - |
|
500 | - |
|
501 | - /************* END OF EXPIRED TRANSACTION CHECK *************/ |
|
502 | - |
|
503 | - |
|
504 | - /************* START CLEAN UP BOT TRANSACTIONS **********************/ |
|
505 | - |
|
506 | - |
|
507 | - /** |
|
508 | - * callback for 'AHEE__EE_Cron_Tasks__clean_up_junk_transactions' |
|
509 | - * which is setup during activation to run on an hourly cron |
|
510 | - * |
|
511 | - * @throws EE_Error |
|
512 | - * @throws InvalidArgumentException |
|
513 | - * @throws InvalidDataTypeException |
|
514 | - * @throws InvalidInterfaceException |
|
515 | - * @throws DomainException |
|
516 | - */ |
|
517 | - public static function clean_out_junk_transactions() |
|
518 | - { |
|
519 | - if (EE_Maintenance_Mode::instance()->models_can_query()) { |
|
520 | - EED_Ticket_Sales_Monitor::reset_reservation_counts(); |
|
521 | - EEM_Transaction::instance('')->delete_junk_transactions(); |
|
522 | - EEM_Registration::instance('')->delete_registrations_with_no_transaction(); |
|
523 | - EEM_Line_Item::instance('')->delete_line_items_with_no_transaction(); |
|
524 | - } |
|
525 | - } |
|
526 | - |
|
527 | - |
|
528 | - /** |
|
529 | - * Deletes old gateway logs. After about a week we usually don't need them for debugging. But folks can filter that. |
|
530 | - * |
|
531 | - * @throws EE_Error |
|
532 | - * @throws InvalidDataTypeException |
|
533 | - * @throws InvalidInterfaceException |
|
534 | - * @throws InvalidArgumentException |
|
535 | - */ |
|
536 | - public static function clean_out_old_gateway_logs() |
|
537 | - { |
|
538 | - if (EE_Maintenance_Mode::instance()->models_can_query()) { |
|
539 | - $reg_config = LoaderFactory::getLoader()->load('EE_Registration_Config'); |
|
540 | - $time_diff_for_comparison = apply_filters( |
|
541 | - 'FHEE__EE_Cron_Tasks__clean_out_old_gateway_logs__time_diff_for_comparison', |
|
542 | - '-' . $reg_config->gateway_log_lifespan |
|
543 | - ); |
|
544 | - EEM_Change_Log::instance()->delete_gateway_logs_older_than(new DateTime($time_diff_for_comparison)); |
|
545 | - } |
|
546 | - } |
|
547 | - |
|
548 | - |
|
549 | - /***************** FINALIZE ABANDONED TRANSACTIONS *****************/ |
|
550 | - |
|
551 | - |
|
552 | - /** |
|
553 | - * @var array |
|
554 | - */ |
|
555 | - protected static $_abandoned_transactions = array(); |
|
556 | - |
|
557 | - |
|
558 | - /** |
|
559 | - * @deprecated |
|
560 | - * @param int $timestamp |
|
561 | - * @param int $TXN_ID |
|
562 | - */ |
|
563 | - public static function schedule_finalize_abandoned_transactions_check($timestamp, $TXN_ID) |
|
564 | - { |
|
565 | - EE_Cron_Tasks::schedule_expired_transaction_check($timestamp, $TXN_ID); |
|
566 | - } |
|
567 | - |
|
568 | - |
|
569 | - /** |
|
570 | - * @deprecated |
|
571 | - * @param int $TXN_ID |
|
572 | - */ |
|
573 | - public static function check_for_abandoned_transactions($TXN_ID = 0) |
|
574 | - { |
|
575 | - EE_Cron_Tasks::expired_transaction_check($TXN_ID); |
|
576 | - } |
|
577 | - |
|
578 | - |
|
579 | - /** |
|
580 | - * @deprecated |
|
581 | - * @throws EE_Error |
|
582 | - * @throws DomainException |
|
583 | - * @throws InvalidDataTypeException |
|
584 | - * @throws InvalidInterfaceException |
|
585 | - * @throws InvalidArgumentException |
|
586 | - * @throws ReflectionException |
|
587 | - * @throws RuntimeException |
|
588 | - */ |
|
589 | - public static function finalize_abandoned_transactions() |
|
590 | - { |
|
591 | - do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
592 | - if (// are there any TXNs that need cleaning up ? |
|
593 | - empty(self::$_abandoned_transactions) |
|
594 | - // reschedule the cron if we can't hit the db right now |
|
595 | - || EE_Cron_Tasks::reschedule_cron_for_transactions_if_maintenance_mode( |
|
596 | - 'schedule_expired_transaction_check', |
|
597 | - self::$_abandoned_transactions |
|
598 | - ) |
|
599 | - ) { |
|
600 | - return; |
|
601 | - } |
|
602 | - // combine our arrays of transaction IDs |
|
603 | - self::$_expired_transactions = self::$_abandoned_transactions + self::$_expired_transactions; |
|
604 | - // and deal with abandoned transactions here now... |
|
605 | - EE_Cron_Tasks::process_expired_transactions(); |
|
606 | - } |
|
607 | - |
|
608 | - |
|
609 | - /************* END OF FINALIZE ABANDONED TRANSACTIONS *************/ |
|
18 | + /** |
|
19 | + * WordPress doesn't allow duplicate crons within 10 minutes of the original, |
|
20 | + * so we'll set our retry time for just over 10 minutes to avoid that |
|
21 | + */ |
|
22 | + const reschedule_timeout = 605; |
|
23 | + |
|
24 | + |
|
25 | + /** |
|
26 | + * @var EE_Cron_Tasks |
|
27 | + */ |
|
28 | + private static $_instance; |
|
29 | + |
|
30 | + |
|
31 | + /** |
|
32 | + * @return EE_Cron_Tasks |
|
33 | + * @throws ReflectionException |
|
34 | + * @throws EE_Error |
|
35 | + * @throws InvalidArgumentException |
|
36 | + * @throws InvalidInterfaceException |
|
37 | + * @throws InvalidDataTypeException |
|
38 | + */ |
|
39 | + public static function instance() |
|
40 | + { |
|
41 | + if (! self::$_instance instanceof EE_Cron_Tasks) { |
|
42 | + self::$_instance = new self(); |
|
43 | + } |
|
44 | + return self::$_instance; |
|
45 | + } |
|
46 | + |
|
47 | + |
|
48 | + /** |
|
49 | + * @access private |
|
50 | + * @throws InvalidDataTypeException |
|
51 | + * @throws InvalidInterfaceException |
|
52 | + * @throws InvalidArgumentException |
|
53 | + * @throws EE_Error |
|
54 | + * @throws ReflectionException |
|
55 | + */ |
|
56 | + private function __construct() |
|
57 | + { |
|
58 | + do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
59 | + // verify that WP Cron is enabled |
|
60 | + if (defined('DISABLE_WP_CRON') |
|
61 | + && DISABLE_WP_CRON |
|
62 | + && is_admin() |
|
63 | + && ! get_option('ee_disabled_wp_cron_check') |
|
64 | + ) { |
|
65 | + /** |
|
66 | + * This needs to be delayed until after the config is loaded because EE_Cron_Tasks is constructed before |
|
67 | + * config is loaded. |
|
68 | + * This is intentionally using a anonymous function so that its not easily de-registered. Client code |
|
69 | + * wanting to not have this functionality can just register its own action at a priority after this one to |
|
70 | + * reverse any changes. |
|
71 | + */ |
|
72 | + add_action( |
|
73 | + 'AHEE__EE_System__load_core_configuration__complete', |
|
74 | + function () { |
|
75 | + EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request = true; |
|
76 | + EE_Registry::instance()->NET_CFG->update_config(true, false); |
|
77 | + add_option('ee_disabled_wp_cron_check', 1, '', false); |
|
78 | + } |
|
79 | + ); |
|
80 | + } |
|
81 | + // UPDATE TRANSACTION WITH PAYMENT |
|
82 | + add_action( |
|
83 | + 'AHEE__EE_Cron_Tasks__update_transaction_with_payment_2', |
|
84 | + array('EE_Cron_Tasks', 'setup_update_for_transaction_with_payment'), |
|
85 | + 10, |
|
86 | + 2 |
|
87 | + ); |
|
88 | + // ABANDONED / EXPIRED TRANSACTION CHECK |
|
89 | + add_action( |
|
90 | + 'AHEE__EE_Cron_Tasks__expired_transaction_check', |
|
91 | + array('EE_Cron_Tasks', 'expired_transaction_check'), |
|
92 | + 10, |
|
93 | + 1 |
|
94 | + ); |
|
95 | + // CLEAN OUT JUNK TRANSACTIONS AND RELATED DATA |
|
96 | + add_action( |
|
97 | + 'AHEE__EE_Cron_Tasks__clean_up_junk_transactions', |
|
98 | + array('EE_Cron_Tasks', 'clean_out_junk_transactions') |
|
99 | + ); |
|
100 | + // logging |
|
101 | + add_action( |
|
102 | + 'AHEE__EE_System__load_core_configuration__complete', |
|
103 | + array('EE_Cron_Tasks', 'log_scheduled_ee_crons') |
|
104 | + ); |
|
105 | + EE_Registry::instance()->load_lib('Messages_Scheduler'); |
|
106 | + // clean out old gateway logs |
|
107 | + add_action( |
|
108 | + 'AHEE_EE_Cron_Tasks__clean_out_old_gateway_logs', |
|
109 | + array('EE_Cron_Tasks', 'clean_out_old_gateway_logs') |
|
110 | + ); |
|
111 | + } |
|
112 | + |
|
113 | + |
|
114 | + /** |
|
115 | + * @access protected |
|
116 | + * @return void |
|
117 | + */ |
|
118 | + public static function log_scheduled_ee_crons() |
|
119 | + { |
|
120 | + $ee_crons = array( |
|
121 | + 'AHEE__EE_Cron_Tasks__update_transaction_with_payment', |
|
122 | + 'AHEE__EE_Cron_Tasks__finalize_abandoned_transactions', |
|
123 | + 'AHEE__EE_Cron_Tasks__clean_up_junk_transactions', |
|
124 | + ); |
|
125 | + $crons = (array) get_option('cron'); |
|
126 | + if (! is_array($crons)) { |
|
127 | + return; |
|
128 | + } |
|
129 | + foreach ($crons as $timestamp => $cron) { |
|
130 | + /** @var array[] $cron */ |
|
131 | + foreach ($ee_crons as $ee_cron) { |
|
132 | + if (isset($cron[ $ee_cron ]) && is_array($cron[ $ee_cron ])) { |
|
133 | + do_action('AHEE_log', __CLASS__, __FUNCTION__, $ee_cron, 'scheduled EE cron'); |
|
134 | + foreach ($cron[ $ee_cron ] as $ee_cron_details) { |
|
135 | + if (! empty($ee_cron_details['args'])) { |
|
136 | + do_action( |
|
137 | + 'AHEE_log', |
|
138 | + __CLASS__, |
|
139 | + __FUNCTION__, |
|
140 | + print_r($ee_cron_details['args'], true), |
|
141 | + "{$ee_cron} args" |
|
142 | + ); |
|
143 | + } |
|
144 | + } |
|
145 | + } |
|
146 | + } |
|
147 | + } |
|
148 | + } |
|
149 | + |
|
150 | + |
|
151 | + /** |
|
152 | + * reschedule_cron_for_transactions_if_maintenance_mode |
|
153 | + * if Maintenance Mode is active, this will reschedule a cron to run again in 10 minutes |
|
154 | + * |
|
155 | + * @param string $cron_task |
|
156 | + * @param array $TXN_IDs |
|
157 | + * @return bool |
|
158 | + * @throws DomainException |
|
159 | + */ |
|
160 | + public static function reschedule_cron_for_transactions_if_maintenance_mode($cron_task, array $TXN_IDs) |
|
161 | + { |
|
162 | + if (! method_exists('EE_Cron_Tasks', $cron_task)) { |
|
163 | + throw new DomainException( |
|
164 | + sprintf( |
|
165 | + __('"%1$s" is not valid method on EE_Cron_Tasks.', 'event_espresso'), |
|
166 | + $cron_task |
|
167 | + ) |
|
168 | + ); |
|
169 | + } |
|
170 | + // reschedule the cron if we can't hit the db right now |
|
171 | + if (! EE_Maintenance_Mode::instance()->models_can_query()) { |
|
172 | + foreach ($TXN_IDs as $TXN_ID => $additional_vars) { |
|
173 | + // ensure $additional_vars is an array |
|
174 | + $additional_vars = is_array($additional_vars) ? $additional_vars : array($additional_vars); |
|
175 | + // reset cron job for the TXN |
|
176 | + call_user_func_array( |
|
177 | + array('EE_Cron_Tasks', $cron_task), |
|
178 | + array_merge( |
|
179 | + array( |
|
180 | + time() + (10 * MINUTE_IN_SECONDS), |
|
181 | + $TXN_ID, |
|
182 | + ), |
|
183 | + $additional_vars |
|
184 | + ) |
|
185 | + ); |
|
186 | + } |
|
187 | + return true; |
|
188 | + } |
|
189 | + return false; |
|
190 | + } |
|
191 | + |
|
192 | + |
|
193 | + |
|
194 | + |
|
195 | + /**************** UPDATE TRANSACTION WITH PAYMENT ****************/ |
|
196 | + |
|
197 | + |
|
198 | + /** |
|
199 | + * array of TXN IDs and the payment |
|
200 | + * |
|
201 | + * @var array |
|
202 | + */ |
|
203 | + protected static $_update_transactions_with_payment = array(); |
|
204 | + |
|
205 | + |
|
206 | + /** |
|
207 | + * schedule_update_transaction_with_payment |
|
208 | + * sets a wp_schedule_single_event() for updating any TXNs that may |
|
209 | + * require updating due to recently received payments |
|
210 | + * |
|
211 | + * @param int $timestamp |
|
212 | + * @param int $TXN_ID |
|
213 | + * @param int $PAY_ID |
|
214 | + */ |
|
215 | + public static function schedule_update_transaction_with_payment( |
|
216 | + $timestamp, |
|
217 | + $TXN_ID, |
|
218 | + $PAY_ID |
|
219 | + ) { |
|
220 | + do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
221 | + // validate $TXN_ID and $timestamp |
|
222 | + $TXN_ID = absint($TXN_ID); |
|
223 | + $timestamp = absint($timestamp); |
|
224 | + if ($TXN_ID && $timestamp) { |
|
225 | + wp_schedule_single_event( |
|
226 | + $timestamp, |
|
227 | + 'AHEE__EE_Cron_Tasks__update_transaction_with_payment_2', |
|
228 | + array($TXN_ID, $PAY_ID) |
|
229 | + ); |
|
230 | + } |
|
231 | + } |
|
232 | + |
|
233 | + |
|
234 | + /** |
|
235 | + * setup_update_for_transaction_with_payment |
|
236 | + * this is the callback for the action hook: |
|
237 | + * 'AHEE__EE_Cron_Tasks__update_transaction_with_payment' |
|
238 | + * which is setup by EE_Cron_Tasks::schedule_update_transaction_with_payment(). |
|
239 | + * The passed TXN_ID and associated payment gets added to an array, and then |
|
240 | + * the EE_Cron_Tasks::update_transaction_with_payment() function is hooked into |
|
241 | + * 'shutdown' which will actually handle the processing of any |
|
242 | + * transactions requiring updating, because doing so now would be too early |
|
243 | + * and the required resources may not be available |
|
244 | + * |
|
245 | + * @param int $TXN_ID |
|
246 | + * @param int $PAY_ID |
|
247 | + */ |
|
248 | + public static function setup_update_for_transaction_with_payment($TXN_ID = 0, $PAY_ID = 0) |
|
249 | + { |
|
250 | + do_action('AHEE_log', __CLASS__, __FUNCTION__, $TXN_ID, '$TXN_ID'); |
|
251 | + if (absint($TXN_ID)) { |
|
252 | + self::$_update_transactions_with_payment[ $TXN_ID ] = $PAY_ID; |
|
253 | + add_action( |
|
254 | + 'shutdown', |
|
255 | + array('EE_Cron_Tasks', 'update_transaction_with_payment'), |
|
256 | + 5 |
|
257 | + ); |
|
258 | + } |
|
259 | + } |
|
260 | + |
|
261 | + |
|
262 | + /** |
|
263 | + * update_transaction_with_payment |
|
264 | + * loops through the self::$_abandoned_transactions array |
|
265 | + * and attempts to finalize any TXNs that have not been completed |
|
266 | + * but have had their sessions expired, most likely due to a user not |
|
267 | + * returning from an off-site payment gateway |
|
268 | + * |
|
269 | + * @throws EE_Error |
|
270 | + * @throws DomainException |
|
271 | + * @throws InvalidDataTypeException |
|
272 | + * @throws InvalidInterfaceException |
|
273 | + * @throws InvalidArgumentException |
|
274 | + * @throws ReflectionException |
|
275 | + * @throws RuntimeException |
|
276 | + */ |
|
277 | + public static function update_transaction_with_payment() |
|
278 | + { |
|
279 | + do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
280 | + if (// are there any TXNs that need cleaning up ? |
|
281 | + empty(self::$_update_transactions_with_payment) |
|
282 | + // reschedule the cron if we can't hit the db right now |
|
283 | + || EE_Cron_Tasks::reschedule_cron_for_transactions_if_maintenance_mode( |
|
284 | + 'schedule_update_transaction_with_payment', |
|
285 | + self::$_update_transactions_with_payment |
|
286 | + ) |
|
287 | + ) { |
|
288 | + return; |
|
289 | + } |
|
290 | + /** @type EE_Payment_Processor $payment_processor */ |
|
291 | + $payment_processor = EE_Registry::instance()->load_core('Payment_Processor'); |
|
292 | + // set revisit flag for payment processor |
|
293 | + $payment_processor->set_revisit(); |
|
294 | + // load EEM_Transaction |
|
295 | + EE_Registry::instance()->load_model('Transaction'); |
|
296 | + foreach (self::$_update_transactions_with_payment as $TXN_ID => $PAY_ID) { |
|
297 | + // reschedule the cron if we can't hit the db right now |
|
298 | + if (! EE_Maintenance_Mode::instance()->models_can_query()) { |
|
299 | + // reset cron job for updating the TXN |
|
300 | + EE_Cron_Tasks::schedule_update_transaction_with_payment( |
|
301 | + time() + EE_Cron_Tasks::reschedule_timeout, |
|
302 | + $TXN_ID, |
|
303 | + $PAY_ID |
|
304 | + ); |
|
305 | + continue; |
|
306 | + } |
|
307 | + $transaction = EEM_Transaction::instance()->get_one_by_ID($TXN_ID); |
|
308 | + $payment = EEM_Payment::instance()->get_one_by_ID($PAY_ID); |
|
309 | + // verify transaction |
|
310 | + if ($transaction instanceof EE_Transaction && $payment instanceof EE_Payment) { |
|
311 | + // now try to update the TXN with any payments |
|
312 | + $payment_processor->update_txn_based_on_payment($transaction, $payment, true, true); |
|
313 | + } |
|
314 | + unset(self::$_update_transactions_with_payment[ $TXN_ID ]); |
|
315 | + } |
|
316 | + } |
|
317 | + |
|
318 | + |
|
319 | + |
|
320 | + /************ END OF UPDATE TRANSACTION WITH PAYMENT ************/ |
|
321 | + |
|
322 | + |
|
323 | + /***************** EXPIRED TRANSACTION CHECK *****************/ |
|
324 | + |
|
325 | + |
|
326 | + /** |
|
327 | + * array of TXN IDs |
|
328 | + * |
|
329 | + * @var array |
|
330 | + */ |
|
331 | + protected static $_expired_transactions = array(); |
|
332 | + |
|
333 | + |
|
334 | + /** |
|
335 | + * schedule_expired_transaction_check |
|
336 | + * sets a wp_schedule_single_event() for following up on TXNs after their session has expired |
|
337 | + * |
|
338 | + * @param int $timestamp |
|
339 | + * @param int $TXN_ID |
|
340 | + */ |
|
341 | + public static function schedule_expired_transaction_check( |
|
342 | + $timestamp, |
|
343 | + $TXN_ID |
|
344 | + ) { |
|
345 | + // validate $TXN_ID and $timestamp |
|
346 | + $TXN_ID = absint($TXN_ID); |
|
347 | + $timestamp = absint($timestamp); |
|
348 | + if ($TXN_ID && $timestamp) { |
|
349 | + wp_schedule_single_event( |
|
350 | + $timestamp, |
|
351 | + 'AHEE__EE_Cron_Tasks__expired_transaction_check', |
|
352 | + array($TXN_ID) |
|
353 | + ); |
|
354 | + } |
|
355 | + } |
|
356 | + |
|
357 | + |
|
358 | + /** |
|
359 | + * expired_transaction_check |
|
360 | + * this is the callback for the action hook: |
|
361 | + * 'AHEE__EE_Cron_Tasks__transaction_session_expiration_check' |
|
362 | + * which is utilized by wp_schedule_single_event() |
|
363 | + * in \EED_Single_Page_Checkout::_initialize_transaction(). |
|
364 | + * The passed TXN_ID gets added to an array, and then the |
|
365 | + * process_expired_transactions() function is hooked into |
|
366 | + * 'AHEE__EE_System__core_loaded_and_ready' which will actually handle the |
|
367 | + * processing of any failed transactions, because doing so now would be |
|
368 | + * too early and the required resources may not be available |
|
369 | + * |
|
370 | + * @param int $TXN_ID |
|
371 | + */ |
|
372 | + public static function expired_transaction_check($TXN_ID = 0) |
|
373 | + { |
|
374 | + if (absint($TXN_ID)) { |
|
375 | + self::$_expired_transactions[ $TXN_ID ] = $TXN_ID; |
|
376 | + add_action( |
|
377 | + 'shutdown', |
|
378 | + array('EE_Cron_Tasks', 'process_expired_transactions'), |
|
379 | + 5 |
|
380 | + ); |
|
381 | + } |
|
382 | + } |
|
383 | + |
|
384 | + |
|
385 | + /** |
|
386 | + * process_expired_transactions |
|
387 | + * loops through the self::$_expired_transactions array and processes any failed TXNs |
|
388 | + * |
|
389 | + * @throws EE_Error |
|
390 | + * @throws InvalidDataTypeException |
|
391 | + * @throws InvalidInterfaceException |
|
392 | + * @throws InvalidArgumentException |
|
393 | + * @throws ReflectionException |
|
394 | + * @throws DomainException |
|
395 | + * @throws RuntimeException |
|
396 | + */ |
|
397 | + public static function process_expired_transactions() |
|
398 | + { |
|
399 | + if (// are there any TXNs that need cleaning up ? |
|
400 | + empty(self::$_expired_transactions) |
|
401 | + // reschedule the cron if we can't hit the db right now |
|
402 | + || EE_Cron_Tasks::reschedule_cron_for_transactions_if_maintenance_mode( |
|
403 | + 'schedule_expired_transaction_check', |
|
404 | + self::$_expired_transactions |
|
405 | + ) |
|
406 | + ) { |
|
407 | + return; |
|
408 | + } |
|
409 | + /** @type EE_Transaction_Processor $transaction_processor */ |
|
410 | + $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
411 | + // set revisit flag for txn processor |
|
412 | + $transaction_processor->set_revisit(); |
|
413 | + // load EEM_Transaction |
|
414 | + EE_Registry::instance()->load_model('Transaction'); |
|
415 | + foreach (self::$_expired_transactions as $TXN_ID) { |
|
416 | + $transaction = EEM_Transaction::instance()->get_one_by_ID($TXN_ID); |
|
417 | + // verify transaction and whether it is failed or not |
|
418 | + if ($transaction instanceof EE_Transaction) { |
|
419 | + switch ($transaction->status_ID()) { |
|
420 | + // Completed TXNs |
|
421 | + case EEM_Transaction::complete_status_code: |
|
422 | + /** @type EE_Transaction_Processor $transaction_processor */ |
|
423 | + $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
424 | + $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
425 | + $transaction, |
|
426 | + $transaction->last_payment() |
|
427 | + ); |
|
428 | + do_action( |
|
429 | + 'AHEE__EE_Cron_Tasks__process_expired_transactions__completed_transaction', |
|
430 | + $transaction |
|
431 | + ); |
|
432 | + break; |
|
433 | + // Overpaid TXNs |
|
434 | + case EEM_Transaction::overpaid_status_code: |
|
435 | + do_action( |
|
436 | + 'AHEE__EE_Cron_Tasks__process_expired_transactions__overpaid_transaction', |
|
437 | + $transaction |
|
438 | + ); |
|
439 | + break; |
|
440 | + // Incomplete TXNs |
|
441 | + case EEM_Transaction::incomplete_status_code: |
|
442 | + do_action( |
|
443 | + 'AHEE__EE_Cron_Tasks__process_expired_transactions__incomplete_transaction', |
|
444 | + $transaction |
|
445 | + ); |
|
446 | + // todo : move business logic into EE_Transaction_Processor for finalizing abandoned transactions |
|
447 | + break; |
|
448 | + // Abandoned TXNs |
|
449 | + case EEM_Transaction::abandoned_status_code: |
|
450 | + // run hook before updating transaction, primarily so |
|
451 | + // EED_Ticket_Sales_Monitor::process_abandoned_transactions() can release reserved tickets |
|
452 | + do_action( |
|
453 | + 'AHEE__EE_Cron_Tasks__process_expired_transactions__abandoned_transaction', |
|
454 | + $transaction |
|
455 | + ); |
|
456 | + // don't finalize the TXN if it has already been completed |
|
457 | + if ($transaction->all_reg_steps_completed() !== true) { |
|
458 | + /** @type EE_Payment_Processor $payment_processor */ |
|
459 | + $payment_processor = EE_Registry::instance()->load_core('Payment_Processor'); |
|
460 | + // let's simulate an IPN here which will trigger any notifications that need to go out |
|
461 | + $payment_processor->update_txn_based_on_payment( |
|
462 | + $transaction, |
|
463 | + $transaction->last_payment(), |
|
464 | + true, |
|
465 | + true |
|
466 | + ); |
|
467 | + } |
|
468 | + break; |
|
469 | + // Failed TXNs |
|
470 | + case EEM_Transaction::failed_status_code: |
|
471 | + do_action( |
|
472 | + 'AHEE__EE_Cron_Tasks__process_expired_transactions__failed_transaction', |
|
473 | + $transaction |
|
474 | + ); |
|
475 | + // todo : |
|
476 | + // perform garbage collection here and remove clean_out_junk_transactions() |
|
477 | + // $registrations = $transaction->registrations(); |
|
478 | + // if (! empty($registrations)) { |
|
479 | + // foreach ($registrations as $registration) { |
|
480 | + // if ($registration instanceof EE_Registration) { |
|
481 | + // $delete_registration = true; |
|
482 | + // if ($registration->attendee() instanceof EE_Attendee) { |
|
483 | + // $delete_registration = false; |
|
484 | + // } |
|
485 | + // if ($delete_registration) { |
|
486 | + // $registration->delete_permanently(); |
|
487 | + // $registration->delete_related_permanently(); |
|
488 | + // } |
|
489 | + // } |
|
490 | + // } |
|
491 | + // } |
|
492 | + break; |
|
493 | + } |
|
494 | + } |
|
495 | + unset(self::$_expired_transactions[ $TXN_ID ]); |
|
496 | + } |
|
497 | + } |
|
498 | + |
|
499 | + |
|
500 | + |
|
501 | + /************* END OF EXPIRED TRANSACTION CHECK *************/ |
|
502 | + |
|
503 | + |
|
504 | + /************* START CLEAN UP BOT TRANSACTIONS **********************/ |
|
505 | + |
|
506 | + |
|
507 | + /** |
|
508 | + * callback for 'AHEE__EE_Cron_Tasks__clean_up_junk_transactions' |
|
509 | + * which is setup during activation to run on an hourly cron |
|
510 | + * |
|
511 | + * @throws EE_Error |
|
512 | + * @throws InvalidArgumentException |
|
513 | + * @throws InvalidDataTypeException |
|
514 | + * @throws InvalidInterfaceException |
|
515 | + * @throws DomainException |
|
516 | + */ |
|
517 | + public static function clean_out_junk_transactions() |
|
518 | + { |
|
519 | + if (EE_Maintenance_Mode::instance()->models_can_query()) { |
|
520 | + EED_Ticket_Sales_Monitor::reset_reservation_counts(); |
|
521 | + EEM_Transaction::instance('')->delete_junk_transactions(); |
|
522 | + EEM_Registration::instance('')->delete_registrations_with_no_transaction(); |
|
523 | + EEM_Line_Item::instance('')->delete_line_items_with_no_transaction(); |
|
524 | + } |
|
525 | + } |
|
526 | + |
|
527 | + |
|
528 | + /** |
|
529 | + * Deletes old gateway logs. After about a week we usually don't need them for debugging. But folks can filter that. |
|
530 | + * |
|
531 | + * @throws EE_Error |
|
532 | + * @throws InvalidDataTypeException |
|
533 | + * @throws InvalidInterfaceException |
|
534 | + * @throws InvalidArgumentException |
|
535 | + */ |
|
536 | + public static function clean_out_old_gateway_logs() |
|
537 | + { |
|
538 | + if (EE_Maintenance_Mode::instance()->models_can_query()) { |
|
539 | + $reg_config = LoaderFactory::getLoader()->load('EE_Registration_Config'); |
|
540 | + $time_diff_for_comparison = apply_filters( |
|
541 | + 'FHEE__EE_Cron_Tasks__clean_out_old_gateway_logs__time_diff_for_comparison', |
|
542 | + '-' . $reg_config->gateway_log_lifespan |
|
543 | + ); |
|
544 | + EEM_Change_Log::instance()->delete_gateway_logs_older_than(new DateTime($time_diff_for_comparison)); |
|
545 | + } |
|
546 | + } |
|
547 | + |
|
548 | + |
|
549 | + /***************** FINALIZE ABANDONED TRANSACTIONS *****************/ |
|
550 | + |
|
551 | + |
|
552 | + /** |
|
553 | + * @var array |
|
554 | + */ |
|
555 | + protected static $_abandoned_transactions = array(); |
|
556 | + |
|
557 | + |
|
558 | + /** |
|
559 | + * @deprecated |
|
560 | + * @param int $timestamp |
|
561 | + * @param int $TXN_ID |
|
562 | + */ |
|
563 | + public static function schedule_finalize_abandoned_transactions_check($timestamp, $TXN_ID) |
|
564 | + { |
|
565 | + EE_Cron_Tasks::schedule_expired_transaction_check($timestamp, $TXN_ID); |
|
566 | + } |
|
567 | + |
|
568 | + |
|
569 | + /** |
|
570 | + * @deprecated |
|
571 | + * @param int $TXN_ID |
|
572 | + */ |
|
573 | + public static function check_for_abandoned_transactions($TXN_ID = 0) |
|
574 | + { |
|
575 | + EE_Cron_Tasks::expired_transaction_check($TXN_ID); |
|
576 | + } |
|
577 | + |
|
578 | + |
|
579 | + /** |
|
580 | + * @deprecated |
|
581 | + * @throws EE_Error |
|
582 | + * @throws DomainException |
|
583 | + * @throws InvalidDataTypeException |
|
584 | + * @throws InvalidInterfaceException |
|
585 | + * @throws InvalidArgumentException |
|
586 | + * @throws ReflectionException |
|
587 | + * @throws RuntimeException |
|
588 | + */ |
|
589 | + public static function finalize_abandoned_transactions() |
|
590 | + { |
|
591 | + do_action('AHEE_log', __CLASS__, __FUNCTION__); |
|
592 | + if (// are there any TXNs that need cleaning up ? |
|
593 | + empty(self::$_abandoned_transactions) |
|
594 | + // reschedule the cron if we can't hit the db right now |
|
595 | + || EE_Cron_Tasks::reschedule_cron_for_transactions_if_maintenance_mode( |
|
596 | + 'schedule_expired_transaction_check', |
|
597 | + self::$_abandoned_transactions |
|
598 | + ) |
|
599 | + ) { |
|
600 | + return; |
|
601 | + } |
|
602 | + // combine our arrays of transaction IDs |
|
603 | + self::$_expired_transactions = self::$_abandoned_transactions + self::$_expired_transactions; |
|
604 | + // and deal with abandoned transactions here now... |
|
605 | + EE_Cron_Tasks::process_expired_transactions(); |
|
606 | + } |
|
607 | + |
|
608 | + |
|
609 | + /************* END OF FINALIZE ABANDONED TRANSACTIONS *************/ |
|
610 | 610 | } |
@@ -22,239 +22,239 @@ |
||
22 | 22 | class ThankYouPageIpnMonitor |
23 | 23 | { |
24 | 24 | |
25 | - /** |
|
26 | - * @var string $heartbeat |
|
27 | - */ |
|
28 | - private $heartbeat; |
|
25 | + /** |
|
26 | + * @var string $heartbeat |
|
27 | + */ |
|
28 | + private $heartbeat; |
|
29 | 29 | |
30 | - /** |
|
31 | - * @var EED_Thank_You_Page $thank_you_page |
|
32 | - */ |
|
33 | - private $thank_you_page; |
|
30 | + /** |
|
31 | + * @var EED_Thank_You_Page $thank_you_page |
|
32 | + */ |
|
33 | + private $thank_you_page; |
|
34 | 34 | |
35 | - /** |
|
36 | - * @var EE_Transaction $transaction |
|
37 | - */ |
|
38 | - private $transaction; |
|
35 | + /** |
|
36 | + * @var EE_Transaction $transaction |
|
37 | + */ |
|
38 | + private $transaction; |
|
39 | 39 | |
40 | 40 | |
41 | - /** |
|
42 | - * EventEditorHeartbeat constructor. |
|
43 | - */ |
|
44 | - public function __construct() |
|
45 | - { |
|
46 | - $this->heartbeat = WordpressHeartbeat::RESPONSE_KEY_THANK_YOU_PAGE; |
|
47 | - add_filter('heartbeat_received', array($this, 'heartbeatResponse'), 10, 3); |
|
48 | - add_filter('heartbeat_nopriv_received', array($this, 'heartbeatResponse'), 10, 3); |
|
49 | - } |
|
41 | + /** |
|
42 | + * EventEditorHeartbeat constructor. |
|
43 | + */ |
|
44 | + public function __construct() |
|
45 | + { |
|
46 | + $this->heartbeat = WordpressHeartbeat::RESPONSE_KEY_THANK_YOU_PAGE; |
|
47 | + add_filter('heartbeat_received', array($this, 'heartbeatResponse'), 10, 3); |
|
48 | + add_filter('heartbeat_nopriv_received', array($this, 'heartbeatResponse'), 10, 3); |
|
49 | + } |
|
50 | 50 | |
51 | 51 | |
52 | - /** |
|
53 | - * thank_you_page_IPN_monitor |
|
54 | - * this basically just pulls the TXN based on the reg_url_link sent from the server, |
|
55 | - * then checks that the TXN status is not failed, and that no other errors have been generated. |
|
56 | - * it also calculates the IPN wait time since the Thank You page was first loaded |
|
57 | - * |
|
58 | - * @param array $response |
|
59 | - * @param array $data |
|
60 | - * @return array |
|
61 | - * @throws EE_Error |
|
62 | - * @throws InvalidArgumentException |
|
63 | - * @throws InvalidDataTypeException |
|
64 | - * @throws InvalidInterfaceException |
|
65 | - * @throws ReflectionException |
|
66 | - */ |
|
67 | - public function heartbeatResponse($response = array(), $data = array()) |
|
68 | - { |
|
69 | - // does this heartbeat contain our data ? |
|
70 | - if (! isset($data[ $this->heartbeat ])) { |
|
71 | - return $response; |
|
72 | - } |
|
73 | - // check for reg_url_link in the incoming heartbeat data |
|
74 | - if (! isset($data[ $this->heartbeat ]['e_reg_url_link'])) { |
|
75 | - $response[ $this->heartbeat ] = array( |
|
76 | - 'errors' => ! empty($notices['errors']) |
|
77 | - ? $notices['errors'] |
|
78 | - : __( |
|
79 | - 'No transaction information could be retrieved because the registration URL link is missing or invalid.', |
|
80 | - 'event_espresso' |
|
81 | - ), |
|
82 | - ); |
|
83 | - return $response; |
|
84 | - } |
|
85 | - // kk heartbeat has our data |
|
86 | - $response = $this->initializeThankYouPageAndTransaction($response, $data); |
|
87 | - // if something went wrong... |
|
88 | - if (isset($response[ $this->heartbeat ]['errors'])) { |
|
89 | - return $response; |
|
90 | - } |
|
91 | - // grab transient of Transaction's status |
|
92 | - $txn_status = isset($data[ $this->heartbeat ]['txn_status']) |
|
93 | - ? $data[ $this->heartbeat ]['txn_status'] |
|
94 | - : null; |
|
95 | - $response = $this->getTransactionDetails($txn_status, $response, $data); |
|
96 | - // no payment data yet? |
|
97 | - if (isset($response[ $this->heartbeat ]['still_waiting'])) { |
|
98 | - return $response; |
|
99 | - } |
|
100 | - // TXN is happening so let's get the payments now |
|
101 | - // if we've already gotten payments then the heartbeat data will contain the timestamp of the last time we checked |
|
102 | - $since = isset($data[ $this->heartbeat ]['get_payments_since']) |
|
103 | - ? $data[ $this->heartbeat ]['get_payments_since'] |
|
104 | - : 0; |
|
105 | - return $this->paymentDetails($response, $since); |
|
106 | - } |
|
52 | + /** |
|
53 | + * thank_you_page_IPN_monitor |
|
54 | + * this basically just pulls the TXN based on the reg_url_link sent from the server, |
|
55 | + * then checks that the TXN status is not failed, and that no other errors have been generated. |
|
56 | + * it also calculates the IPN wait time since the Thank You page was first loaded |
|
57 | + * |
|
58 | + * @param array $response |
|
59 | + * @param array $data |
|
60 | + * @return array |
|
61 | + * @throws EE_Error |
|
62 | + * @throws InvalidArgumentException |
|
63 | + * @throws InvalidDataTypeException |
|
64 | + * @throws InvalidInterfaceException |
|
65 | + * @throws ReflectionException |
|
66 | + */ |
|
67 | + public function heartbeatResponse($response = array(), $data = array()) |
|
68 | + { |
|
69 | + // does this heartbeat contain our data ? |
|
70 | + if (! isset($data[ $this->heartbeat ])) { |
|
71 | + return $response; |
|
72 | + } |
|
73 | + // check for reg_url_link in the incoming heartbeat data |
|
74 | + if (! isset($data[ $this->heartbeat ]['e_reg_url_link'])) { |
|
75 | + $response[ $this->heartbeat ] = array( |
|
76 | + 'errors' => ! empty($notices['errors']) |
|
77 | + ? $notices['errors'] |
|
78 | + : __( |
|
79 | + 'No transaction information could be retrieved because the registration URL link is missing or invalid.', |
|
80 | + 'event_espresso' |
|
81 | + ), |
|
82 | + ); |
|
83 | + return $response; |
|
84 | + } |
|
85 | + // kk heartbeat has our data |
|
86 | + $response = $this->initializeThankYouPageAndTransaction($response, $data); |
|
87 | + // if something went wrong... |
|
88 | + if (isset($response[ $this->heartbeat ]['errors'])) { |
|
89 | + return $response; |
|
90 | + } |
|
91 | + // grab transient of Transaction's status |
|
92 | + $txn_status = isset($data[ $this->heartbeat ]['txn_status']) |
|
93 | + ? $data[ $this->heartbeat ]['txn_status'] |
|
94 | + : null; |
|
95 | + $response = $this->getTransactionDetails($txn_status, $response, $data); |
|
96 | + // no payment data yet? |
|
97 | + if (isset($response[ $this->heartbeat ]['still_waiting'])) { |
|
98 | + return $response; |
|
99 | + } |
|
100 | + // TXN is happening so let's get the payments now |
|
101 | + // if we've already gotten payments then the heartbeat data will contain the timestamp of the last time we checked |
|
102 | + $since = isset($data[ $this->heartbeat ]['get_payments_since']) |
|
103 | + ? $data[ $this->heartbeat ]['get_payments_since'] |
|
104 | + : 0; |
|
105 | + return $this->paymentDetails($response, $since); |
|
106 | + } |
|
107 | 107 | |
108 | 108 | |
109 | - /** |
|
110 | - * @param array $response |
|
111 | - * @param array $data |
|
112 | - * @return array |
|
113 | - * @throws EE_Error |
|
114 | - * @throws InvalidArgumentException |
|
115 | - * @throws InvalidDataTypeException |
|
116 | - * @throws InvalidInterfaceException |
|
117 | - */ |
|
118 | - private function initializeThankYouPageAndTransaction($response, $data) |
|
119 | - { |
|
120 | - require_once EE_MODULES . 'thank_you_page/EED_Thank_You_Page.module.php'; |
|
121 | - // set_definitions, instantiate the thank you page class, and get the ball rolling |
|
122 | - EED_Thank_You_Page::set_definitions(); |
|
123 | - $this->thank_you_page = EED_Thank_You_Page::instance(); |
|
124 | - $this->thank_you_page->set_reg_url_link($data[ $this->heartbeat ]['e_reg_url_link']); |
|
125 | - $this->thank_you_page->init(); |
|
126 | - // get TXN |
|
127 | - $transaction = $this->thank_you_page->get_txn(); |
|
128 | - // no TXN? then get out |
|
129 | - if (! $transaction instanceof EE_Transaction) { |
|
130 | - $notices = EE_Error::get_notices(); |
|
131 | - $response[ $this->heartbeat ] = array( |
|
132 | - 'errors' => ! empty($notices['errors']) |
|
133 | - ? $notices['errors'] |
|
134 | - : sprintf( |
|
135 | - __( |
|
136 | - 'The information for your transaction could not be retrieved from the server or the transaction data received was invalid because of a technical reason. (%s)', |
|
137 | - 'event_espresso' |
|
138 | - ), |
|
139 | - __LINE__ |
|
140 | - ), |
|
141 | - ); |
|
142 | - return $response; |
|
143 | - } |
|
144 | - $this->transaction = $transaction; |
|
145 | - return $response; |
|
146 | - } |
|
109 | + /** |
|
110 | + * @param array $response |
|
111 | + * @param array $data |
|
112 | + * @return array |
|
113 | + * @throws EE_Error |
|
114 | + * @throws InvalidArgumentException |
|
115 | + * @throws InvalidDataTypeException |
|
116 | + * @throws InvalidInterfaceException |
|
117 | + */ |
|
118 | + private function initializeThankYouPageAndTransaction($response, $data) |
|
119 | + { |
|
120 | + require_once EE_MODULES . 'thank_you_page/EED_Thank_You_Page.module.php'; |
|
121 | + // set_definitions, instantiate the thank you page class, and get the ball rolling |
|
122 | + EED_Thank_You_Page::set_definitions(); |
|
123 | + $this->thank_you_page = EED_Thank_You_Page::instance(); |
|
124 | + $this->thank_you_page->set_reg_url_link($data[ $this->heartbeat ]['e_reg_url_link']); |
|
125 | + $this->thank_you_page->init(); |
|
126 | + // get TXN |
|
127 | + $transaction = $this->thank_you_page->get_txn(); |
|
128 | + // no TXN? then get out |
|
129 | + if (! $transaction instanceof EE_Transaction) { |
|
130 | + $notices = EE_Error::get_notices(); |
|
131 | + $response[ $this->heartbeat ] = array( |
|
132 | + 'errors' => ! empty($notices['errors']) |
|
133 | + ? $notices['errors'] |
|
134 | + : sprintf( |
|
135 | + __( |
|
136 | + 'The information for your transaction could not be retrieved from the server or the transaction data received was invalid because of a technical reason. (%s)', |
|
137 | + 'event_espresso' |
|
138 | + ), |
|
139 | + __LINE__ |
|
140 | + ), |
|
141 | + ); |
|
142 | + return $response; |
|
143 | + } |
|
144 | + $this->transaction = $transaction; |
|
145 | + return $response; |
|
146 | + } |
|
147 | 147 | |
148 | 148 | |
149 | - /** |
|
150 | - * @param string $txn_status |
|
151 | - * @param array $response |
|
152 | - * @param array $data |
|
153 | - * @return array |
|
154 | - * @throws EE_Error |
|
155 | - * @throws InvalidArgumentException |
|
156 | - * @throws InvalidDataTypeException |
|
157 | - * @throws InvalidInterfaceException |
|
158 | - * @throws ReflectionException |
|
159 | - */ |
|
160 | - private function getTransactionDetails($txn_status, $response, $data) |
|
161 | - { |
|
162 | - // has the TXN status changed since we last checked (or empty because this is the first time running through this code)? |
|
163 | - if ($txn_status !== $this->transaction->status_ID()) { |
|
164 | - // switch between two possible basic outcomes |
|
165 | - switch ($this->transaction->status_ID()) { |
|
166 | - // TXN has been updated in some way |
|
167 | - case EEM_Transaction::overpaid_status_code: |
|
168 | - case EEM_Transaction::complete_status_code: |
|
169 | - case EEM_Transaction::incomplete_status_code: |
|
170 | - // send updated TXN results back to client, |
|
171 | - return $this->setTransactionDetails($response); |
|
172 | - // or we have a bad TXN, or really slow IPN, so calculate the wait time and send that back... |
|
173 | - case EEM_Transaction::failed_status_code: |
|
174 | - default: |
|
175 | - // keep on waiting... |
|
176 | - return $this->updateServerWaitTime($data[ $this->heartbeat ]); |
|
177 | - } |
|
178 | - // or is the TXN still failed (never been updated) ??? |
|
179 | - } elseif ($this->transaction->failed()) { |
|
180 | - // keep on waiting... |
|
181 | - return $this->updateServerWaitTime($data[ $this->heartbeat ]); |
|
182 | - } |
|
183 | - return $response; |
|
184 | - } |
|
149 | + /** |
|
150 | + * @param string $txn_status |
|
151 | + * @param array $response |
|
152 | + * @param array $data |
|
153 | + * @return array |
|
154 | + * @throws EE_Error |
|
155 | + * @throws InvalidArgumentException |
|
156 | + * @throws InvalidDataTypeException |
|
157 | + * @throws InvalidInterfaceException |
|
158 | + * @throws ReflectionException |
|
159 | + */ |
|
160 | + private function getTransactionDetails($txn_status, $response, $data) |
|
161 | + { |
|
162 | + // has the TXN status changed since we last checked (or empty because this is the first time running through this code)? |
|
163 | + if ($txn_status !== $this->transaction->status_ID()) { |
|
164 | + // switch between two possible basic outcomes |
|
165 | + switch ($this->transaction->status_ID()) { |
|
166 | + // TXN has been updated in some way |
|
167 | + case EEM_Transaction::overpaid_status_code: |
|
168 | + case EEM_Transaction::complete_status_code: |
|
169 | + case EEM_Transaction::incomplete_status_code: |
|
170 | + // send updated TXN results back to client, |
|
171 | + return $this->setTransactionDetails($response); |
|
172 | + // or we have a bad TXN, or really slow IPN, so calculate the wait time and send that back... |
|
173 | + case EEM_Transaction::failed_status_code: |
|
174 | + default: |
|
175 | + // keep on waiting... |
|
176 | + return $this->updateServerWaitTime($data[ $this->heartbeat ]); |
|
177 | + } |
|
178 | + // or is the TXN still failed (never been updated) ??? |
|
179 | + } elseif ($this->transaction->failed()) { |
|
180 | + // keep on waiting... |
|
181 | + return $this->updateServerWaitTime($data[ $this->heartbeat ]); |
|
182 | + } |
|
183 | + return $response; |
|
184 | + } |
|
185 | 185 | |
186 | 186 | |
187 | - /** |
|
188 | - * @param array $response |
|
189 | - * @param boolean $status_only |
|
190 | - * @return array |
|
191 | - * @throws EE_Error |
|
192 | - * @throws InvalidArgumentException |
|
193 | - * @throws InvalidDataTypeException |
|
194 | - * @throws InvalidInterfaceException |
|
195 | - * @throws ReflectionException |
|
196 | - */ |
|
197 | - private function setTransactionDetails($response, $status_only = false) |
|
198 | - { |
|
199 | - if (! $status_only && ! isset($response[ $this->heartbeat ]['transaction_details'])) { |
|
200 | - $response[ $this->heartbeat ]['transaction_details'] = $this->thank_you_page->get_transaction_details(); |
|
201 | - } |
|
202 | - if (! isset($response[ $this->heartbeat ]['txn_status'])) { |
|
203 | - $response[ $this->heartbeat ]['txn_status'] = $this->transaction->status_ID(); |
|
204 | - } |
|
205 | - return $response; |
|
206 | - } |
|
187 | + /** |
|
188 | + * @param array $response |
|
189 | + * @param boolean $status_only |
|
190 | + * @return array |
|
191 | + * @throws EE_Error |
|
192 | + * @throws InvalidArgumentException |
|
193 | + * @throws InvalidDataTypeException |
|
194 | + * @throws InvalidInterfaceException |
|
195 | + * @throws ReflectionException |
|
196 | + */ |
|
197 | + private function setTransactionDetails($response, $status_only = false) |
|
198 | + { |
|
199 | + if (! $status_only && ! isset($response[ $this->heartbeat ]['transaction_details'])) { |
|
200 | + $response[ $this->heartbeat ]['transaction_details'] = $this->thank_you_page->get_transaction_details(); |
|
201 | + } |
|
202 | + if (! isset($response[ $this->heartbeat ]['txn_status'])) { |
|
203 | + $response[ $this->heartbeat ]['txn_status'] = $this->transaction->status_ID(); |
|
204 | + } |
|
205 | + return $response; |
|
206 | + } |
|
207 | 207 | |
208 | 208 | |
209 | - /** |
|
210 | - * @param array $response |
|
211 | - * @param int $since |
|
212 | - * @return array |
|
213 | - * @throws EE_Error |
|
214 | - * @throws InvalidArgumentException |
|
215 | - * @throws InvalidDataTypeException |
|
216 | - * @throws InvalidInterfaceException |
|
217 | - * @throws ReflectionException |
|
218 | - */ |
|
219 | - private function paymentDetails($response, $since) |
|
220 | - { |
|
221 | - // then check for payments |
|
222 | - $payments = $this->thank_you_page->get_txn_payments($since); |
|
223 | - // has a payment been processed ? |
|
224 | - if (! empty($payments) || $this->thank_you_page->isOfflinePaymentMethod()) { |
|
225 | - if ($since) { |
|
226 | - $response[ $this->heartbeat ]['new_payments'] = $this->thank_you_page->get_new_payments($payments); |
|
227 | - $response = $this->setTransactionDetails($response); |
|
228 | - } else { |
|
229 | - $response[ $this->heartbeat ]['payment_details'] = $this->thank_you_page->get_payment_details( |
|
230 | - $payments |
|
231 | - ); |
|
232 | - } |
|
233 | - // reset time to check for payments |
|
234 | - $response[ $this->heartbeat ]['get_payments_since'] = time(); |
|
235 | - } else { |
|
236 | - $response[ $this->heartbeat ]['get_payments_since'] = $since; |
|
237 | - } |
|
238 | - return $response; |
|
239 | - } |
|
209 | + /** |
|
210 | + * @param array $response |
|
211 | + * @param int $since |
|
212 | + * @return array |
|
213 | + * @throws EE_Error |
|
214 | + * @throws InvalidArgumentException |
|
215 | + * @throws InvalidDataTypeException |
|
216 | + * @throws InvalidInterfaceException |
|
217 | + * @throws ReflectionException |
|
218 | + */ |
|
219 | + private function paymentDetails($response, $since) |
|
220 | + { |
|
221 | + // then check for payments |
|
222 | + $payments = $this->thank_you_page->get_txn_payments($since); |
|
223 | + // has a payment been processed ? |
|
224 | + if (! empty($payments) || $this->thank_you_page->isOfflinePaymentMethod()) { |
|
225 | + if ($since) { |
|
226 | + $response[ $this->heartbeat ]['new_payments'] = $this->thank_you_page->get_new_payments($payments); |
|
227 | + $response = $this->setTransactionDetails($response); |
|
228 | + } else { |
|
229 | + $response[ $this->heartbeat ]['payment_details'] = $this->thank_you_page->get_payment_details( |
|
230 | + $payments |
|
231 | + ); |
|
232 | + } |
|
233 | + // reset time to check for payments |
|
234 | + $response[ $this->heartbeat ]['get_payments_since'] = time(); |
|
235 | + } else { |
|
236 | + $response[ $this->heartbeat ]['get_payments_since'] = $since; |
|
237 | + } |
|
238 | + return $response; |
|
239 | + } |
|
240 | 240 | |
241 | 241 | |
242 | - /** |
|
243 | - * @param array $thank_you_page_data thank you page portion of the incoming JSON array |
|
244 | - * from the WP heartbeat data |
|
245 | - * @return array |
|
246 | - * @throws EE_Error |
|
247 | - * @throws InvalidArgumentException |
|
248 | - * @throws InvalidDataTypeException |
|
249 | - * @throws InvalidInterfaceException |
|
250 | - * @throws ReflectionException |
|
251 | - */ |
|
252 | - private function updateServerWaitTime($thank_you_page_data) |
|
253 | - { |
|
254 | - $response[ $this->heartbeat ]['still_waiting'] = isset($thank_you_page_data['initial_access']) |
|
255 | - ? time() - $thank_you_page_data['initial_access'] |
|
256 | - : 0; |
|
257 | - $response = $this->setTransactionDetails($response, true); |
|
258 | - return $response; |
|
259 | - } |
|
242 | + /** |
|
243 | + * @param array $thank_you_page_data thank you page portion of the incoming JSON array |
|
244 | + * from the WP heartbeat data |
|
245 | + * @return array |
|
246 | + * @throws EE_Error |
|
247 | + * @throws InvalidArgumentException |
|
248 | + * @throws InvalidDataTypeException |
|
249 | + * @throws InvalidInterfaceException |
|
250 | + * @throws ReflectionException |
|
251 | + */ |
|
252 | + private function updateServerWaitTime($thank_you_page_data) |
|
253 | + { |
|
254 | + $response[ $this->heartbeat ]['still_waiting'] = isset($thank_you_page_data['initial_access']) |
|
255 | + ? time() - $thank_you_page_data['initial_access'] |
|
256 | + : 0; |
|
257 | + $response = $this->setTransactionDetails($response, true); |
|
258 | + return $response; |
|
259 | + } |
|
260 | 260 | } |
@@ -67,12 +67,12 @@ discard block |
||
67 | 67 | public function heartbeatResponse($response = array(), $data = array()) |
68 | 68 | { |
69 | 69 | // does this heartbeat contain our data ? |
70 | - if (! isset($data[ $this->heartbeat ])) { |
|
70 | + if ( ! isset($data[$this->heartbeat])) { |
|
71 | 71 | return $response; |
72 | 72 | } |
73 | 73 | // check for reg_url_link in the incoming heartbeat data |
74 | - if (! isset($data[ $this->heartbeat ]['e_reg_url_link'])) { |
|
75 | - $response[ $this->heartbeat ] = array( |
|
74 | + if ( ! isset($data[$this->heartbeat]['e_reg_url_link'])) { |
|
75 | + $response[$this->heartbeat] = array( |
|
76 | 76 | 'errors' => ! empty($notices['errors']) |
77 | 77 | ? $notices['errors'] |
78 | 78 | : __( |
@@ -85,22 +85,22 @@ discard block |
||
85 | 85 | // kk heartbeat has our data |
86 | 86 | $response = $this->initializeThankYouPageAndTransaction($response, $data); |
87 | 87 | // if something went wrong... |
88 | - if (isset($response[ $this->heartbeat ]['errors'])) { |
|
88 | + if (isset($response[$this->heartbeat]['errors'])) { |
|
89 | 89 | return $response; |
90 | 90 | } |
91 | 91 | // grab transient of Transaction's status |
92 | - $txn_status = isset($data[ $this->heartbeat ]['txn_status']) |
|
93 | - ? $data[ $this->heartbeat ]['txn_status'] |
|
92 | + $txn_status = isset($data[$this->heartbeat]['txn_status']) |
|
93 | + ? $data[$this->heartbeat]['txn_status'] |
|
94 | 94 | : null; |
95 | 95 | $response = $this->getTransactionDetails($txn_status, $response, $data); |
96 | 96 | // no payment data yet? |
97 | - if (isset($response[ $this->heartbeat ]['still_waiting'])) { |
|
97 | + if (isset($response[$this->heartbeat]['still_waiting'])) { |
|
98 | 98 | return $response; |
99 | 99 | } |
100 | 100 | // TXN is happening so let's get the payments now |
101 | 101 | // if we've already gotten payments then the heartbeat data will contain the timestamp of the last time we checked |
102 | - $since = isset($data[ $this->heartbeat ]['get_payments_since']) |
|
103 | - ? $data[ $this->heartbeat ]['get_payments_since'] |
|
102 | + $since = isset($data[$this->heartbeat]['get_payments_since']) |
|
103 | + ? $data[$this->heartbeat]['get_payments_since'] |
|
104 | 104 | : 0; |
105 | 105 | return $this->paymentDetails($response, $since); |
106 | 106 | } |
@@ -117,18 +117,18 @@ discard block |
||
117 | 117 | */ |
118 | 118 | private function initializeThankYouPageAndTransaction($response, $data) |
119 | 119 | { |
120 | - require_once EE_MODULES . 'thank_you_page/EED_Thank_You_Page.module.php'; |
|
120 | + require_once EE_MODULES.'thank_you_page/EED_Thank_You_Page.module.php'; |
|
121 | 121 | // set_definitions, instantiate the thank you page class, and get the ball rolling |
122 | 122 | EED_Thank_You_Page::set_definitions(); |
123 | 123 | $this->thank_you_page = EED_Thank_You_Page::instance(); |
124 | - $this->thank_you_page->set_reg_url_link($data[ $this->heartbeat ]['e_reg_url_link']); |
|
124 | + $this->thank_you_page->set_reg_url_link($data[$this->heartbeat]['e_reg_url_link']); |
|
125 | 125 | $this->thank_you_page->init(); |
126 | 126 | // get TXN |
127 | 127 | $transaction = $this->thank_you_page->get_txn(); |
128 | 128 | // no TXN? then get out |
129 | - if (! $transaction instanceof EE_Transaction) { |
|
129 | + if ( ! $transaction instanceof EE_Transaction) { |
|
130 | 130 | $notices = EE_Error::get_notices(); |
131 | - $response[ $this->heartbeat ] = array( |
|
131 | + $response[$this->heartbeat] = array( |
|
132 | 132 | 'errors' => ! empty($notices['errors']) |
133 | 133 | ? $notices['errors'] |
134 | 134 | : sprintf( |
@@ -173,12 +173,12 @@ discard block |
||
173 | 173 | case EEM_Transaction::failed_status_code: |
174 | 174 | default: |
175 | 175 | // keep on waiting... |
176 | - return $this->updateServerWaitTime($data[ $this->heartbeat ]); |
|
176 | + return $this->updateServerWaitTime($data[$this->heartbeat]); |
|
177 | 177 | } |
178 | 178 | // or is the TXN still failed (never been updated) ??? |
179 | 179 | } elseif ($this->transaction->failed()) { |
180 | 180 | // keep on waiting... |
181 | - return $this->updateServerWaitTime($data[ $this->heartbeat ]); |
|
181 | + return $this->updateServerWaitTime($data[$this->heartbeat]); |
|
182 | 182 | } |
183 | 183 | return $response; |
184 | 184 | } |
@@ -196,11 +196,11 @@ discard block |
||
196 | 196 | */ |
197 | 197 | private function setTransactionDetails($response, $status_only = false) |
198 | 198 | { |
199 | - if (! $status_only && ! isset($response[ $this->heartbeat ]['transaction_details'])) { |
|
200 | - $response[ $this->heartbeat ]['transaction_details'] = $this->thank_you_page->get_transaction_details(); |
|
199 | + if ( ! $status_only && ! isset($response[$this->heartbeat]['transaction_details'])) { |
|
200 | + $response[$this->heartbeat]['transaction_details'] = $this->thank_you_page->get_transaction_details(); |
|
201 | 201 | } |
202 | - if (! isset($response[ $this->heartbeat ]['txn_status'])) { |
|
203 | - $response[ $this->heartbeat ]['txn_status'] = $this->transaction->status_ID(); |
|
202 | + if ( ! isset($response[$this->heartbeat]['txn_status'])) { |
|
203 | + $response[$this->heartbeat]['txn_status'] = $this->transaction->status_ID(); |
|
204 | 204 | } |
205 | 205 | return $response; |
206 | 206 | } |
@@ -221,19 +221,19 @@ discard block |
||
221 | 221 | // then check for payments |
222 | 222 | $payments = $this->thank_you_page->get_txn_payments($since); |
223 | 223 | // has a payment been processed ? |
224 | - if (! empty($payments) || $this->thank_you_page->isOfflinePaymentMethod()) { |
|
224 | + if ( ! empty($payments) || $this->thank_you_page->isOfflinePaymentMethod()) { |
|
225 | 225 | if ($since) { |
226 | - $response[ $this->heartbeat ]['new_payments'] = $this->thank_you_page->get_new_payments($payments); |
|
226 | + $response[$this->heartbeat]['new_payments'] = $this->thank_you_page->get_new_payments($payments); |
|
227 | 227 | $response = $this->setTransactionDetails($response); |
228 | 228 | } else { |
229 | - $response[ $this->heartbeat ]['payment_details'] = $this->thank_you_page->get_payment_details( |
|
229 | + $response[$this->heartbeat]['payment_details'] = $this->thank_you_page->get_payment_details( |
|
230 | 230 | $payments |
231 | 231 | ); |
232 | 232 | } |
233 | 233 | // reset time to check for payments |
234 | - $response[ $this->heartbeat ]['get_payments_since'] = time(); |
|
234 | + $response[$this->heartbeat]['get_payments_since'] = time(); |
|
235 | 235 | } else { |
236 | - $response[ $this->heartbeat ]['get_payments_since'] = $since; |
|
236 | + $response[$this->heartbeat]['get_payments_since'] = $since; |
|
237 | 237 | } |
238 | 238 | return $response; |
239 | 239 | } |
@@ -251,7 +251,7 @@ discard block |
||
251 | 251 | */ |
252 | 252 | private function updateServerWaitTime($thank_you_page_data) |
253 | 253 | { |
254 | - $response[ $this->heartbeat ]['still_waiting'] = isset($thank_you_page_data['initial_access']) |
|
254 | + $response[$this->heartbeat]['still_waiting'] = isset($thank_you_page_data['initial_access']) |
|
255 | 255 | ? time() - $thank_you_page_data['initial_access'] |
256 | 256 | : 0; |
257 | 257 | $response = $this->setTransactionDetails($response, true); |
@@ -17,52 +17,52 @@ |
||
17 | 17 | class WordpressHeartbeat |
18 | 18 | { |
19 | 19 | |
20 | - const RESPONSE_KEY_THANK_YOU_PAGE = 'espresso_thank_you_page'; |
|
20 | + const RESPONSE_KEY_THANK_YOU_PAGE = 'espresso_thank_you_page'; |
|
21 | 21 | |
22 | - /** |
|
23 | - * @var LoaderInterface $loader |
|
24 | - */ |
|
25 | - protected $loader; |
|
22 | + /** |
|
23 | + * @var LoaderInterface $loader |
|
24 | + */ |
|
25 | + protected $loader; |
|
26 | 26 | |
27 | - /** |
|
28 | - * @var RequestInterface $request |
|
29 | - */ |
|
30 | - protected $request; |
|
27 | + /** |
|
28 | + * @var RequestInterface $request |
|
29 | + */ |
|
30 | + protected $request; |
|
31 | 31 | |
32 | 32 | |
33 | - /** |
|
34 | - * WordpressHeartbeat constructor. |
|
35 | - * |
|
36 | - * @param LoaderInterface $loader |
|
37 | - * @param RequestInterface $request |
|
38 | - */ |
|
39 | - public function __construct( |
|
40 | - LoaderInterface $loader, |
|
41 | - RequestInterface $request |
|
42 | - ) { |
|
43 | - $this->loader = $loader; |
|
44 | - $this->request = $request; |
|
45 | - do_action('AHEE__EventEspresso_core_domain_services_admin_ajax_WordpressHeartbeat__constructor', $this); |
|
46 | - add_action('AHEE__EE_System__core_loaded_and_ready', array($this, 'resolveRoutes')); |
|
47 | - } |
|
33 | + /** |
|
34 | + * WordpressHeartbeat constructor. |
|
35 | + * |
|
36 | + * @param LoaderInterface $loader |
|
37 | + * @param RequestInterface $request |
|
38 | + */ |
|
39 | + public function __construct( |
|
40 | + LoaderInterface $loader, |
|
41 | + RequestInterface $request |
|
42 | + ) { |
|
43 | + $this->loader = $loader; |
|
44 | + $this->request = $request; |
|
45 | + do_action('AHEE__EventEspresso_core_domain_services_admin_ajax_WordpressHeartbeat__constructor', $this); |
|
46 | + add_action('AHEE__EE_System__core_loaded_and_ready', array($this, 'resolveRoutes')); |
|
47 | + } |
|
48 | 48 | |
49 | 49 | |
50 | - /** |
|
51 | - * @since 4.9.76.p |
|
52 | - * @throws InvalidClassException |
|
53 | - */ |
|
54 | - public function resolveRoutes() |
|
55 | - { |
|
56 | - $screenID = $this->request->getRequestParam('screen_id'); |
|
57 | - $heartbeat_data = $this->request->getRequestParam('data', []); |
|
58 | - if ($screenID === 'espresso_events') { |
|
59 | - $this->loader->getShared( |
|
60 | - 'EventEspresso\core\domain\services\admin\ajax\EventEditorHeartbeat' |
|
61 | - ); |
|
62 | - } elseif ($screenID === 'front' && ! empty($heartbeat_data[ self::RESPONSE_KEY_THANK_YOU_PAGE ])) { |
|
63 | - $this->loader->getShared( |
|
64 | - 'EventEspresso\core\domain\services\admin\ajax\ThankYouPageIpnMonitor' |
|
65 | - ); |
|
66 | - } |
|
67 | - } |
|
50 | + /** |
|
51 | + * @since 4.9.76.p |
|
52 | + * @throws InvalidClassException |
|
53 | + */ |
|
54 | + public function resolveRoutes() |
|
55 | + { |
|
56 | + $screenID = $this->request->getRequestParam('screen_id'); |
|
57 | + $heartbeat_data = $this->request->getRequestParam('data', []); |
|
58 | + if ($screenID === 'espresso_events') { |
|
59 | + $this->loader->getShared( |
|
60 | + 'EventEspresso\core\domain\services\admin\ajax\EventEditorHeartbeat' |
|
61 | + ); |
|
62 | + } elseif ($screenID === 'front' && ! empty($heartbeat_data[ self::RESPONSE_KEY_THANK_YOU_PAGE ])) { |
|
63 | + $this->loader->getShared( |
|
64 | + 'EventEspresso\core\domain\services\admin\ajax\ThankYouPageIpnMonitor' |
|
65 | + ); |
|
66 | + } |
|
67 | + } |
|
68 | 68 | } |
@@ -59,7 +59,7 @@ |
||
59 | 59 | $this->loader->getShared( |
60 | 60 | 'EventEspresso\core\domain\services\admin\ajax\EventEditorHeartbeat' |
61 | 61 | ); |
62 | - } elseif ($screenID === 'front' && ! empty($heartbeat_data[ self::RESPONSE_KEY_THANK_YOU_PAGE ])) { |
|
62 | + } elseif ($screenID === 'front' && ! empty($heartbeat_data[self::RESPONSE_KEY_THANK_YOU_PAGE])) { |
|
63 | 63 | $this->loader->getShared( |
64 | 64 | 'EventEspresso\core\domain\services\admin\ajax\ThankYouPageIpnMonitor' |
65 | 65 | ); |
@@ -38,103 +38,103 @@ |
||
38 | 38 | * @since 4.0 |
39 | 39 | */ |
40 | 40 | if (function_exists('espresso_version')) { |
41 | - if (! function_exists('espresso_duplicate_plugin_error')) { |
|
42 | - /** |
|
43 | - * espresso_duplicate_plugin_error |
|
44 | - * displays if more than one version of EE is activated at the same time |
|
45 | - */ |
|
46 | - function espresso_duplicate_plugin_error() |
|
47 | - { |
|
48 | - ?> |
|
41 | + if (! function_exists('espresso_duplicate_plugin_error')) { |
|
42 | + /** |
|
43 | + * espresso_duplicate_plugin_error |
|
44 | + * displays if more than one version of EE is activated at the same time |
|
45 | + */ |
|
46 | + function espresso_duplicate_plugin_error() |
|
47 | + { |
|
48 | + ?> |
|
49 | 49 | <div class="error"> |
50 | 50 | <p> |
51 | 51 | <?php |
52 | - echo esc_html__( |
|
53 | - 'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.', |
|
54 | - 'event_espresso' |
|
55 | - ); ?> |
|
52 | + echo esc_html__( |
|
53 | + 'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.', |
|
54 | + 'event_espresso' |
|
55 | + ); ?> |
|
56 | 56 | </p> |
57 | 57 | </div> |
58 | 58 | <?php |
59 | - espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
60 | - } |
|
61 | - } |
|
62 | - add_action('admin_notices', 'espresso_duplicate_plugin_error', 1); |
|
59 | + espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
60 | + } |
|
61 | + } |
|
62 | + add_action('admin_notices', 'espresso_duplicate_plugin_error', 1); |
|
63 | 63 | } else { |
64 | - define('EE_MIN_PHP_VER_REQUIRED', '5.4.0'); |
|
65 | - if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) { |
|
66 | - /** |
|
67 | - * espresso_minimum_php_version_error |
|
68 | - * |
|
69 | - * @return void |
|
70 | - */ |
|
71 | - function espresso_minimum_php_version_error() |
|
72 | - { |
|
73 | - ?> |
|
64 | + define('EE_MIN_PHP_VER_REQUIRED', '5.4.0'); |
|
65 | + if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) { |
|
66 | + /** |
|
67 | + * espresso_minimum_php_version_error |
|
68 | + * |
|
69 | + * @return void |
|
70 | + */ |
|
71 | + function espresso_minimum_php_version_error() |
|
72 | + { |
|
73 | + ?> |
|
74 | 74 | <div class="error"> |
75 | 75 | <p> |
76 | 76 | <?php |
77 | - printf( |
|
78 | - esc_html__( |
|
79 | - 'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.', |
|
80 | - 'event_espresso' |
|
81 | - ), |
|
82 | - EE_MIN_PHP_VER_REQUIRED, |
|
83 | - PHP_VERSION, |
|
84 | - '<br/>', |
|
85 | - '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>' |
|
86 | - ); |
|
87 | - ?> |
|
77 | + printf( |
|
78 | + esc_html__( |
|
79 | + 'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.', |
|
80 | + 'event_espresso' |
|
81 | + ), |
|
82 | + EE_MIN_PHP_VER_REQUIRED, |
|
83 | + PHP_VERSION, |
|
84 | + '<br/>', |
|
85 | + '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>' |
|
86 | + ); |
|
87 | + ?> |
|
88 | 88 | </p> |
89 | 89 | </div> |
90 | 90 | <?php |
91 | - espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
92 | - } |
|
91 | + espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
92 | + } |
|
93 | 93 | |
94 | - add_action('admin_notices', 'espresso_minimum_php_version_error', 1); |
|
95 | - } else { |
|
96 | - define('EVENT_ESPRESSO_MAIN_FILE', __FILE__); |
|
97 | - /** |
|
98 | - * espresso_version |
|
99 | - * Returns the plugin version |
|
100 | - * |
|
101 | - * @return string |
|
102 | - */ |
|
103 | - function espresso_version() |
|
104 | - { |
|
105 | - return apply_filters('FHEE__espresso__espresso_version', '4.9.82.rc.004'); |
|
106 | - } |
|
94 | + add_action('admin_notices', 'espresso_minimum_php_version_error', 1); |
|
95 | + } else { |
|
96 | + define('EVENT_ESPRESSO_MAIN_FILE', __FILE__); |
|
97 | + /** |
|
98 | + * espresso_version |
|
99 | + * Returns the plugin version |
|
100 | + * |
|
101 | + * @return string |
|
102 | + */ |
|
103 | + function espresso_version() |
|
104 | + { |
|
105 | + return apply_filters('FHEE__espresso__espresso_version', '4.9.82.rc.004'); |
|
106 | + } |
|
107 | 107 | |
108 | - /** |
|
109 | - * espresso_plugin_activation |
|
110 | - * adds a wp-option to indicate that EE has been activated via the WP admin plugins page |
|
111 | - */ |
|
112 | - function espresso_plugin_activation() |
|
113 | - { |
|
114 | - update_option('ee_espresso_activation', true); |
|
115 | - } |
|
108 | + /** |
|
109 | + * espresso_plugin_activation |
|
110 | + * adds a wp-option to indicate that EE has been activated via the WP admin plugins page |
|
111 | + */ |
|
112 | + function espresso_plugin_activation() |
|
113 | + { |
|
114 | + update_option('ee_espresso_activation', true); |
|
115 | + } |
|
116 | 116 | |
117 | - register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation'); |
|
117 | + register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation'); |
|
118 | 118 | |
119 | - require_once __DIR__ . '/core/bootstrap_espresso.php'; |
|
120 | - bootstrap_espresso(); |
|
121 | - } |
|
119 | + require_once __DIR__ . '/core/bootstrap_espresso.php'; |
|
120 | + bootstrap_espresso(); |
|
121 | + } |
|
122 | 122 | } |
123 | 123 | if (! function_exists('espresso_deactivate_plugin')) { |
124 | - /** |
|
125 | - * deactivate_plugin |
|
126 | - * usage: espresso_deactivate_plugin( plugin_basename( __FILE__ )); |
|
127 | - * |
|
128 | - * @access public |
|
129 | - * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file |
|
130 | - * @return void |
|
131 | - */ |
|
132 | - function espresso_deactivate_plugin($plugin_basename = '') |
|
133 | - { |
|
134 | - if (! function_exists('deactivate_plugins')) { |
|
135 | - require_once ABSPATH . 'wp-admin/includes/plugin.php'; |
|
136 | - } |
|
137 | - unset($_GET['activate'], $_REQUEST['activate']); |
|
138 | - deactivate_plugins($plugin_basename); |
|
139 | - } |
|
124 | + /** |
|
125 | + * deactivate_plugin |
|
126 | + * usage: espresso_deactivate_plugin( plugin_basename( __FILE__ )); |
|
127 | + * |
|
128 | + * @access public |
|
129 | + * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file |
|
130 | + * @return void |
|
131 | + */ |
|
132 | + function espresso_deactivate_plugin($plugin_basename = '') |
|
133 | + { |
|
134 | + if (! function_exists('deactivate_plugins')) { |
|
135 | + require_once ABSPATH . 'wp-admin/includes/plugin.php'; |
|
136 | + } |
|
137 | + unset($_GET['activate'], $_REQUEST['activate']); |
|
138 | + deactivate_plugins($plugin_basename); |
|
139 | + } |
|
140 | 140 | } |