Test Failed
Push — issue/3412 ( fef660 )
by Ravinder
05:44
created

ajax-functions.php ➔ __give_get_receipt()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
1
<?php
2
/**
3
 * AJAX Functions
4
 *
5
 * Process the front-end AJAX actions.
6
 *
7
 * @package     Give
8
 * @subpackage  Functions/AJAX
9
 * @copyright   Copyright (c) 2016, WordImpress
10
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
11
 * @since       1.0
12
 */
13
14
// Exit if accessed directly.
15
if ( ! defined( 'ABSPATH' ) ) {
16
	exit;
17
}
18
19
/**
20
 * Check if AJAX works as expected
21
 * Note: Do not use this function before init hook.
22
 *
23
 * @since  1.0
24
 *
25
 * @return bool True if AJAX works, false otherwise
26
 */
27
function give_test_ajax_works() {
28
	// Handle ajax.
29
	if ( doing_action( 'wp_ajax_nopriv_give_test_ajax' ) ) {
30
		wp_die( 0, 200 );
31
	}
32
33
	// Check if the Airplane Mode plugin is installed.
34
	if ( class_exists( 'Airplane_Mode_Core' ) ) {
35
36
		$airplane = Airplane_Mode_Core::getInstance();
37
38
		if ( method_exists( $airplane, 'enabled' ) ) {
39
40
			if ( $airplane->enabled() ) {
41
				return true;
42
			}
43
		} else {
44
45
			if ( 'on' === $airplane->check_status() ) {
46
				return true;
47
			}
48
		}
49
	}
50
51
	add_filter( 'block_local_requests', '__return_false' );
52
53
	if ( Give_Cache::get( '_give_ajax_works', true ) ) {
54
		return true;
55
	}
56
57
	$params = array(
58
		'sslverify' => false,
59
		'timeout'   => 30,
60
		'body'      => array(
61
			'action' => 'give_test_ajax',
62
		),
63
	);
64
65
	$ajax = wp_remote_post( give_get_ajax_url(), $params );
66
67
	$works = true;
68
69
	if ( is_wp_error( $ajax ) ) {
70
71
		$works = false;
72
73
	} else {
74
75
		if ( empty( $ajax['response'] ) ) {
76
			$works = false;
77
		}
78
79
		if ( empty( $ajax['response']['code'] ) || 200 !== (int) $ajax['response']['code'] ) {
80
			$works = false;
81
		}
82
83
		if ( empty( $ajax['response']['message'] ) || 'OK' !== $ajax['response']['message'] ) {
84
			$works = false;
85
		}
86
87
		if ( ! isset( $ajax['body'] ) || 0 !== (int) $ajax['body'] ) {
88
			$works = false;
89
		}
90
	}
91
92
	if ( $works ) {
93
		Give_Cache::set( '_give_ajax_works', '1', DAY_IN_SECONDS, true );
94
	}
95
96
	return apply_filters( 'give_test_ajax_works', $works );
97
}
98
99
add_action( 'wp_ajax_nopriv_give_test_ajax', 'give_test_ajax_works' );
100
101
/**
102
 * Get AJAX URL
103
 *
104
 * @since  1.0
105
 *
106
 * @param array $query
107
 *
108
 * @return string
109
 */
110
function give_get_ajax_url( $query = array() ) {
111
	$scheme = defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ? 'https' : 'admin';
112
113
	$current_url = give_get_current_page_url();
114
	$ajax_url    = admin_url( 'admin-ajax.php', $scheme );
115
116
	if ( preg_match( '/^https/', $current_url ) && ! preg_match( '/^https/', $ajax_url ) ) {
117
		$ajax_url = preg_replace( '/^http/', 'https', $ajax_url );
118
	}
119
120
	if ( ! empty( $query ) ) {
121
		$ajax_url = add_query_arg( $query, $ajax_url );
122
	}
123
124
	return apply_filters( 'give_ajax_url', $ajax_url );
125
}
126
127
/**
128
 * Loads Checkout Login Fields via AJAX
129
 *
130
 * @since  1.0
131
 *
132
 * @return void
133
 */
134
function give_load_checkout_login_fields() {
135
	/**
136
	 * Fire when render login fields via ajax.
137
	 *
138
	 * @since 1.7
139
	 */
140
	do_action( 'give_donation_form_login_fields' );
141
142
	give_die();
143
}
144
145
add_action( 'wp_ajax_nopriv_give_checkout_login', 'give_load_checkout_login_fields' );
146
147
/**
148
 * Load Checkout Fields
149
 *
150
 * @since  1.3.6
151
 *
152
 * @return void
153
 */
154
function give_load_checkout_fields() {
155
	$form_id = isset( $_POST['form_id'] ) ? $_POST['form_id'] : '';
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
156
157
	ob_start();
158
159
	/**
160
	 * Fire to render registration/login form.
161
	 *
162
	 * @since 1.7
163
	 */
164
	do_action( 'give_donation_form_register_login_fields', $form_id );
165
166
	$fields = ob_get_clean();
167
168
	wp_send_json( array(
169
		'fields' => wp_json_encode( $fields ),
170
		'submit' => wp_json_encode( give_get_donation_form_submit_button( $form_id ) ),
171
	) );
172
}
173
174
add_action( 'wp_ajax_nopriv_give_cancel_login', 'give_load_checkout_fields' );
175
add_action( 'wp_ajax_nopriv_give_checkout_register', 'give_load_checkout_fields' );
176
177
/**
178
 * Get Form Title via AJAX (used only in WordPress Admin)
179
 *
180
 * @since  1.0
181
 *
182
 * @return void
183
 */
184
function give_ajax_get_form_title() {
185
	if ( isset( $_POST['form_id'] ) ) {
186
		$title = get_the_title( $_POST['form_id'] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
187
		if ( $title ) {
188
			echo $title;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$title'
Loading history...
189
		} else {
190
			echo 'fail';
191
		}
192
	}
193
	give_die();
194
}
195
196
add_action( 'wp_ajax_give_get_form_title', 'give_ajax_get_form_title' );
197
add_action( 'wp_ajax_nopriv_give_get_form_title', 'give_ajax_get_form_title' );
198
199
/**
200
 * Retrieve a states drop down
201
 *
202
 * @since  1.0
203
 *
204
 * @return void
205
 */
206
function give_ajax_get_states_field() {
207
	$states_found   = false;
208
	$show_field     = true;
209
	$states_require = true;
210
	// Get the Country code from the $_POST.
211
	$country = sanitize_text_field( $_POST['country'] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
212
213
	// Get the field name from the $_POST.
214
	$field_name = sanitize_text_field( $_POST['field_name'] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
215
216
	$label        = __( 'State', 'give' );
217
	$states_label = give_get_states_label();
218
219
	$default_state = '';
220
	if ( $country === give_get_country() ) {
221
		$default_state = give_get_state();
222
	}
223
224
	// Check if $country code exists in the array key for states label.
225
	if ( array_key_exists( $country, $states_label ) ) {
226
		$label = $states_label[ $country ];
227
	}
228
229
	if ( empty( $country ) ) {
230
		$country = give_get_country();
231
	}
232
233
	$states = give_get_states( $country );
234
	if ( ! empty( $states ) ) {
235
		$args         = array(
236
			'name'             => $field_name,
237
			'id'               => $field_name,
238
			'class'            => $field_name . '  give-select',
239
			'options'          => $states,
240
			'show_option_all'  => false,
241
			'show_option_none' => false,
242
			'placeholder'      => $label,
243
			'selected'         => $default_state,
244
		);
245
		$data         = Give()->html->select( $args );
246
		$states_found = true;
247
	} else {
248
		$data = 'nostates';
249
250
		// Get the country list that does not have any states init.
251
		$no_states_country = give_no_states_country_list();
252
253
		// Check if $country code exists in the array key.
254
		if ( array_key_exists( $country, $no_states_country ) ) {
255
			$show_field = false;
256
		}
257
258
		// Get the country list that does not require states.
259
		$states_not_required_country_list = give_states_not_required_country_list();
260
261
		// Check if $country code exists in the array key.
262
		if ( array_key_exists( $country, $states_not_required_country_list ) ) {
263
			$states_require = false;
264
		}
265
	}
266
	$response = array(
267
		'success'        => true,
268
		'states_found'   => $states_found,
269
		'states_label'   => $label,
270
		'show_field'     => $show_field,
271
		'states_require' => $states_require,
272
		'data'           => $data,
273
		'default_state'  => $default_state,
274
	);
275
	wp_send_json( $response );
276
}
277
278
add_action( 'wp_ajax_give_get_states', 'give_ajax_get_states_field' );
279
add_action( 'wp_ajax_nopriv_give_get_states', 'give_ajax_get_states_field' );
280
281
/**
282
 * Retrieve donation forms via AJAX for chosen dropdown search field.
283
 *
284
 * @since  1.0
285
 *
286
 * @return void
287
 */
288
function give_ajax_form_search() {
289
	$results = array();
290
	$search  = esc_sql( sanitize_text_field( $_POST['s'] ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
291
292
	$args = array(
293
		'post_type'              => 'give_forms',
294
		's'                      => $search,
295
		'update_post_term_cache' => false,
296
		'update_post_meta_cache' => false,
297
		'cache_results'          => false,
298
		'no_found_rows'          => true,
299
		'post_status'            => 'publish',
300
	);
301
302
	/**
303
	 * Filter to modify Ajax form search args
304
	 *
305
	 * @since 2.1
306
	 *
307
	 * @param array $args Query argument for WP_query
308
	 *
309
	 * @return array $args Query argument for WP_query
310
	 */
311
	$args = (array) apply_filters( 'give_ajax_form_search_args', $args );
312
313
	// get all the donation form.
314
	$query = new WP_Query( $args );
315
	if ( $query->have_posts() ) {
316
		while ( $query->have_posts() ) {
317
			$query->the_post();
318
			global $post;
319
320
			$results[] = array(
321
				'id'   => $post->ID,
322
				'name' => $post->post_title,
323
			);
324
		}
325
		wp_reset_postdata();
326
	}
327
328
	/**
329
	 * Filter to modify Ajax form search result
330
	 *
331
	 * @since 2.1
332
	 *
333
	 * @param array $results Contain the Donation Form id
334
	 *
335
	 * @return array $results Contain the Donation Form id
336
	 */
337
	$results = (array) apply_filters( 'give_ajax_form_search_responce', $results );
338
339
	wp_send_json( $results );
340
}
341
342
add_action( 'wp_ajax_give_form_search', 'give_ajax_form_search' );
343
add_action( 'wp_ajax_nopriv_give_form_search', 'give_ajax_form_search' );
344
345
/**
346
 * Search the donors database via Ajax
347
 *
348
 * @since  1.0
349
 *
350
 * @return void
351
 */
352
function give_ajax_donor_search() {
353
	global $wpdb;
354
355
	$search  = esc_sql( sanitize_text_field( $_POST['s'] ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
356
	$results = array();
357
	if ( ! current_user_can( 'view_give_reports' ) ) {
358
		$donors = array();
359
	} else {
360
		$donors = $wpdb->get_results( "SELECT id,name,email FROM $wpdb->donors WHERE `name` LIKE '%$search%' OR `email` LIKE '%$search%' LIMIT 50" );
0 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
361
	}
362
363
	if ( $donors ) {
364
		foreach ( $donors as $donor ) {
365
366
			$results[] = array(
367
				'id'   => $donor->id,
368
				'name' => $donor->name . ' (' . $donor->email . ')',
369
			);
370
		}
371
	}
372
373
	wp_send_json( $results );
374
}
375
376
add_action( 'wp_ajax_give_donor_search', 'give_ajax_donor_search' );
377
378
379
/**
380
 * Searches for users via ajax and returns a list of results
381
 *
382
 * @since  1.0
383
 *
384
 * @return void
385
 */
386
function give_ajax_search_users() {
387
	$results = array();
388
389
	if ( current_user_can( 'manage_give_settings' ) ) {
390
391
		$search = esc_sql( sanitize_text_field( $_POST['s'] ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
392
393
		$get_users_args = array(
394
			'number' => 9999,
395
			'search' => $search . '*',
396
		);
397
398
		$get_users_args = apply_filters( 'give_search_users_args', $get_users_args );
399
400
		$found_users = apply_filters( 'give_ajax_found_users', get_users( $get_users_args ), $search );
401
		$results     = array();
402
403
		if ( $found_users ) {
404
405
			foreach ( $found_users as $user ) {
406
407
				$results[] = array(
408
					'id'   => $user->ID,
409
					'name' => esc_html( $user->user_login . ' (' . $user->user_email . ')' ),
410
				);
411
			}
412
		}
413
	}// End if().
414
415
	wp_send_json( $results );
416
417
}
418
419
add_action( 'wp_ajax_give_user_search', 'give_ajax_search_users' );
420
421
422
/**
423
 * Queries page by title and returns page ID and title in JSON format.
424
 *
425
 * Note: this function in for internal use.
426
 *
427
 * @since 2.1
428
 *
429
 * @return string
430
 */
431
function give_ajax_pages_search() {
432
	$data = array();
433
	$args = array(
434
		'post_type' => 'page',
435
		's'         => give_clean( $_POST['s'] ),
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
436
	);
437
438
	$query = new WP_Query( $args );
439
440
	// Query posts by title.
441
	if ( $query->have_posts() ) {
442
		while ( $query->have_posts() ) {
443
			$query->the_post();
444
445
			$data[] = array(
446
				'id'   => get_the_ID(),
447
				'name' => get_the_title(),
448
			);
449
		}
450
	}
451
452
	wp_send_json( $data );
453
}
454
455
add_action( 'wp_ajax_give_pages_search', 'give_ajax_pages_search' );
456
457
/**
458
 * Retrieve Categories via AJAX for chosen dropdown search field.
459
 *
460
 * @since  2.1
461
 *
462
 * @return void
463
 */
464 View Code Duplication
function give_ajax_categories_search() {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
465
	$results = array();
466
467
	/**
468
	 * Filter to modify Ajax tags search args
469
	 *
470
	 * @since 2.1
471
	 *
472
	 * @param array $args argument for get_terms
473
	 *
474
	 * @return array $args argument for get_terms
475
	 */
476
	$args = (array) apply_filters( 'give_forms_categories_dropdown_args', array(
477
		'number'     => 30,
478
		'name__like' => esc_sql( sanitize_text_field( $_POST['s'] ) )
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
479
	) );
480
481
	$categories = get_terms( 'give_forms_category', $args );
482
483
	foreach ( $categories as $category ) {
484
		$results[] = array(
485
			'id'   => $category->term_id,
486
			'name' => $category->name,
487
		);
488
	}
489
490
	/**
491
	 * Filter to modify Ajax tags search result
492
	 *
493
	 * @since 2.1
494
	 *
495
	 * @param array $results Contain the categories id and name
496
	 *
497
	 * @return array $results Contain the categories id and name
498
	 */
499
	$results = (array) apply_filters( 'give_forms_categories_dropdown_responce', $results );
500
501
	wp_send_json( $results );
502
}
503
504
add_action( 'wp_ajax_give_categories_search', 'give_ajax_categories_search' );
505
506
/**
507
 * Retrieve Tags via AJAX for chosen dropdown search field.
508
 *
509
 * @since  2.1
510
 *
511
 * @return void
512
 */
513 View Code Duplication
function give_ajax_tags_search() {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
514
	$results = array();
515
516
	/**
517
	 * Filter to modify Ajax tags search args
518
	 *
519
	 * @since 2.1
520
	 *
521
	 * @param array $args argument for get_terms
522
	 *
523
	 * @return array $args argument for get_terms
524
	 */
525
	$args = (array) apply_filters( 'give_forms_tags_dropdown_args', array(
526
		'number'     => 30,
527
		'name__like' => esc_sql( sanitize_text_field( $_POST['s'] ) )
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
528
	) );
529
530
	$categories = get_terms( 'give_forms_tag', $args );
531
532
	foreach ( $categories as $category ) {
533
		$results[] = array(
534
			'id'   => $category->term_id,
535
			'name' => $category->name,
536
		);
537
	}
538
539
	/**
540
	 * Filter to modify Ajax tags search result
541
	 *
542
	 * @since 2.1
543
	 *
544
	 * @param array $results Contain the tags id and name
545
	 *
546
	 * @return array $results Contain the tags id and name
547
	 */
548
	$results = (array) apply_filters( 'give_forms_tags_dropdown_responce', $results );
549
550
	wp_send_json( $results );
551
}
552
553
add_action( 'wp_ajax_give_tags_search', 'give_ajax_tags_search' );
554
555
/**
556
 * Check for Price Variations (Multi-level donation forms)
557
 *
558
 * @since  1.5
559
 *
560
 * @return void
561
 */
562
function give_check_for_form_price_variations() {
563
564
	if ( ! current_user_can( 'edit_give_forms', get_current_user_id() ) ) {
565
		die( '-1' );
566
	}
567
568
	$form_id = intval( $_POST['form_id'] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
569
	$form    = get_post( $form_id );
570
571
	if ( 'give_forms' !== $form->post_type ) {
572
		die( '-2' );
573
	}
574
575
	if ( give_has_variable_prices( $form_id ) ) {
576
		$variable_prices = give_get_variable_prices( $form_id );
577
578
		if ( $variable_prices ) {
579
			$ajax_response = '<select class="give_price_options_select give-select give-select" name="give_price_option">';
580
581
			if ( isset( $_POST['all_prices'] ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
582
				$ajax_response .= '<option value="all">' . esc_html__( 'All Levels', 'give' ) . '</option>';
583
			}
584
585
			foreach ( $variable_prices as $key => $price ) {
586
587
				$level_text = ! empty( $price['_give_text'] ) ? esc_html( $price['_give_text'] ) : give_currency_filter( give_format_amount( $price['_give_amount'], array( 'sanitize' => false ) ) );
588
589
				$ajax_response .= '<option value="' . esc_attr( $price['_give_id']['level_id'] ) . '">' . $level_text . '</option>';
590
			}
591
			$ajax_response .= '</select>';
592
			echo $ajax_response;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$ajax_response'
Loading history...
593
		}
594
	}
595
596
	give_die();
597
}
598
599
add_action( 'wp_ajax_give_check_for_form_price_variations', 'give_check_for_form_price_variations' );
600
601
602
/**
603
 * Check for Variation Prices HTML  (Multi-level donation forms)
604
 *
605
 * @since  1.6
606
 *
607
 * @return void
608
 */
609
function give_check_for_form_price_variations_html() {
610
	if ( ! current_user_can( 'edit_give_payments', get_current_user_id() ) ) {
611
		wp_die();
612
	}
613
614
	$form_id    = ! empty( $_POST['form_id'] ) ? intval( $_POST['form_id'] ) : false;
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
615
	$payment_id = ! empty( $_POST['payment_id'] ) ? intval( $_POST['payment_id'] ) : false;
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
616
	if ( empty( $form_id ) || empty( $payment_id ) ) {
617
		wp_die();
618
	}
619
620
	$form = get_post( $form_id );
621
	if ( ! empty( $form->post_type ) && 'give_forms' !== $form->post_type ) {
622
		wp_die();
623
	}
624
625
	if ( ! give_has_variable_prices( $form_id ) || ! $form_id ) {
0 ignored issues
show
Security Bug introduced by
It seems like $form_id defined by !empty($_POST['form_id']...OST['form_id']) : false on line 614 can also be of type false; however, give_has_variable_prices() does only seem to accept integer, did you maybe forget to handle an error condition?

This check looks for type mismatches where the missing type is false. This is usually indicative of an error condtion.

Consider the follow example

<?php

function getDate($date)
{
    if ($date !== null) {
        return new DateTime($date);
    }

    return false;
}

This function either returns a new DateTime object or false, if there was an error. This is a typical pattern in PHP programming to show that an error has occurred without raising an exception. The calling code should check for this returned false before passing on the value to another function or method that may not be able to handle a false.

Loading history...
Bug Best Practice introduced by
The expression $form_id of type integer|false is loosely compared to false; this is ambiguous if the integer can be zero. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
626
		esc_html_e( 'n/a', 'give' );
627
	} else {
628
		$prices_atts = array();
629 View Code Duplication
		if ( $variable_prices = give_get_variable_prices( $form_id ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
630
			foreach ( $variable_prices as $variable_price ) {
631
				$prices_atts[ $variable_price['_give_id']['level_id'] ] = give_format_amount( $variable_price['_give_amount'], array( 'sanitize' => false ) );
632
			}
633
		}
634
635
		// Variable price dropdown options.
636
		$variable_price_dropdown_option = array(
637
			'id'               => $form_id,
638
			'name'             => 'give-variable-price',
639
			'chosen'           => true,
640
			'show_option_all'  => '',
641
			'show_option_none' => '',
642
			'select_atts'      => 'data-prices=' . esc_attr( json_encode( $prices_atts ) ),
643
		);
644
645
		if ( $payment_id ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $payment_id of type integer|false is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
646
			// Payment object.
647
			$payment = new Give_Payment( $payment_id );
648
649
			// Payment meta.
650
			$payment_meta                               = $payment->get_meta();
651
			$variable_price_dropdown_option['selected'] = $payment_meta['price_id'];
652
		}
653
654
		// Render variable prices select tag html.
655
		give_get_form_variable_price_dropdown( $variable_price_dropdown_option, true );
656
	}
657
658
	give_die();
659
}
660
661
add_action( 'wp_ajax_give_check_for_form_price_variations_html', 'give_check_for_form_price_variations_html' );
662
663
/**
664
 * Send Confirmation Email For Complete Donation History Access.
665
 *
666
 * @since 1.8.17
667
 *
668
 * @return bool
669
 */
670
function give_confirm_email_for_donation_access() {
671
672
	// Verify Security using Nonce.
673
	if ( ! check_ajax_referer( 'give_ajax_nonce', 'nonce' ) ) {
674
		return false;
675
	}
676
677
	// Bail Out, if email is empty.
678
	if ( empty( $_POST['email'] ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
679
		return false;
680
	}
681
682
	$donor = Give()->donors->get_donor_by( 'email', give_clean( $_POST['email'] ) );
0 ignored issues
show
Documentation introduced by
give_clean($_POST['email']) is of type string|array, but the function expects a integer.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
683
	if ( Give()->email_access->can_send_email( $donor->id ) ) {
684
		$return     = array();
685
		$email_sent = Give()->email_access->send_email( $donor->id, $donor->email );
686
687
		if ( ! $email_sent ) {
688
			$return['status']  = 'error';
689
			$return['message'] = Give()->notices->print_frontend_notice(
690
				__( 'Unable to send email. Please try again.', 'give' ),
691
				false,
692
				'error'
693
			);
694
		}
695
696
		$return['status']  = 'success';
697
698
		/**
699
		 * Filter to modify access mail send notice
700
		 *
701
		 * @since 2.1.3
702
		 *
703
		 * @param string Send notice message for email access.
704
		 *
705
		 * @return  string $message Send notice message for email access.
706
		 */
707
		$message = (string) apply_filters( 'give_email_access_mail_send_notice', __( 'Please check your email and click on the link to access your complete donation history.', 'give' ) );
708
709
		$return['message'] = Give()->notices->print_frontend_notice(
710
			$message,
711
			false,
712
			'success'
713
		);
714
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
715
716
	} else {
717
		$value             = Give()->email_access->verify_throttle / 60;
718
		$return['status']  = 'error';
719
720
		/**
721
		 * Filter to modify email access exceed notices message.
722
		 *
723
		 * @since 2.1.3
724
		 *
725
		 * @param string $message email access exceed notices message
726
		 * @param int $value email access exceed times
727
		 *
728
		 * @return string $message email access exceed notices message
729
		 */
730
		$message = (string) apply_filters(
731
			'give_email_access_requests_exceed_notice',
732
			sprintf(
733
				__( 'Too many access email requests detected. Please wait %s before requesting a new donation history access link.', 'give' ),
734
				sprintf( _n( '%s minute', '%s minutes', $value, 'give' ), $value )
735
			),
736
			$value
737
		);
738
739
		$return['message'] = Give()->notices->print_frontend_notice(
740
			$message,
741
			false,
742
			'error'
743
		);
744
	}
745
746
	echo json_encode( $return );
747
	give_die();
748
}
749
750
add_action( 'wp_ajax_nopriv_give_confirm_email_for_donations_access', 'give_confirm_email_for_donation_access' );
751
752
/**
753
 * Render receipt by ajax
754
 * Note: only for internal use
755
 *
756
 * @since 2.2.0
757
 */
758
function __give_get_receipt(){
759
	if( ! isset( $_POST['shortcode_atts'] ) ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
760
		give_die();
761
	}
762
763
	$atts = urldecode_deep( give_clean( $_POST['shortcode_atts'] ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
764
	$data = give_receipt_shortcode( $atts );
765
766
	wp_send_json( $data );
767
}
768
add_action( 'wp_ajax_get_receipt', '__give_get_receipt' );
769
add_action( 'wp_ajax_nopriv_get_receipt', '__give_get_receipt' );
770