PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.5.10
GiveWP – Donation Plugin and Fundraising Platform v2.5.10
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / payments / actions.php
give / includes / payments Last commit date
actions.php 7 years ago backward-compatibility.php 7 years ago class-give-payment.php 6 years ago class-give-sequential-donation-number.php 6 years ago class-payment-stats.php 7 years ago class-payments-query.php 6 years ago functions.php 7 years ago
actions.php
460 lines
1 <?php
2 /**
3 * Payment Actions
4 *
5 * @package Give
6 * @subpackage Payments
7 * @copyright Copyright (c) 2016, GiveWP
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.0
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Complete a donation
19 *
20 * Performs all necessary actions to complete a donation.
21 * Triggered by the give_update_payment_status() function.
22 *
23 * @since 1.0
24 *
25 * @param int $payment_id The ID number of the payment.
26 * @param string $new_status The status of the payment, probably "publish".
27 * @param string $old_status The status of the payment prior to being marked as "complete", probably "pending".
28 *
29 * @return void
30 */
31 function give_complete_purchase( $payment_id, $new_status, $old_status ) {
32
33 // Make sure that payments are only completed once.
34 if ( $old_status == 'publish' || $old_status == 'complete' ) {
35 return;
36 }
37
38 // Make sure the payment completion is only processed when new status is complete.
39 if ( $new_status != 'publish' && $new_status != 'complete' ) {
40 return;
41 }
42
43 $payment = new Give_Payment( $payment_id );
44
45 $creation_date = get_post_field( 'post_date', $payment_id, 'raw' );
46 $payment_meta = $payment->payment_meta;
47 $completed_date = $payment->completed_date;
48 $user_info = $payment->user_info;
49 $donor_id = $payment->customer_id;
50 $amount = $payment->total;
51 $price_id = $payment->price_id;
52 $form_id = $payment->form_id;
53
54 /**
55 * Fires before completing donation.
56 *
57 * @since 1.0
58 *
59 * @param int $payment_id The ID of the payment.
60 */
61 do_action( 'give_pre_complete_donation', $payment_id );
62
63 // Ensure these actions only run once, ever.
64 if ( empty( $completed_date ) ) {
65
66 give_record_donation_in_log( $form_id, $payment_id, $price_id, $creation_date );
67
68 /**
69 * Fires after logging donation record.
70 *
71 * @since 1.0
72 *
73 * @param int $form_id The ID number of the form.
74 * @param int $payment_id The ID number of the payment.
75 * @param array $payment_meta The payment meta.
76 */
77 do_action( 'give_complete_form_donation', $form_id, $payment_id, $payment_meta );
78
79 }
80
81 // Increase the earnings for this form ID.
82 give_increase_earnings( $form_id, $amount, $payment_id );
83 give_increase_donation_count( $form_id );
84
85 // Update the goal progress for this form ID.
86 give_update_goal_progress( $form_id );
87
88 // @todo: Refresh only range related stat cache
89 give_delete_donation_stats();
90
91 // Increase the donor's donation stats.
92 $donor = new Give_Donor( $donor_id );
93 $donor->increase_purchase_count();
94 $donor->increase_value( $amount );
95
96 give_increase_total_earnings( $amount );
97
98 // Ensure this action only runs once ever.
99 if ( empty( $completed_date ) ) {
100
101 // Save the completed date.
102 $payment->completed_date = current_time( 'mysql' );
103 $payment->save();
104
105 /**
106 * Fires after a donation successfully complete.
107 *
108 * @since 1.0
109 *
110 * @param int $payment_id The ID of the payment.
111 */
112 do_action( 'give_complete_donation', $payment_id );
113 }
114
115 }
116
117 add_action( 'give_update_payment_status', 'give_complete_purchase', 100, 3 );
118
119
120 /**
121 * Record payment status change
122 *
123 * @since 1.0
124 *
125 * @param int $payment_id The ID number of the payment.
126 * @param string $new_status The status of the payment, probably "publish".
127 * @param string $old_status The status of the payment prior to being marked as "complete", probably "pending".
128 *
129 * @return void
130 */
131 function give_record_status_change( $payment_id, $new_status, $old_status ) {
132
133 // Get the list of statuses so that status in the payment note can be translated.
134 $stati = give_get_payment_statuses();
135 $old_status = isset( $stati[ $old_status ] ) ? $stati[ $old_status ] : $old_status;
136 $new_status = isset( $stati[ $new_status ] ) ? $stati[ $new_status ] : $new_status;
137
138 // translators: 1: old status 2: new status.
139 $status_change = sprintf( esc_html__( 'Status changed from %1$s to %2$s.', 'give' ), $old_status, $new_status );
140
141 give_insert_payment_note( $payment_id, $status_change );
142 }
143
144 add_action( 'give_update_payment_status', 'give_record_status_change', 100, 3 );
145
146
147 /**
148 * Update Old Payments Totals
149 *
150 * Updates all old payments, prior to 1.2, with new meta for the total donation amount.
151 *
152 * It's done to query payments by their totals.
153 *
154 * @since 1.0
155 *
156 * @param array $data Arguments passed.
157 *
158 * @return void
159 */
160 function give_update_old_payments_with_totals( $data ) {
161 if ( ! wp_verify_nonce( $data['_wpnonce'], 'give_upgrade_payments_nonce' ) ) {
162 return;
163 }
164
165 if ( get_option( 'give_payment_totals_upgraded' ) ) {
166 return;
167 }
168
169 $payments = give_get_payments( array(
170 'offset' => 0,
171 'number' => - 1,
172 'mode' => 'all',
173 ) );
174
175 if ( $payments ) {
176 foreach ( $payments as $payment ) {
177
178 $payment = new Give_Payment( $payment->ID );
179 $meta = $payment->get_meta();
180
181 $payment->total = $meta['amount'];
182 $payment->save();
183
184 }
185 }
186
187 add_option( 'give_payment_totals_upgraded', 1 );
188 }
189
190 add_action( 'give_upgrade_payments', 'give_update_old_payments_with_totals' );
191
192 /**
193 * Mark Abandoned Donations
194 *
195 * Updates over a week-old 'pending' donations to 'abandoned' status.
196 *
197 * @since 1.0
198 *
199 * @return void
200 */
201 function give_mark_abandoned_donations() {
202 $args = array(
203 'status' => 'pending',
204 'number' => - 1,
205 'output' => 'give_payments',
206 );
207
208 add_filter( 'posts_where', 'give_filter_where_older_than_week' );
209
210 $payments = give_get_payments( $args );
211
212 remove_filter( 'posts_where', 'give_filter_where_older_than_week' );
213
214 if ( $payments ) {
215 /**
216 * Filter payment gateways: Used to set payment gateways which can be skip while transferring pending payment to abandon.
217 *
218 * @since 1.6
219 *
220 * @param array $skip_payment_gateways Array of payment gateways
221 */
222 $skip_payment_gateways = apply_filters( 'give_mark_abandoned_donation_gateways', array( 'offline' ) );
223
224 /* @var Give_Payment $payment */
225 foreach ( $payments as $payment ) {
226 $gateway = give_get_payment_gateway( $payment->ID );
227
228 // Skip payment gateways.
229 if ( in_array( $gateway, $skip_payment_gateways ) ) {
230 continue;
231 }
232
233 $payment->status = 'abandoned';
234 $payment->save();
235 }
236 }
237 }
238
239 Give_Cron::add_weekly_event( 'give_mark_abandoned_donations' );
240
241
242 /**
243 * Trigger the refresh of this month reports transients
244 *
245 * @since 1.7
246 *
247 * @param int $payment_ID Payment ID.
248 *
249 * @return void
250 */
251 function give_refresh_thismonth_stat_transients( $payment_ID ) {
252 // Monthly stats.
253 Give_Cache::delete( Give_Cache::get_key( 'give_estimated_monthly_stats' ) );
254
255 // @todo: Refresh only range related stat cache
256 give_delete_donation_stats();
257 }
258
259 add_action( 'save_post_give_payment', 'give_refresh_thismonth_stat_transients' );
260
261
262 /**
263 * Add support to get all payment meta.
264 * Note: only use for internal purpose
265 *
266 * @since 2.0
267 *
268 * @param $check
269 * @param $object_id
270 * @param $meta_key
271 * @param $single
272 *
273 * @return array
274 */
275 function give_bc_v20_get_payment_meta( $check, $object_id, $meta_key, $single ) {
276 // Bailout.
277 if (
278 'give_payment' !== get_post_type( $object_id )
279 || '_give_payment_meta' !== $meta_key
280 ) {
281 return $check;
282 }
283
284 $cache_key = "_give_payment_meta_{$object_id}";
285
286 // Get already calculate payment meta from cache.
287 $payment_meta = Give_Cache::get_db_query( $cache_key );
288
289 if ( is_null( $payment_meta ) ) {
290 // Remove filter.
291 remove_filter( 'get_post_metadata', 'give_bc_v20_get_payment_meta', 999 );
292
293 $donation = new Give_Payment( $object_id );
294
295 // Get all payment meta.
296 $payment_meta = give_get_meta( $object_id );
297
298 // Set default value to array.
299 if ( empty( $payment_meta ) ) {
300 return $check;
301 }
302
303 // Convert all meta key value to string instead of array
304 array_walk( $payment_meta, function ( &$meta, $key ) {
305 $meta = current( $meta );
306 } );
307
308 /**
309 * Add backward compatibility to old meta keys.
310 */
311 // Donation key.
312 $payment_meta['key'] = ! empty( $payment_meta['_give_payment_purchase_key'] ) ? $payment_meta['_give_payment_purchase_key'] : '';
313
314 // Donation form.
315 $payment_meta['form_title'] = ! empty( $payment_meta['_give_payment_form_title'] ) ? $payment_meta['_give_payment_form_title'] : '';
316
317 // Donor email.
318 $payment_meta['email'] = ! empty( $payment_meta['_give_payment_donor_email'] ) ? $payment_meta['_give_payment_donor_email'] : '';
319 $payment_meta['email'] = ! empty( $payment_meta['email'] ) ?
320 $payment_meta['email'] :
321 Give()->donors->get_column( 'email', $donation->donor_id );
322
323 // Form id.
324 $payment_meta['form_id'] = ! empty( $payment_meta['_give_payment_form_id'] ) ? $payment_meta['_give_payment_form_id'] : '';
325
326 // Price id.
327 $payment_meta['price_id'] = isset( $payment_meta['_give_payment_price_id'] ) ? $payment_meta['_give_payment_price_id'] : '';
328
329 // Date.
330 $payment_meta['date'] = ! empty( $payment_meta['_give_payment_date'] ) ? $payment_meta['_give_payment_date'] : '';
331 $payment_meta['date'] = ! empty( $payment_meta['date'] ) ?
332 $payment_meta['date'] :
333 get_post_field( 'post_date', $object_id );
334
335
336 // Currency.
337 $payment_meta['currency'] = ! empty( $payment_meta['_give_payment_currency'] ) ? $payment_meta['_give_payment_currency'] : '';
338
339 // Decode donor data.
340 $donor_id = ! empty( $payment_meta['_give_payment_donor_id'] ) ? $payment_meta['_give_payment_donor_id'] : 0;
341 $donor = new Give_Donor( $donor_id );
342
343 // Donor first name.
344 $donor_data['first_name'] = ! empty( $payment_meta['_give_donor_billing_first_name'] ) ? $payment_meta['_give_donor_billing_first_name'] : '';
345 $donor_data['first_name'] = ! empty( $donor_data['first_name'] ) ?
346 $donor_data['first_name'] :
347 $donor->get_first_name();
348
349 // Donor last name.
350 $donor_data['last_name'] = ! empty( $payment_meta['_give_donor_billing_last_name'] ) ? $payment_meta['_give_donor_billing_last_name'] : '';
351 $donor_data['last_name'] = ! empty( $donor_data['last_name'] ) ?
352 $donor_data['last_name'] :
353 $donor->get_last_name();
354
355 // Donor email.
356 $donor_data['email'] = $payment_meta['email'];
357
358 // User ID.
359 $donor_data['id'] = $donation->user_id;
360
361 $donor_data['address'] = false;
362
363 // Address1.
364 $address1 = ! empty( $payment_meta['_give_donor_billing_address1'] ) ? $payment_meta['_give_donor_billing_address1'] : '';
365 if ( $address1 ) {
366 $donor_data['address']['line1'] = $address1;
367 }
368
369 // Address2.
370 $address2 = ! empty( $payment_meta['_give_donor_billing_address2'] ) ? $payment_meta['_give_donor_billing_address2'] : '';
371 if ( $address2 ) {
372 $donor_data['address']['line2'] = $address2;
373 }
374
375 // City.
376 $city = ! empty( $payment_meta['_give_donor_billing_city'] ) ? $payment_meta['_give_donor_billing_city'] : '';
377 if ( $city ) {
378 $donor_data['address']['city'] = $city;
379 }
380
381 // Zip.
382 $zip = ! empty( $payment_meta['_give_donor_billing_zip'] ) ? $payment_meta['_give_donor_billing_zip'] : '';
383 if ( $zip ) {
384 $donor_data['address']['zip'] = $zip;
385 }
386
387 // State.
388 $state = ! empty( $payment_meta['_give_donor_billing_state'] ) ? $payment_meta['_give_donor_billing_state'] : '';
389 if ( $state ) {
390 $donor_data['address']['state'] = $state;
391 }
392
393 // Country.
394 $country = ! empty( $payment_meta['_give_donor_billing_country'] ) ? $payment_meta['_give_donor_billing_country'] : '';
395 if ( $country ) {
396 $donor_data['address']['country'] = $country;
397 }
398
399 $payment_meta['user_info'] = $donor_data;
400
401 // Add filter
402 add_filter( 'get_post_metadata', 'give_bc_v20_get_payment_meta', 999, 4 );
403
404 // Set custom meta key into payment meta.
405 if ( ! empty( $payment_meta['_give_payment_meta'] ) ) {
406 $payment_meta['_give_payment_meta'] = is_array( $payment_meta['_give_payment_meta'] ) ? $payment_meta['_give_payment_meta'] : array();
407
408 $payment_meta = array_merge( maybe_unserialize( $payment_meta['_give_payment_meta'] ), $payment_meta );
409 }
410
411 // Set cache.
412 Give_Cache::set_db_query( $cache_key, $payment_meta );
413 }
414
415 if ( $single ) {
416 /**
417 * Filter the payment meta
418 * Add custom meta key to payment meta
419 *
420 * @since 2.0
421 */
422 $new_payment_meta[0] = apply_filters( 'give_get_payment_meta', $payment_meta, $object_id, $meta_key );
423
424 $payment_meta = $new_payment_meta;
425 }
426
427 return $payment_meta;
428 }
429
430 if( give_has_upgrade_completed( 'v20_upgrades_payment_metadata' ) ) {
431 add_filter( 'get_post_metadata', 'give_bc_v20_get_payment_meta', 999, 4 );
432 }
433
434 /**
435 * Add meta in payment that store page id and page url.
436 *
437 * Will add/update when user add click on the checkout page.
438 * The status of the donation doest not matter as it get change when user had made the payment successfully.
439 *
440 * @since 1.8.13
441 *
442 * @param int $payment_id Payment id for which the meta value should be updated.
443 */
444 function give_payment_save_page_data( $payment_id ) {
445 $page_url = ( ! empty( $_REQUEST['give-current-url'] ) ? esc_url( $_REQUEST['give-current-url'] ) : false );
446
447 // Check $page_url is not empty.
448 if ( $page_url ) {
449 update_post_meta( $payment_id, '_give_current_url', $page_url );
450 $page_id = url_to_postid( $page_url );
451 // Check $page_id is not empty.
452 if ( $page_id ) {
453 update_post_meta( $payment_id, '_give_current_page_id', $page_id );
454 }
455 }
456 }
457
458 // Fire when payment is save.
459 add_action( 'give_insert_payment', 'give_payment_save_page_data' );
460