Test Failed
Push — master ( 3995a3...673dde )
by Devin
05:40 queued 01:04
created

functions.php ➔ give_get_failed_transaction_uri()   B

Complexity

Conditions 5
Paths 16

Size

Total Lines 27
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
cc 5
eloc 14
nc 16
nop 1
dl 0
loc 27
rs 8.439
c 0
b 0
f 0
ccs 0
cts 4
cp 0
crap 30
1
<?php
2
/**
3
 * Give Form Functions
4
 *
5
 * @package     WordImpress
6
 * @subpackage  Includes/Forms
7
 * @copyright   Copyright (c) 2016, WordImpress
8
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
9
 * @since       1.1
10
 */
11
12
// Exit if accessed directly.
13
if ( ! defined( 'ABSPATH' ) ) {
14
	exit;
15
}
16
17
/**
18
 * Filter: Do not show the Give shortcut button on Give Forms CPT
19
 *
20
 * @return bool
21
 */
22
function give_shortcode_button_condition() {
23
24
	global $typenow;
25
26
	if ( $typenow != 'give_forms' ) {
0 ignored issues
show
introduced by
Found "!= '". Use Yoda Condition checks, you must
Loading history...
27
		return true;
28
	}
29
30
	return false;
31
}
32
33
add_filter( 'give_shortcode_button_condition', 'give_shortcode_button_condition' );
34
35
36
/**
37
 * Get the form ID from the form $args
38
 *
39
 * @param array $args
40
 *
41
 * @return int|false
42
 */
43
function get_form_id_from_args( $args ) {
44
45
	if ( isset( $args['form_id'] ) && $args['form_id'] != 0 ) {
0 ignored issues
show
introduced by
Found "!= 0". Use Yoda Condition checks, you must
Loading history...
46
47
		return intval( $args['form_id'] );
48
	}
49
50
	return false;
51
}
52
53
/**
54
 * Checks whether floating labels is enabled for the form ID in $args
55
 *
56
 * @since 1.1
57
 *
58
 * @param array $args
59
 *
60
 * @return bool
61
 */
62
function give_is_float_labels_enabled( $args ) {
63
64 1
	$float_labels = '';
65
66 1
	if ( ! empty( $args['float_labels'] ) ) {
67
		$float_labels = $args['float_labels'];
68
	}
69
70 1
	if ( empty( $float_labels ) ) {
71 1
		$float_labels = give_get_meta( $args['form_id'], '_give_form_floating_labels', true );
72 1
	}
73
74 1
	if ( empty( $float_labels ) || ( 'global' === $float_labels ) ) {
75 1
		$float_labels = give_get_option( 'floatlabels', 'disabled' );
76 1
	}
77
78 1
	return give_is_setting_enabled( $float_labels );
79
}
80
81
/**
82
 * Determines if a user can checkout or not
83
 *
84
 * Allows themes and plugins to set donation checkout conditions
85
 *
86
 * @since 1.0
87
 *
88
 * @return bool Can user checkout?
89
 */
90
function give_can_checkout() {
91 1
92
	$can_checkout = true;
93 1
94
	return (bool) apply_filters( 'give_can_checkout', $can_checkout );
95
}
96
97
/**
98
 * Retrieve the Success page URI
99
 *
100
 * @access      public
101
 * @since       1.0
102
 *
103
 * @return      string
104
 */
105 View Code Duplication
function give_get_success_page_uri() {
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...
106
	$give_options = give_get_settings();
107
108
	$success_page = isset( $give_options['success_page'] ) ? get_permalink( absint( $give_options['success_page'] ) ) : get_bloginfo( 'url' );
109
110
	return apply_filters( 'give_get_success_page_uri', $success_page );
111
}
112
113
/**
114
 * Determines if we're currently on the Success page.
115
 *
116
 * @since 1.0
117
 *
118
 * @return bool True if on the Success page, false otherwise.
119
 */
120
function give_is_success_page() {
121
	$give_options    = give_get_settings();
122
	$is_success_page = isset( $give_options['success_page'] ) ? is_page( $give_options['success_page'] ) : false;
123
124
	return apply_filters( 'give_is_success_page', $is_success_page );
125
}
126
127
/**
128
 * Send To Success Page
129
 *
130
 * Sends the user to the success page.
131
 *
132
 * @param string $query_string
133
 *
134
 * @access      public
135
 * @since       1.0
136
 * @return      void
137
 */
138
function give_send_to_success_page( $query_string = null ) {
139
140
	$redirect = give_get_success_page_uri();
141
142
	if ( $query_string ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $query_string of type string|null is loosely compared to true; this is ambiguous if the string can be empty. 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 string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
143
		$redirect .= $query_string;
144
	}
145
146
	$gateway = isset( $_REQUEST['give-gateway'] ) ? $_REQUEST['give-gateway'] : '';
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_REQUEST
Loading history...
147
148
	wp_redirect( apply_filters( 'give_success_page_redirect', $redirect, $gateway, $query_string ) );
149
	give_die();
150
}
151
152
153
/**
154
 * Send back to donation form.
155
 *
156
 * Used to redirect a user back to the donation form if there are errors present.
157
 *
158
 * @param array $args
159
 *
160
 * @access public
161
 * @since  1.0
162
 * @return Void
163
 */
164
function give_send_back_to_checkout( $args = array() ) {
165
166
	$url     = isset( $_POST['give-current-url'] ) ? sanitize_text_field( $_POST['give-current-url'] ) : '';
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
167
	$form_id = 0;
168
169
	// Set the form_id.
170
	if ( isset( $_POST['give-form-id'] ) ) {
171
		$form_id = sanitize_text_field( $_POST['give-form-id'] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
172
	}
173
174
	// Need a URL to continue. If none, redirect back to single form.
175
	if ( empty( $url ) ) {
176
		wp_safe_redirect( get_permalink( $form_id ) );
177
		give_die();
178
	}
179
180
	$defaults = array(
181
		'form-id' => (int) $form_id,
182
	);
183
184
	// Set the $level_id.
185
	if ( isset( $_POST['give-price-id'] ) ) {
186
		$defaults['level-id'] = sanitize_text_field( $_POST['give-price-id'] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
187
	}
188
189
	// Check for backward compatibility.
190
	if ( is_string( $args ) ) {
191
		$args = str_replace( '?', '', $args );
192
	}
193
194
	$args = wp_parse_args( $args, $defaults );
195
196
	// Merge URL query with $args to maintain third-party URL parameters after redirect.
197
	$url_data = wp_parse_url( $url );
198
199
	// Check if an array to prevent notices before parsing.
200
	if ( isset( $url_data['query'] ) && ! empty( $url_data['query'] ) ) {
201
		parse_str( $url_data['query'], $query );
202
203
		// Precaution: don't allow any CC info.
204
		unset( $query['card_number'] );
205
		unset( $query['card_cvc'] );
206
207
	} else {
208
		// No $url_data so pass empty array.
209
		$query = array();
210
	}
211
212
	$new_query        = array_merge( $args, $query );
213
	$new_query_string = http_build_query( $new_query );
214
215
	// Assemble URL parts.
216
	$redirect = home_url( '/' . $url_data['path'] . '?' . $new_query_string . '#give-form-' . $form_id . '-wrap' );
217
218
	// Redirect them.
219
	wp_safe_redirect( apply_filters( 'give_send_back_to_checkout', $redirect, $args ) );
220
	give_die();
221
222
}
223
224
/**
225
 * Get Success Page URL
226
 *
227
 * Gets the success page URL.
228
 *
229
 * @param string $query_string
230
 *
231
 * @access      public
232
 * @since       1.0
233
 * @return      string
234
 */
235
function give_get_success_page_url( $query_string = null ) {
236
237
	$success_page = give_get_option( 'success_page', 0 );
238
	$success_page = get_permalink( $success_page );
239
240
	if ( $query_string ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $query_string of type string|null is loosely compared to true; this is ambiguous if the string can be empty. 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 string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
241
		$success_page .= $query_string;
242
	}
243
244
	return apply_filters( 'give_success_page_url', $success_page );
245
246
}
247
248
/**
249
 * Get the URL of the Failed Donation Page.
250
 *
251
 * @since 1.0
252
 *
253
 * @param bool $extras Extras to append to the URL.
254
 *
255
 * @return mixed Full URL to the Failed Donation Page, if present, home page if it doesn't exist.
256
 */
257
function give_get_failed_transaction_uri( $extras = false ) {
258
	$give_options = give_get_settings();
259
260
	// Remove question mark.
261
	if ( 0 === strpos( $extras, '?' ) ) {
262
		$extras = substr( $extras, 1 );
263
	}
264
265
	$extras_args = wp_parse_args( $extras );
266
267
	// Set nonce if payment id exist in extra params.
268
	if ( array_key_exists( 'payment-id', $extras_args ) ) {
269
		$extras_args['_wpnonce'] = wp_create_nonce( "give-failed-donation-{$extras_args['payment-id']}" );
270
		$extras                  = http_build_query( $extras_args );
271
	}
272
273
	$uri = ! empty( $give_options['failure_page'] ) ?
274
		trailingslashit( get_permalink( $give_options['failure_page'] ) ) :
275
		home_url();
276
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
277
278
	if ( $extras ) {
279
		$uri .= "?{$extras}";
280
	}
281
282
	return apply_filters( 'give_get_failed_transaction_uri', $uri );
283
}
284
285
/**
286
 * Determines if we're currently on the Failed Donation Page.
287
 *
288
 * @since 1.0
289
 * @return bool True if on the Failed Donation Page, false otherwise.
290
 */
291
function give_is_failed_transaction_page() {
292
	$give_options = give_get_settings();
293
	$ret          = isset( $give_options['failure_page'] ) ? is_page( $give_options['failure_page'] ) : false;
294
295
	return apply_filters( 'give_is_failure_page', $ret );
296
}
297
298 42
/**
299
 * Mark payments as Failed when returning to the Failed Donation Page
300
 *
301 42
 * @since  1.0
302 42
 * @since  1.8.16 Add security check
303 42
 *
304 42
 * @return bool
305 42
 */
306
function give_listen_for_failed_payments() {
307
308 42
	$failed_page = give_get_option( 'failure_page', 0 );
309
	$payment_id  = ! empty( $_GET['payment-id'] ) ? absint( $_GET['payment-id'] ) : 0;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
310 42
	$nonce       = ! empty( $_GET['_wpnonce'] ) ? give_clean( $_GET['_wpnonce'] ) : false;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
311
312 42
	// Bailout.
313 42
	if ( ! $failed_page || ! is_page( $failed_page ) || ! $payment_id || ! $nonce ) {
314
		return false;
315
	}
316
317
	// Security check.
318
	if ( ! wp_verify_nonce( $nonce, "give-failed-donation-{$payment_id}" ) ) {
319
		wp_die( __( 'Nonce verification failed.', 'give' ), __( 'Error', 'give' ) );
320
	}
321
322
	// Set payment status to failure
323
	give_update_payment_status( $payment_id, 'failed' );
324
}
325
326
add_action( 'template_redirect', 'give_listen_for_failed_payments' );
327 42
328 42
/**
329
 * Retrieve the Donation History page URI
330 42
 *
331
 * @access      public
332
 * @since       1.7
333
 *
334
 * @return      string
335
 */
336 View Code Duplication
function give_get_history_page_uri() {
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...
337
	$give_options = give_get_settings();
338
339
	$history_page = isset( $give_options['history_page'] ) ? get_permalink( absint( $give_options['history_page'] ) ) : get_bloginfo( 'url' );
340
341
	return apply_filters( 'give_get_history_page_uri', $history_page );
342
}
343
344 18
/**
345 18
 * Check if a field is required
346
 *
347 18
 * @param string $field
348
 * @param int    $form_id
349
 *
350
 * @access      public
351
 * @since       1.0
352
 * @return      bool
353
 */
354
function give_field_is_required( $field = '', $form_id ) {
355
356
	$required_fields = give_get_required_fields( $form_id );
357
358
	return array_key_exists( $field, $required_fields );
359
}
360
361 42
/**
362
 * Record Donation In Log
363 42
 *
364
 * Stores log information for a donation.
365
 *
366
 * @since 1.0
367
 * @global            $give_logs Give_Logging
368
 *
369
 * @param int         $give_form_id Give Form ID.
370
 * @param int         $payment_id   Payment ID.
371
 * @param bool|int    $price_id     Price ID, if any.
372
 * @param string|null $donation_date    The date of the donation.
373
 *
374
 * @return void
375
 */
376
function give_record_donation_in_log( $give_form_id = 0, $payment_id, $price_id = false, $donation_date = null ) {
377 18
	global $give_logs;
378
379 18
	$log_data = array(
380
		'post_parent'   => $give_form_id,
381
		'log_type'      => 'sale',
382
		'post_date'     => isset( $donation_date ) ? $donation_date : null,
383
		'post_date_gmt' => isset( $donation_date ) ? $donation_date : null,
384
	);
385
386
	$log_meta = array(
387
		'payment_id' => $payment_id,
388
		'price_id'   => (int) $price_id,
389
	);
390
391
	$give_logs->insert_log( $log_data, $log_meta );
392
}
393 42
394
395 42
/**
396
 * Increases the donation total count of a donation form.
397
 *
398
 * @since 1.0
399
 *
400
 * @param int $form_id  Give Form ID
401
 * @param int $quantity Quantity to increase donation count by
402
 *
403
 * @return bool|int
404
 */
405
function give_increase_donation_count( $form_id = 0, $quantity = 1 ) {
406
	$quantity = (int) $quantity;
407
	$form     = new Give_Donate_Form( $form_id );
0 ignored issues
show
Documentation introduced by
$form_id is of type integer, but the function expects a boolean.

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...
408
409 42
	return $form->increase_sales( $quantity );
410
}
411 42
412
/**
413
 * Decreases the sale count of a form. Primarily for when a donation is refunded.
414
 *
415
 * @since 1.0
416
 *
417
 * @param int $form_id  Give Form ID
418
 * @param int $quantity Quantity to increase donation count by
419
 *
420
 * @return bool|int
421
 */
422
function give_decrease_donation_count( $form_id = 0, $quantity = 1 ) {
423
	$quantity = (int) $quantity;
424
	$form     = new Give_Donate_Form( $form_id );
0 ignored issues
show
Documentation introduced by
$form_id is of type integer, but the function expects a boolean.

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...
425 11
426 11
	return $form->decrease_sales( $quantity );
427
}
428 11
429
/**
430 11
 * Increases the total earnings of a form.
431
 *
432 11
 * @since 1.0
433
 *
434
 * @param int $give_form_id Give Form ID
435
 * @param int $amount       Earnings
436 11
 *
437
 * @return bool|int
438
 */
439
function give_increase_earnings( $give_form_id = 0, $amount ) {
440
	$form = new Give_Donate_Form( $give_form_id );
0 ignored issues
show
Documentation introduced by
$give_form_id is of type integer, but the function expects a boolean.

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...
441
442
	return $form->increase_earnings( $amount );
443
}
444
445
/**
446
 * Decreases the total earnings of a form. Primarily for when a donation is refunded.
447
 *
448
 * @since 1.0
449
 *
450 11
 * @param int $form_id Give Form ID
451 11
 * @param int $amount  Earnings
452
 *
453 11
 * @return bool|int
454
 */
455 11
function give_decrease_earnings( $form_id = 0, $amount ) {
456
	$form = new Give_Donate_Form( $form_id );
0 ignored issues
show
Documentation introduced by
$form_id is of type integer, but the function expects a boolean.

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...
457 11
458
	return $form->decrease_earnings( $amount );
459
}
460
461 11
462
/**
463
 * Returns the total earnings for a form.
464
 *
465
 * @since 1.0
466
 *
467
 * @param int $form_id Give Form ID
468
 *
469
 * @return int $earnings Earnings for a certain form
470
 */
471
function give_get_form_earnings_stats( $form_id = 0 ) {
472
	$give_form = new Give_Donate_Form( $form_id );
0 ignored issues
show
Documentation introduced by
$form_id is of type integer, but the function expects a boolean.

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...
473
474
	return $give_form->earnings;
475
}
476
477
478
/**
479
 * Return the sales number for a form.
480 34
 *
481 34
 * @since 1.0
482
 *
483 34
 * @param int $give_form_id Give Form ID
484
 *
485 34
 * @return int $sales Amount of sales for a certain form
486
 */
487 34
function give_get_form_sales_stats( $give_form_id = 0 ) {
488 34
	$give_form = new Give_Donate_Form( $give_form_id );
0 ignored issues
show
Documentation introduced by
$give_form_id is of type integer, but the function expects a boolean.

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...
489 34
490
	return $give_form->sales;
491 34
}
492
493 34
494
/**
495
 * Retrieves the average monthly sales for a specific donation form
496 34
 *
497
 * @since 1.0
498
 *
499
 * @param int $form_id Form ID
500
 *
501
 * @return float $sales Average monthly sales
502
 */
503 View Code Duplication
function give_get_average_monthly_form_sales( $form_id = 0 ) {
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...
504
	$sales        = give_get_form_sales_stats( $form_id );
505
	$release_date = get_post_field( 'post_date', $form_id );
506
507
	$diff = abs( current_time( 'timestamp' ) - strtotime( $release_date ) );
508
509
	$months = floor( $diff / ( 30 * 60 * 60 * 24 ) ); // Number of months since publication
510
511
	if ( $months > 0 ) {
512
		$sales = ( $sales / $months );
513
	}
514
515
	return $sales;
516
}
517
518
519
/**
520
 * Retrieves the average monthly earnings for a specific form
521
 *
522
 * @since 1.0
523
 *
524
 * @param int $form_id Form ID
525
 *
526
 * @return float $earnings Average monthly earnings
527
 */
528 View Code Duplication
function give_get_average_monthly_form_earnings( $form_id = 0 ) {
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...
529
	$earnings     = give_get_form_earnings_stats( $form_id );
530
	$release_date = get_post_field( 'post_date', $form_id );
531
532
	$diff = abs( current_time( 'timestamp' ) - strtotime( $release_date ) );
533
534
	$months = floor( $diff / ( 30 * 60 * 60 * 24 ) ); // Number of months since publication
535
536
	if ( $months > 0 ) {
537
		$earnings = ( $earnings / $months );
538
	}
539
540
	return $earnings < 0 ? 0 : $earnings;
541
}
542
543
544
/**
545
 * Get Price Option Name (Text)
546
 *
547
 * Retrieves the name of a variable price option.
548
 *
549
 * @since       1.0
550
 *
551
 * @param int $form_id    ID of the donation form.
552
 * @param int $price_id   ID of the price option.
553
 * @param int $payment_id payment ID for use in filters ( optional ).
554
 *
555
 * @return string $price_name Name of the price option
556
 */
557
function give_get_price_option_name( $form_id = 0, $price_id = 0, $payment_id = 0 ) {
558
559
	$prices     = give_get_variable_prices( $form_id );
560
	$price_name = '';
561
562
	foreach ( $prices as $price ) {
0 ignored issues
show
Bug introduced by
The expression $prices of type false|array is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
563
564
		if ( intval( $price['_give_id']['level_id'] ) == intval( $price_id ) ) {
565
566
			$price_text     = isset( $price['_give_text'] ) ? $price['_give_text'] : '';
567
			$price_fallback = give_currency_filter( give_format_amount( $price['_give_amount'], array( 'sanitize' => false ) ), '', true );
568
			$price_name     = ! empty( $price_text ) ? $price_text : $price_fallback;
569
570
		}
571
	}
572
573
	return apply_filters( 'give_get_price_option_name', $price_name, $form_id, $payment_id, $price_id );
574
}
575
576
577
/**
578
 * Retrieves a price from from low to high of a variable priced form
579
 *
580
 * @since 1.0
581
 *
582
 * @param int  $form_id   ID of the form
583
 * @param bool $formatted Flag to decide which type of price range string return
584
 *
585
 * @return string $range A fully formatted price range
586
 */
587
function give_price_range( $form_id = 0, $formatted = true ) {
588
	$low        = give_get_lowest_price_option( $form_id );
589
	$high       = give_get_highest_price_option( $form_id );
590
	$order_type = ! empty( $_REQUEST['order'] ) ? $_REQUEST['order'] : 'asc';
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_REQUEST
Loading history...
591
592
	$range = sprintf(
593
		'<span class="give_price_range_%1$s">%2$s</span><span class="give_price_range_sep">&nbsp;&ndash;&nbsp;</span><span class="give_price_range_%3$s">%4$s</span>',
594
		'asc' === $order_type ? 'low' : 'high',
595
		'asc' === $order_type ? give_currency_filter( give_format_amount( $low, array( 'sanitize' => false ) ) ) : give_currency_filter( give_format_amount( $high, array( 'sanitize' => false ) ) ),
596
		'asc' === $order_type ? 'high' : 'low',
597
		'asc' === $order_type ? give_currency_filter( give_format_amount( $high, array( 'sanitize' => false ) ) ) : give_currency_filter( give_format_amount( $low, array( 'sanitize' => false ) ) )
598
0 ignored issues
show
Coding Style introduced by
There should be no empty lines in a multi-line function call.
Loading history...
599
	);
600
601
	if( ! $formatted ) {
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...
602
		$range = wp_strip_all_tags( $range );
603
	}
604
605
	return apply_filters( 'give_price_range', $range, $form_id, $low, $high );
606
}
607
608
609
/**
610
 * Get Lowest Price ID
611
 *
612
 * Retrieves the ID for the cheapest price option of a variable donation form
613
 *
614
 * @since 1.5
615
 *
616
 * @param int $form_id ID of the donation
617
 *
618
 * @return int ID of the lowest price
619
 */
620
function give_get_lowest_price_id( $form_id = 0 ) {
621
622
	if ( empty( $form_id ) ) {
623
		$form_id = get_the_ID();
624
	}
625
626
	if ( ! give_has_variable_prices( $form_id ) ) {
627
		return give_get_form_price( $form_id );
628
	}
629
630
	$prices = give_get_variable_prices( $form_id );
631
632
	$min = $min_id = 0;
633
634
	if ( ! empty( $prices ) ) {
635
636
		foreach ( $prices as $key => $price ) {
637
638
			if ( empty( $price['_give_amount'] ) ) {
639
				continue;
640
			}
641
642
			if ( ! isset( $min ) ) {
643
				$min = $price['_give_amount'];
644
			} else {
645
				$min = min( $min, $price['_give_amount'] );
646
			}
647
648
			if ( $price['_give_amount'] == $min ) {
649
				$min_id = $price['_give_id']['level_id'];
650
			}
651
		}
652
	}
653
654
	return (int) $min_id;
655
}
656
657
/**
658
 * Retrieves cheapest price option of a variable priced form
659
 *
660
 * @since 1.0
661
 *
662
 * @param int $form_id ID of the form
663
 *
664
 * @return float Amount of the lowest price
665
 */
666 View Code Duplication
function give_get_lowest_price_option( $form_id = 0 ) {
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...
667
	if ( empty( $form_id ) ) {
668
		$form_id = get_the_ID();
669
	}
670
671
	if ( ! give_has_variable_prices( $form_id ) ) {
672
		return give_get_form_price( $form_id );
673
	}
674 12
675
	if ( ! ( $low = get_post_meta( $form_id, '_give_levels_minimum_amount', true ) ) ) {
676
		// Backward compatibility.
677
		$prices = wp_list_pluck( give_get_variable_prices( $form_id ), '_give_amount' );
678 12
		$low    = ! empty( $prices ) ? min( $prices ) : 0;
679
	}
680 12
681
	return give_maybe_sanitize_amount( $low );
682
}
683
684
/**
685
 * Retrieves most expensive price option of a variable priced form
686
 *
687
 * @since 1.0
688
 *
689
 * @param int $form_id ID of the form
690
 *
691
 * @return float Amount of the highest price
692
 */
693 View Code Duplication
function give_get_highest_price_option( $form_id = 0 ) {
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...
694 1
695
	if ( empty( $form_id ) ) {
696
		$form_id = get_the_ID();
697
	}
698 1
699
	if ( ! give_has_variable_prices( $form_id ) ) {
700 1
		return give_get_form_price( $form_id );
701
	}
702
703
	if ( ! ( $high = get_post_meta( $form_id, '_give_levels_maximum_amount', true ) ) ) {
704
		// Backward compatibility.
705
		$prices = wp_list_pluck( give_get_variable_prices( $form_id ), '_give_amount' );
706
		$high   = ! empty( $prices ) ? max( $prices ) : 0;
707
	}
708
709
	return give_maybe_sanitize_amount( $high );
710
}
711
712
/**
713
 * Returns the price of a form, but only for non-variable priced forms.
714
 *
715
 * @since 1.0
716
 *
717
 * @param int $form_id ID number of the form to retrieve a price for
718
 *
719
 * @return mixed string|int Price of the form
720
 */
721
function give_get_form_price( $form_id = 0 ) {
722
723
	if ( empty( $form_id ) ) {
724
		return false;
725
	}
726
727
	$form = new Give_Donate_Form( $form_id );
0 ignored issues
show
Documentation introduced by
$form_id is of type integer, but the function expects a boolean.

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...
728
729
	return $form->__get( 'price' );
730
}
731
732
/**
733
 * Returns the minimum price amount of a form, only enforced for the custom amount input.
734
 *
735
 * @since 1.3.6
736
 *
737
 * @param int $form_id ID number of the form to retrieve the minimum price for
738
 *
739
 * @return mixed string|int Minimum price of the form
740
 */
741
function give_get_form_minimum_price( $form_id = 0 ) {
742
743
	if ( empty( $form_id ) ) {
744
		return false;
745
	}
746
747
	$form = new Give_Donate_Form( $form_id );
0 ignored issues
show
Documentation introduced by
$form_id is of type integer, but the function expects a boolean.

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...
748
749
	return $form->__get( 'minimum_price' );
750
751
}
752
753
/**
754
 * Displays a formatted price for a donation form
755
 *
756
 * @since 1.0
757
 *
758
 * @param int      $form_id  ID of the form price to show
759
 * @param bool     $echo     Whether to echo or return the results
760
 * @param bool|int $price_id Optional price id for variable pricing
761
 *
762
 * @return int $formatted_price
763
 */
764
function give_price( $form_id = 0, $echo = true, $price_id = false ) {
765
	$price = 0;
766
767
	if ( empty( $form_id ) ) {
768
		$form_id = get_the_ID();
769
	}
770
771
	if ( give_has_variable_prices( $form_id ) ) {
772
773
		$prices = give_get_variable_prices( $form_id );
774
775 11
		if ( false !== $price_id ) {
776
777 11
			// loop through multi-prices to see which is default
778 View Code Duplication
			foreach ( $prices as $price ) {
0 ignored issues
show
Bug introduced by
The expression $prices of type false|array is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
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...
779 11
				// this is the default price
780 11
				if ( isset( $price['_give_default'] ) && $price['_give_default'] === 'default' ) {
0 ignored issues
show
introduced by
Found "=== '". Use Yoda Condition checks, you must
Loading history...
781 11
					$price = (float) $price['_give_amount'];
782 11
				};
783 11
			}
784
		} else {
785 11
786
			$price = give_get_lowest_price_option( $form_id );
787
		}
788
	} else {
789
790
		$price = give_get_form_price( $form_id );
791
	}
792
793
	$price           = apply_filters( 'give_form_price', give_maybe_sanitize_amount( $price ), $form_id );
794
	$formatted_price = '<span class="give_price" id="give_price_' . $form_id . '">' . $price . '</span>';
795
	$formatted_price = apply_filters( 'give_form_price_after_html', $formatted_price, $form_id, $price );
796
797
	if ( $echo ) {
798
		echo $formatted_price;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$formatted_price'
Loading history...
799
	} else {
800
		return $formatted_price;
801
	}
802
}
803
804
add_filter( 'give_form_price', 'give_format_amount', 10 );
805
add_filter( 'give_form_price', 'give_currency_filter', 20 );
806
807
808
/**
809
 * Retrieves the amount of a variable price option
810
 *
811
 * @since 1.0
812
 *
813
 * @param int $form_id  ID of the form
814
 * @param int $price_id ID of the price option
815
 *
816
 * @return float $amount Amount of the price option
817
 */
818
function give_get_price_option_amount( $form_id = 0, $price_id = 0 ) {
819
	$prices = give_get_variable_prices( $form_id );
820
821
	$amount = 0.00;
822
823 View Code Duplication
	foreach ( $prices as $price ) {
0 ignored issues
show
Bug introduced by
The expression $prices of type false|array is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
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...
824
		if ( isset( $price['_give_id']['level_id'] ) && $price['_give_id']['level_id'] == $price_id ) {
825
			$amount = isset( $price['_give_amount'] ) ? $price['_give_amount'] : 0.00;
826
			break;
827
		};
828
	}
829
830
	return apply_filters( 'give_get_price_option_amount', give_maybe_sanitize_amount( $amount ), $form_id, $price_id );
831
}
832
833
/**
834
 * Returns the goal of a form
835
 *
836
 * @since 1.0
837
 *
838
 * @param int $form_id ID number of the form to retrieve a goal for
839
 *
840
 * @return mixed string|int Goal of the form
841
 */
842
function give_get_form_goal( $form_id = 0 ) {
843
844
	if ( empty( $form_id ) ) {
845
		return false;
846
	}
847
848
	$form = new Give_Donate_Form( $form_id );
0 ignored issues
show
Documentation introduced by
$form_id is of type integer, but the function expects a boolean.

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...
849
850
	return $form->goal;
851 1
852
}
853 1
854
/**
855 1
 * Display/Return a formatted goal for a donation form
856
 *
857
 * @since 1.0
858
 *
859
 * @param int  $form_id ID of the form price to show
860
 * @param bool $echo    Whether to echo or return the results
861
 *
862
 * @return string $formatted_goal
863
 */
864
function give_goal( $form_id = 0, $echo = true ) {
865
866
	if ( empty( $form_id ) ) {
867
		$form_id = get_the_ID();
868
	}
869 1
870
	$goal = give_get_form_goal( $form_id );
871 1
872
	$goal           = apply_filters( 'give_form_goal', give_maybe_sanitize_amount( $goal ), $form_id );
0 ignored issues
show
Security Bug introduced by
It seems like $goal can also be of type false; however, give_maybe_sanitize_amount() does only seem to accept integer|double|string, did you maybe forget to handle an error condition?
Loading history...
873
	$formatted_goal = '<span class="give_price" id="give_price_' . $form_id . '">' . $goal . '</span>';
874
	$formatted_goal = apply_filters( 'give_form_price_after_html', $formatted_goal, $form_id, $goal );
875
876
	if ( $echo ) {
877
		echo $formatted_goal;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$formatted_goal'
Loading history...
878
	} else {
879
		return $formatted_goal;
880
	}
881
}
882
883
add_filter( 'give_form_goal', 'give_format_amount', 10 );
884
add_filter( 'give_form_goal', 'give_currency_filter', 20 );
885
886
887
/**
888
 * Checks if users can only donate when logged in
889
 *
890
 * @since  1.0
891
 *
892
 * @param  int $form_id Give form ID
893
 *
894
 * @return bool  $ret Whether or not the logged_in_only setting is set
895
 */
896
function give_logged_in_only( $form_id ) {
897
	// If _give_logged_in_only is set to enable then guest can donate from that specific form.
898
	// Otherwise it is member only donation form.
899
	$val = give_get_meta( $form_id, '_give_logged_in_only', true );
900
	$val = ! empty( $val ) ? $val : 'enabled';
901
902
	$ret = ! give_is_setting_enabled( $val );
903
904
	return (bool) apply_filters( 'give_logged_in_only', $ret, $form_id );
905
}
906
907
908
/**
909
 * Checks the option for the "Register / Login Option"
910
 *
911
 * @since 1.4.1
912
 *
913
 * @param int $form_id
914
 *
915
 * @return string
916
 */
917
function give_show_login_register_option( $form_id ) {
918
919
	$show_register_form = give_get_meta( $form_id, '_give_show_register_form', true );
920
921
	return apply_filters( 'give_show_register_form', $show_register_form, $form_id );
922
923
}
924
925
926
/**
927
 * Get pre fill form field values.
928
 *
929
 * Note: this function will extract form field values from give_purchase session data.
930
 *
931
 * @since  1.8
932
 *
933
 * @param  int $form_id Form ID.
934
 *
935
 * @return array
936
 */
937
function _give_get_prefill_form_field_values( $form_id ) {
938
	$logged_in_donor_info = array();
939
940
	if ( is_user_logged_in() ) :
941
		$donor_data    = get_userdata( get_current_user_id() );
942
		$donor_address = get_user_meta( get_current_user_id(), '_give_user_address', true );
0 ignored issues
show
introduced by
get_user_meta() usage is highly discouraged, check VIP documentation on "Working with wp_users"
Loading history...
943
944
		$logged_in_donor_info = array(
945
			// First name.
946
			'give_first'      => $donor_data->first_name,
947
948
			// Last name.
949
			'give_last'       => $donor_data->last_name,
950
951
			// Email.
952
			'give_email'      => $donor_data->user_email,
953
954
			// Street address 1.
955
			'card_address'    => ( ! empty( $donor_address['line1'] ) ? $donor_address['line1'] : '' ),
956
957
			// Street address 2.
958
			'card_address_2'  => ( ! empty( $donor_address['line2'] ) ? $donor_address['line2'] : '' ),
959
960
			// Country.
961
			'billing_country' => ( ! empty( $donor_address['country'] ) ? $donor_address['country'] : '' ),
962
963
			// State.
964
			'card_state'      => ( ! empty( $donor_address['state'] ) ? $donor_address['state'] : '' ),
965
966
			// City.
967
			'card_city'       => ( ! empty( $donor_address['city'] ) ? $donor_address['city'] : '' ),
968
969
			// Zipcode
970
			'card_zip'        => ( ! empty( $donor_address['zip'] ) ? $donor_address['zip'] : '' ),
971
		);
972
	endif;
973
974
	// Bailout: Auto fill form field values only form form which donor is donating.
975
	if (
976
		empty( $_GET['form-id'] )
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
977
		|| ! $form_id
978
		|| ( $form_id !== absint( $_GET['form-id'] ) )
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
979
	) {
980
		return $logged_in_donor_info;
981
	}
982
983
	// Get purchase data.
984
	$give_purchase_data = Give()->session->get( 'give_purchase' );
985
986
	// Get donor info from form data.
987
	$give_donor_info_in_session = empty( $give_purchase_data['post_data'] )
988
		? array()
989
		: $give_purchase_data['post_data'];
990
991
	// Output.
992
	return wp_parse_args( $give_donor_info_in_session, $logged_in_donor_info );
993
}
994