PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.0.2
GiveWP – Donation Plugin and Fundraising Platform v2.0.2
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 8 years ago backward-compatibility.php 8 years ago class-give-payment.php 8 years ago class-payment-stats.php 8 years ago class-payments-query.php 8 years ago functions.php 8 years ago
actions.php
452 lines
1 <?php
2 /**
3 * Payment Actions
4 *
5 * @package Give
6 * @subpackage Payments
7 * @copyright Copyright (c) 2016, WordImpress
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 );
83 give_increase_donation_count( $form_id );
84
85 // @todo: Refresh only range related stat cache
86 give_delete_donation_stats();
87
88 // Increase the donor's donation stats.
89 $donor = new Give_Donor( $donor_id );
90 $donor->increase_purchase_count();
91 $donor->increase_value( $amount );
92
93 give_increase_total_earnings( $amount );
94
95 // Ensure this action only runs once ever.
96 if ( empty( $completed_date ) ) {
97
98 // Save the completed date.
99 $payment->completed_date = current_time( 'mysql' );
100 $payment->save();
101
102 /**
103 * Fires after a donation successfully complete.
104 *
105 * @since 1.0
106 *
107 * @param int $payment_id The ID of the payment.
108 */
109 do_action( 'give_complete_donation', $payment_id );
110 }
111
112 }
113
114 add_action( 'give_update_payment_status', 'give_complete_purchase', 100, 3 );
115
116
117 /**
118 * Record payment status change
119 *
120 * @since 1.0
121 *
122 * @param int $payment_id The ID number of the payment.
123 * @param string $new_status The status of the payment, probably "publish".
124 * @param string $old_status The status of the payment prior to being marked as "complete", probably "pending".
125 *
126 * @return void
127 */
128 function give_record_status_change( $payment_id, $new_status, $old_status ) {
129
130 // Get the list of statuses so that status in the payment note can be translated.
131 $stati = give_get_payment_statuses();
132 $old_status = isset( $stati[ $old_status ] ) ? $stati[ $old_status ] : $old_status;
133 $new_status = isset( $stati[ $new_status ] ) ? $stati[ $new_status ] : $new_status;
134
135 // translators: 1: old status 2: new status.
136 $status_change = sprintf( esc_html__( 'Status changed from %1$s to %2$s.', 'give' ), $old_status, $new_status );
137
138 give_insert_payment_note( $payment_id, $status_change );
139 }
140
141 add_action( 'give_update_payment_status', 'give_record_status_change', 100, 3 );
142
143
144 /**
145 * Update Old Payments Totals
146 *
147 * Updates all old payments, prior to 1.2, with new meta for the total donation amount.
148 *
149 * It's done to query payments by their totals.
150 *
151 * @since 1.0
152 *
153 * @param array $data Arguments passed.
154 *
155 * @return void
156 */
157 function give_update_old_payments_with_totals( $data ) {
158 if ( ! wp_verify_nonce( $data['_wpnonce'], 'give_upgrade_payments_nonce' ) ) {
159 return;
160 }
161
162 if ( get_option( 'give_payment_totals_upgraded' ) ) {
163 return;
164 }
165
166 $payments = give_get_payments( array(
167 'offset' => 0,
168 'number' => - 1,
169 'mode' => 'all',
170 ) );
171
172 if ( $payments ) {
173 foreach ( $payments as $payment ) {
174
175 $payment = new Give_Payment( $payment->ID );
176 $meta = $payment->get_meta();
177
178 $payment->total = $meta['amount'];
179 $payment->save();
180
181 }
182 }
183
184 add_option( 'give_payment_totals_upgraded', 1 );
185 }
186
187 add_action( 'give_upgrade_payments', 'give_update_old_payments_with_totals' );
188
189 /**
190 * Mark Abandoned Donations
191 *
192 * Updates over a week-old 'pending' donations to 'abandoned' status.
193 *
194 * @since 1.0
195 *
196 * @return void
197 */
198 function give_mark_abandoned_donations() {
199 $args = array(
200 'status' => 'pending',
201 'number' => - 1,
202 'output' => 'give_payments',
203 );
204
205 add_filter( 'posts_where', 'give_filter_where_older_than_week' );
206
207 $payments = give_get_payments( $args );
208
209 remove_filter( 'posts_where', 'give_filter_where_older_than_week' );
210
211 if ( $payments ) {
212 /**
213 * Filter payment gateways: Used to set payment gateways which can be skip while transferring pending payment to abandon.
214 *
215 * @since 1.6
216 *
217 * @param array $skip_payment_gateways Array of payment gateways
218 */
219 $skip_payment_gateways = apply_filters( 'give_mark_abandoned_donation_gateways', array( 'offline' ) );
220
221 foreach ( $payments as $payment ) {
222 $gateway = give_get_payment_gateway( $payment );
223
224 // Skip payment gateways.
225 if ( in_array( $gateway, $skip_payment_gateways ) ) {
226 continue;
227 }
228
229 $payment->status = 'abandoned';
230 $payment->save();
231 }
232 }
233 }
234
235 Give_Cron::add_weekly_event( 'give_mark_abandoned_donations' );
236
237
238 /**
239 * Trigger the refresh of this month reports transients
240 *
241 * @since 1.7
242 *
243 * @param int $payment_ID Payment ID.
244 *
245 * @return void
246 */
247 function give_refresh_thismonth_stat_transients( $payment_ID ) {
248 // Monthly stats.
249 Give_Cache::delete( Give_Cache::get_key( 'give_estimated_monthly_stats' ) );
250
251 // @todo: Refresh only range related stat cache
252 give_delete_donation_stats();
253 }
254
255 add_action( 'save_post_give_payment', 'give_refresh_thismonth_stat_transients' );
256
257
258 /**
259 * Add support to get all payment meta.
260 * Note: only use for internal purpose
261 *
262 * @since 2.0
263 *
264 * @param $check
265 * @param $object_id
266 * @param $meta_key
267 * @param $single
268 *
269 * @return array
270 */
271 function give_bc_v20_get_payment_meta( $check, $object_id, $meta_key, $single ) {
272 // Bailout.
273 if (
274 'give_payment' !== get_post_type( $object_id ) ||
275 '_give_payment_meta' !== $meta_key ||
276 ! give_has_upgrade_completed( 'v20_upgrades_payment_metadata' )
277 ) {
278 return $check;
279 }
280
281 $cache_key = "_give_payment_meta_{$object_id}";
282
283 // Get already calculate payment meta from cache.
284 $payment_meta = Give_Cache::get_db_query( $cache_key );
285
286 if ( is_null( $payment_meta ) ) {
287 // Remove filter.
288 remove_filter( 'get_post_metadata', 'give_bc_v20_get_payment_meta', 999 );
289
290 $donation = new Give_Payment( $object_id );
291
292 // Get all payment meta.
293 $payment_meta = give_get_meta( $object_id );
294
295 // Set default value to array.
296 if ( empty( $payment_meta ) ) {
297 return $check;
298 }
299
300 // Convert all meta key value to string instead of array
301 array_walk( $payment_meta, function ( &$meta, $key ) {
302 $meta = current( $meta );
303 } );
304
305 /**
306 * Add backward compatibility to old meta keys.
307 */
308 // Donation key.
309 $payment_meta['key'] = ! empty( $payment_meta['_give_payment_purchase_key'] ) ? $payment_meta['_give_payment_purchase_key'] : '';
310
311 // Donation form.
312 $payment_meta['form_title'] = ! empty( $payment_meta['_give_payment_form_title'] ) ? $payment_meta['_give_payment_form_title'] : '';
313
314 // Donor email.
315 $payment_meta['email'] = ! empty( $payment_meta['_give_payment_donor_email'] ) ? $payment_meta['_give_payment_donor_email'] : '';
316 $payment_meta['email'] = ! empty( $payment_meta['email'] ) ?
317 $payment_meta['email'] :
318 Give()->donors->get_column( 'email', $donation->donor_id );
319
320 // Form id.
321 $payment_meta['form_id'] = ! empty( $payment_meta['_give_payment_form_id'] ) ? $payment_meta['_give_payment_form_id'] : '';
322
323 // Price id.
324 $payment_meta['price_id'] = ! empty( $payment_meta['_give_payment_price_id'] ) ? $payment_meta['_give_payment_price_id'] : '';
325
326 // Date.
327 $payment_meta['date'] = ! empty( $payment_meta['_give_payment_date'] ) ? $payment_meta['_give_payment_date'] : '';
328 $payment_meta['date'] = ! empty( $payment_meta['date'] ) ?
329 $payment_meta['date'] :
330 get_post_field( 'post_date', $object_id );
331
332
333 // Currency.
334 $payment_meta['currency'] = ! empty( $payment_meta['_give_payment_currency'] ) ? $payment_meta['_give_payment_currency'] : '';
335
336 // Decode donor data.
337 $donor_id = ! empty( $payment_meta['_give_payment_donor_id'] ) ? $payment_meta['_give_payment_donor_id'] : 0;
338 $donor = new Give_Donor( $donor_id );
339
340 // Donor first name.
341 $donor_data['first_name'] = ! empty( $payment_meta['_give_donor_billing_first_name'] ) ? $payment_meta['_give_donor_billing_first_name'] : '';
342 $donor_data['first_name'] = ! empty( $donor_data['first_name'] ) ?
343 $donor_data['first_name'] :
344 $donor->get_first_name();
345
346 // Donor last name.
347 $donor_data['last_name'] = ! empty( $payment_meta['_give_donor_billing_last_name'] ) ? $payment_meta['_give_donor_billing_last_name'] : '';
348 $donor_data['last_name'] = ! empty( $donor_data['last_name'] ) ?
349 $donor_data['last_name'] :
350 $donor->get_last_name();
351
352 // Donor email.
353 $donor_data['email'] = $payment_meta['email'];
354
355 // User ID.
356 $donor_data['id'] = $donation->user_id;
357
358 $donor_data['address'] = false;
359
360 // Address1.
361 $address1 = ! empty( $payment_meta['_give_donor_billing_address1'] ) ? $payment_meta['_give_donor_billing_address1'] : '';
362 if ( $address1 ) {
363 $donor_data['address']['line1'] = $address1;
364 }
365
366 // Address2.
367 $address2 = ! empty( $payment_meta['_give_donor_billing_address2'] ) ? $payment_meta['_give_donor_billing_address2'] : '';
368 if ( $address2 ) {
369 $donor_data['address']['line2'] = $address2;
370 }
371
372 // City.
373 $city = ! empty( $payment_meta['_give_donor_billing_city'] ) ? $payment_meta['_give_donor_billing_city'] : '';
374 if ( $city ) {
375 $donor_data['address']['city'] = $city;
376 }
377
378 // Zip.
379 $zip = ! empty( $payment_meta['_give_donor_billing_zip'] ) ? $payment_meta['_give_donor_billing_zip'] : '';
380 if ( $zip ) {
381 $donor_data['address']['zip'] = $zip;
382 }
383
384 // State.
385 $state = ! empty( $payment_meta['_give_donor_billing_state'] ) ? $payment_meta['_give_donor_billing_state'] : '';
386 if ( $state ) {
387 $donor_data['address']['state'] = $state;
388 }
389
390 // Country.
391 $country = ! empty( $payment_meta['_give_donor_billing_country'] ) ? $payment_meta['_give_donor_billing_country'] : '';
392 if ( $country ) {
393 $donor_data['address']['country'] = $country;
394 }
395
396 $payment_meta['user_info'] = $donor_data;
397
398 // Add filter
399 add_filter( 'get_post_metadata', 'give_bc_v20_get_payment_meta', 999, 4 );
400
401 // Set custom meta key into payment meta.
402 if ( ! empty( $payment_meta['_give_payment_meta'] ) ) {
403 $payment_meta = array_merge( maybe_unserialize( $payment_meta['_give_payment_meta'] ), $payment_meta );
404 }
405
406 // Set cache.
407 Give_Cache::set_db_query( $cache_key, $payment_meta );
408 }
409
410 if ( $single ) {
411 /**
412 * Filter the payment meta
413 * Add custom meta key to payment meta
414 *
415 * @since 2.0
416 */
417 $new_payment_meta[0] = apply_filters( 'give_get_payment_meta', $payment_meta, $object_id, $meta_key );
418
419 $payment_meta = $new_payment_meta;
420 }
421
422 return $payment_meta;
423 }
424
425 add_filter( 'get_post_metadata', 'give_bc_v20_get_payment_meta', 999, 4 );
426
427 /**
428 * Add meta in payment that store page id and page url.
429 *
430 * Will add/update when user add click on the checkout page.
431 * The status of the donation doest not matter as it get change when user had made the payment successfully.
432 *
433 * @since 1.8.13
434 *
435 * @param int $payment_id Payment id for which the meta value should be updated.
436 */
437 function give_payment_save_page_data( $payment_id ) {
438 $page_url = ( ! empty( $_REQUEST['give-current-url'] ) ? esc_url( $_REQUEST['give-current-url'] ) : false );
439
440 // Check $page_url is not empty.
441 if ( $page_url ) {
442 update_post_meta( $payment_id, '_give_current_url', $page_url );
443 $page_id = url_to_postid( $page_url );
444 // Check $page_id is not empty.
445 if ( $page_id ) {
446 update_post_meta( $payment_id, '_give_current_page_id', $page_id );
447 }
448 }
449 }
450
451 // Fire when payment is save.
452 add_action( 'give_insert_payment', 'give_payment_save_page_data' );