Test Failed
Push — issues/1132 ( 767af6...ce98cf )
by Ravinder
05:25
created

formatting.php ➔ give_format_amount()   C

Complexity

Conditions 11
Paths 52

Size

Total Lines 67
Code Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 11
eloc 40
nc 52
nop 2
dl 0
loc 67
rs 5.8904
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Formatting functions for taking care of proper number formats and such
4
 *
5
 * @package     Give
6
 * @subpackage  Functions/Formatting
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
/**
19
 * Get decimal count
20
 *
21
 * @since 1.6
22
 *
23
 * @return mixed
24
 */
25
function give_get_price_decimals() {
26
	return apply_filters( 'give_sanitize_amount_decimals', give_get_option( 'number_decimals', 0 ) );
27
}
28
29
/**
30
 * Get thousand separator
31
 *
32
 * @since 1.6
33
 *
34
 * @return mixed
35
 */
36
function give_get_price_thousand_separator() {
37
	$give_options       = give_get_settings();
38
	$thousand_separator = isset( $give_options['thousands_separator'] ) ? $give_options['thousands_separator'] : ',';
39
	$thousand_separator = empty( $thousand_separator ) ? ' ' : $thousand_separator;
40
41
	return $thousand_separator;
42
}
43
44
/**
45
 * Get decimal separator
46
 *
47
 * @since 1.6
48
 *
49
 * @return mixed
50
 */
51
function give_get_price_decimal_separator() {
52
	$default_decimal_separators = array(
53
		'.' => ',',
54
		',' => '.',
55
	);
56
57
	$thousand_separator = give_get_price_thousand_separator();
58
	$default_decimal_separator = in_array( $thousand_separator, $default_decimal_separators ) ?
59
		$default_decimal_separators[$thousand_separator] :
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
60
		'.';
61
62
	$decimal_separator = give_get_option( 'decimal_separator', $default_decimal_separator );
63
64
	return $decimal_separator;
65
}
66
67
68
/**
69
 * Sanitize Amount before saving to database
70
 *
71
 * @since      1.8.12
72
 *
73
 * @param  int|float|string $number Expects either a float or a string with a decimal separator only (no thousands)
74
 *
75
 * @return string $amount Newly sanitized amount
76
 */
77
function give_sanitize_amount_for_db( $number ) {
78
	return give_sanitize_amount( $number, 6 );
79
}
80
81
/**
82
 * Sanitize Amount before saving to database
83
 *
84
 * @since      1.8.12
85
 *
86
 * @param  int|float|string $number     Expects either a float or a string with a decimal separator only (no thousands)
87
 * @param  int|bool         $dp         Number of decimals
88
 * @param  bool             $trim_zeros From end of string
89
 *
90
 * @return string $amount Newly sanitized amount
91
 */
92
function give_maybe_sanitize_amount( $number, $dp = false, $trim_zeros = false ) {
93
	$thousand_separator = give_get_price_thousand_separator();
94
	$decimal_separator  = give_get_price_decimal_separator();
95
96
	// Bailout.
97
	if( empty( $number ) || ( ! is_numeric( $number ) && ! is_string( $number ) ) ) {
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...
98
		return $number;
99
	}elseif (
100
		( false == strpos( $number, $thousand_separator ) ) &&
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing strpos($number, $thousand_separator) of type integer to the boolean false. If you are specifically checking for 0, consider using something more explicit like === 0 instead.
Loading history...
101
		( false === strpos( $number, $decimal_separator ) )
102
	) {
103
		return number_format( $number, ( is_bool( $dp ) ? give_get_price_decimals() : $dp ), '.', '' );
104
	}
105
106
	// Handle thousand separator as '.'
107
	// Handle sanitize database values.
108
	$number_parts = explode( '.', $number );
109
	$is_db_sanitize_val = ( 2 === count( $number_parts ) && ( 6 === strlen( $number_parts[1] ) ) );
110
111
	if( $is_db_sanitize_val ) {
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...
112
		// Sanitize database value.
113
		return number_format( $number, ( is_bool( $dp ) ? give_get_price_decimals() : $dp ), '.', '' );
114
115
	} elseif (
116
		'.' === $thousand_separator &&
117
		false !== strpos( $number, $thousand_separator )
118
	){
119
		// Fix point thousand separator value.
120
		if( ! $is_db_sanitize_val ) {
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...
121
			$number = str_replace( '.', '', $number );
122
		}
123
	}
124
125
	return give_sanitize_amount( $number, $dp, $trim_zeros );
126
}
127
128
/**
129
 * Sanitize Amount
130
 *
131
 * Returns a sanitized amount by stripping out thousands separators.
132
 *
133
 * @since      1.0
134
 *
135
 * @param  int|float|string $number     Expects either a float or a string with a decimal separator only (no thousands)
136
 * @param  int|bool         $dp         Number of decimals
137
 * @param  bool             $trim_zeros From end of string
138
 *
139
 * @return string $amount Newly sanitized amount
140
 */
141
function give_sanitize_amount( $number, $dp = false, $trim_zeros = false ) {
142
143
	// Bailout.
144
	if ( empty( $number ) || ( ! is_numeric( $number ) && ! is_string( $number ) ) ) {
145
		return $number;
146
	}
147
148
	// Remove slash from amount.
149
	// If thousand or decimal separator is set to ' then in $_POST or $_GET param we will get an escaped number.
150
	// To prevent notices and warning remove slash from amount/number.
151
	$number = wp_unslash( $number );
152
153
	$thousand_separator = give_get_price_thousand_separator();
154
155
	$locale   = localeconv();
156
	$decimals = array( give_get_price_decimal_separator(), $locale['decimal_point'], $locale['mon_decimal_point'] );
157
158
	// Remove locale from string
159
	if ( ! is_float( $number ) ) {
160
		$number = str_replace( $decimals, '.', $number );
161
	}
162
163
	// Remove thousand amount formatting if amount has.
164
	// This condition use to add backward compatibility to version before 1.6, because before version 1.6 we were saving formatted amount to db.
165
	// Do not replace thousand separator from price if it is same as decimal separator, because it will be already replace by above code.
166
	if ( ! in_array( $thousand_separator, $decimals ) && ( false !== strpos( $number, $thousand_separator ) ) ) {
167
		$number = str_replace( $thousand_separator, '', $number );
168
	} elseif ( in_array( $thousand_separator, $decimals ) ) {
169
		$number = preg_replace( '/\.(?=.*\.)/', '', $number );
170
	}
171
172
	// Remove non numeric entity before decimal separator.
173
	$number     = preg_replace( '/[^0-9\.]/', '', $number );
174
	$default_dp = give_get_price_decimals();
175
176
	// Reset negative amount to zero.
177
	if ( 0 > $number ) {
178
		$number = number_format( 0, $default_dp, '.' );
179
	}
180
181
	// If number does not have decimal then add number of decimals to it.
182
	if (
183
		false === strpos( $number, '.' )
184
		|| ( $default_dp > strlen( substr( $number, strpos( $number, '.' ) + 1 ) ) )
185
	) {
186
		$number = number_format( $number, $default_dp, '.', '' );
187
	}
188
189
	// Format number by custom number of decimals.
190
	if ( false !== $dp ) {
191
		$dp     = intval( is_bool( $dp ) ? $default_dp : $dp );
192
		$dp     = apply_filters( 'give_sanitize_amount_decimals', $dp, $number );
193
		$number = number_format( floatval( $number ), $dp, '.', '' );
194
	}
195
196
	// Trim zeros.
197
	if ( $trim_zeros && strstr( $number, '.' ) ) {
198
		$number = rtrim( rtrim( $number, '0' ), '.' );
199
	}
200
201
	return apply_filters( 'give_sanitize_amount', $number );
202
}
203
204
/**
205
 * Returns a nicely formatted amount.
206
 *
207
 * @since 1.0
208
 *
209
 * @param string $amount   Price amount to format
210
 * @param array  $args     Array of arguments.
211
 *
212
 * @return string $amount   Newly formatted amount or Price Not Available
213
 */
214
function give_format_amount( $amount, $args = array() ) {
215
	// Backward compatibility.
216
	if( is_bool( $args ) ) {
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...
217
		$args = array( 'decimal' => $args );
218
	}
219
220
	$default_args = array(
221
		'decimal'  => true,
222
		'sanitize' => true,
223
		'currency' => give_get_currency(),
224
	);
225
226
	$args = wp_parse_args( $args, $default_args );
227
228
	$formatted     = 0;
229
	$thousands_sep = give_get_price_thousand_separator();
230
	$decimal_sep   = give_get_price_decimal_separator();
231
	$decimals      = ! empty( $args['decimal'] ) ? give_get_price_decimals() : 0;
232
	$currency      = $args['currency'];
233
234
	if ( ! empty( $amount ) ) {
235
		// Sanitize amount before formatting.
236
		$amount = ! empty( $args['sanitize'] ) ?
237
			give_maybe_sanitize_amount( $amount, $decimals ) :
238
			number_format( $amount, $decimals, '.', '' );
239
240
		switch ( $currency ) {
241
			case 'INR':
242
				$decimal_amount = '';
243
244
				// Extract decimals from amount
245
				if ( ( $pos = strpos( $amount, '.' ) ) !== false ) {
0 ignored issues
show
introduced by
Found "!== false". Use Yoda Condition checks, you must
Loading history...
246
					if ( ! empty( $decimals ) ) {
247
						$decimal_amount = substr( round( substr( $amount, $pos ), $decimals ), 1 );
248
						$amount         = substr( $amount, 0, $pos );
249
250
						if ( ! $decimal_amount ) {
251
							$decimal_amount = substr( '.0000000000', 0, ( $decimals + 1 ) );
252
						} elseif ( ( $decimals + 1 ) > strlen( $decimal_amount ) ) {
253
							$decimal_amount = substr( "{$decimal_amount}000000000", 0, ( $decimals + 1 ) );
254
						}
0 ignored issues
show
introduced by
Blank line found after control structure
Loading history...
255
256
					} else {
257
						$amount = number_format( $amount, $decimals, $decimal_sep, '' );
258
					}
259
				}
260
261
				// Extract last 3 from amount
262
				$result = substr( $amount, - 3 );
263
				$amount = substr( $amount, 0, - 3 );
264
265
				// Apply digits 2 by 2
266
				while ( strlen( $amount ) > 0 ) {
267
					$result = substr( $amount, - 2 ) . $thousands_sep . $result;
268
					$amount = substr( $amount, 0, - 2 );
269
				}
270
271
				$formatted = $result . $decimal_amount;
272
				break;
273
274
			default:
275
				$formatted = number_format( $amount, $decimals, $decimal_sep, $thousands_sep );
276
		}
277
	}
278
279
	return apply_filters( 'give_format_amount', $formatted, $amount, $decimals, $decimal_sep, $thousands_sep, $currency, $args );
280
}
281
282
283
/**
284
 * Get human readable amount.
285
 *
286
 * Note: This function only support large number formatting from million to trillion
287
 *
288
 * @since 1.6
289
 *
290
 * @use   give_get_price_thousand_separator Get thousand separator.
291
 *
292
 * @param string $amount formatted amount number.
293
 * @param array  $args   Array of arguments.
294
 *
295
 * @return float|string  formatted amount number with large number names.
296
 */
297
function give_human_format_large_amount( $amount, $args = array() ) {
298
	$default_args = array(
299
		'currency' => give_get_currency(),
300
	);
301
302
	$args = wp_parse_args( $args, $default_args );
303
304
	// Get thousand separator.
305
	$thousands_sep = give_get_price_thousand_separator();
306
307
	// Sanitize amount.
308
	$sanitize_amount = give_maybe_sanitize_amount( $amount );
309
310
	// Explode amount to calculate name of large numbers.
311
	$amount_array = explode( $thousands_sep, $amount );
312
313
	// Calculate amount parts count.
314
	$amount_count_parts = count( $amount_array );
315
316
	// Human format amount (default).
317
	$human_format_amount = $amount;
318
319
	switch ( $args['currency'] ) {
320 View Code Duplication
		case 'INR':
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...
321
			// Calculate large number formatted amount.
322
			if ( 4 < $amount_count_parts ) {
323
				$human_format_amount = sprintf( esc_html__( '%s arab', 'give' ), round( ( $sanitize_amount / 1000000000 ), 2 ) );
324
			} elseif ( 3 < $amount_count_parts ) {
325
				$human_format_amount = sprintf( esc_html__( '%s crore', 'give' ), round( ( $sanitize_amount / 10000000 ), 2 ) );
326
			} elseif ( 2 < $amount_count_parts ) {
327
				$human_format_amount = sprintf( esc_html__( '%s lakh', 'give' ), round( ( $sanitize_amount / 100000 ), 2 ) );
328
			}
329
			break;
330 View Code Duplication
		default:
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...
331
			// Calculate large number formatted amount.
332
			if ( 4 < $amount_count_parts ) {
333
				$human_format_amount = sprintf( esc_html__( '%s trillion', 'give' ), round( ( $sanitize_amount / 1000000000000 ), 2 ) );
334
			} elseif ( 3 < $amount_count_parts ) {
335
				$human_format_amount = sprintf( esc_html__( '%s billion', 'give' ), round( ( $sanitize_amount / 1000000000 ), 2 ) );
336
			} elseif ( 2 < $amount_count_parts ) {
337
				$human_format_amount = sprintf( esc_html__( '%s million', 'give' ), round( ( $sanitize_amount / 1000000 ), 2 ) );
338
			}
339
	}
340
341
	return apply_filters( 'give_human_format_large_amount', $human_format_amount, $amount, $sanitize_amount );
342
}
343
344
/**
345
 * Returns a nicely formatted amount with custom decimal separator.
346
 *
347
 * @since 1.0
348
 *
349
 * @param int|float|string $amount   Formatted or sanitized price
350
 * @param int|bool         $dp       number of decimals
351
 * @param bool             $sanitize Whether or not sanitize number
352
 *
353
 * @return string $amount Newly formatted amount or Price Not Available
354
 */
355
function give_format_decimal( $amount, $dp = false, $sanitize = true ) {
356
	$decimal_separator = give_get_price_decimal_separator();
357
	$formatted_amount  = $sanitize ?
358
		give_maybe_sanitize_amount( $amount, $dp ) :
359
		number_format( $amount, ( is_bool( $dp ) ? give_get_price_decimals() : $dp ), '.', '' );
360
361
	if ( false !== strpos( $formatted_amount, '.' ) ) {
362
		$formatted_amount = str_replace( '.', $decimal_separator, $formatted_amount );
363
	}
364
365
	return apply_filters( 'give_format_decimal', $formatted_amount, $amount, $decimal_separator );
366
}
367
368
/**
369
 * Formats the currency displayed.
370
 *
371
 * @since 1.0
372
 *
373
 * @param string $price The donation amount.
374
 * @param string $currency The currency code.
375
 * @param bool   $decode_currency Whether to decode the currency HTML format or not.
376
 *
377
 * @return mixed|string
378
 */
379
function give_currency_filter( $price = '', $currency = '', $decode_currency = false ) {
380
381
	if ( empty( $currency ) || ! array_key_exists( (string) $currency, give_get_currencies() ) ) {
382
		$currency = give_get_currency();
383
	}
384
385
	$position = give_get_option( 'currency_position', 'before' );
386
387
	$negative = $price < 0;
388
389
	if ( $negative ) {
390
		// Remove proceeding "-".
391
		$price = substr( $price, 1 );
392
	}
393
394
	$symbol = give_currency_symbol( $currency, $decode_currency );
395
396
	switch ( $currency ) :
397
		case 'GBP' :
398
		case 'BRL' :
399
		case 'EUR' :
400
		case 'USD' :
401
		case 'AUD' :
402
		case 'CAD' :
403
		case 'HKD' :
404
		case 'MXN' :
405
		case 'NZD' :
406
		case 'SGD' :
407
		case 'JPY' :
408
		case 'THB' :
409
		case 'INR' :
410
		case 'RIAL' :
411
		case 'TRY' :
412
		case 'RUB' :
413
		case 'SEK' :
414
		case 'PLN' :
415
		case 'PHP' :
416
		case 'TWD' :
417
		case 'MYR' :
418
		case 'CZK' :
419
		case 'DKK' :
420
		case 'HUF' :
421
		case 'ILS' :
422
		case 'MAD' :
423
		case 'KRW' :
424
		case 'ZAR' :
425
			$formatted = ( 'before' === $position ? $symbol . $price : $price . $symbol );
426
			break;
427 View Code Duplication
		case 'NOK' :
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...
428
			$formatted = ( 'before' === $position ? $symbol . ' ' . $price : $price . ' ' . $symbol );
429
			break;
430 View Code Duplication
		default :
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...
431
			$formatted = ( 'before' === $position ? $currency . ' ' . $price : $price . ' ' . $currency );
432
			break;
433
	endswitch;
434
435
	/**
436
	 * Filter formatted amount with currency
437
	 *
438
	 * Filter name depends upon current value of currency and currency position.
439
	 * For example :
440
	 *           if currency is USD and currency position is before then
441
	 *           filter name will be give_usd_currency_filter_before
442
	 *
443
	 *           and if currency is USD and currency position is after then
444
	 *           filter name will be give_usd_currency_filter_after
445
	 */
446
	$formatted = apply_filters( 'give_' . strtolower( $currency ) . "_currency_filter_{$position}", $formatted, $currency, $price );
447
448
	if ( $negative ) {
449
		// Prepend the minus sign before the currency sign.
450
		$formatted = '-' . $formatted;
451
	}
452
453
	return $formatted;
454
}
455
456
/**
457
 * Set the number of decimal places per currency
458
 *
459
 * @since 1.0
460
 * @since 1.6 $decimals parameter removed from function params
461
 * *
462
 * @return int $decimals
463
 */
464
function give_currency_decimal_filter() {
465
466
	remove_filter( 'give_sanitize_amount_decimals', 'give_currency_decimal_filter' );
467
468
	// Set default number of decimals.
469
	$decimals = give_get_price_decimals();
470
471
	add_filter( 'give_sanitize_amount_decimals', 'give_currency_decimal_filter' );
472
473
	// Get number of decimals with backward compatibility ( version < 1.6 )
474
	if ( 1 <= func_num_args() ) {
475
		$decimals = ( false === func_get_arg( 0 ) ? $decimals : absint( func_get_arg( 0 ) ) );
476
	}
477
478
	$currency = give_get_currency();
479
480
	switch ( $currency ) {
481
		case 'RIAL' :
482
		case 'JPY' :
483
		case 'TWD' :
484
		case 'HUF' :
485
486
			$decimals = 0;
487
			break;
488
	}
489
490
	return apply_filters( 'give_currency_decimal_count', $decimals, $currency );
491
}
492
493
add_filter( 'give_sanitize_amount_decimals', 'give_currency_decimal_filter' );
494
add_filter( 'give_format_amount_decimals', 'give_currency_decimal_filter' );
495
496
497
/**
498
 * Get date format string on basis of given context.
499
 *
500
 * @since 1.7
501
 *
502
 * @param  string $date_context Date format context name.
503
 *
504
 * @return string                  Date format string
505
 */
506
function give_date_format( $date_context = '' ) {
507
	/**
508
	 * Filter the date context
509
	 *
510
	 * You can add your own date context or use already exist context.
511
	 * For example:
512
	 *    add_filter( 'give_date_format_contexts', 'add_new_date_contexts' );
513
	 *    function add_new_date_contexts( $date_format_contexts ) {
514
	 *        // You can add single context like this $date_format_contexts['checkout'] = 'F j, Y';
515
	 *        // Instead add multiple date context at once.
516
	 *        $new_date_format_contexts = array(
517
	 *            'checkout' => 'F j, Y',
518
	 *            'report'   => 'Y-m-d',
519
	 *            'email'    => 'm/d/Y',
520
	 *        );
521
	 *
522
	 *       // Merge date contexts array only if you are adding multiple date contexts at once otherwise return  $date_format_contexts.
523
	 *       return array_merge( $new_date_format_contexts, $date_format_contexts );
524
	 *
525
	 *    }
526
	 */
527
	$date_format_contexts = apply_filters( 'give_date_format_contexts', array() );
528
529
	// Set date format to default date format.
530
	$date_format = get_option( 'date_format' );
531
532
	// Update date format if we have non empty date format context array and non empty date format string for that context.
533
	if ( $date_context && ! empty( $date_format_contexts ) && array_key_exists( $date_context, $date_format_contexts ) ) {
534
		$date_format = ! empty( $date_format_contexts[ $date_context ] )
535
			? $date_format_contexts[ $date_context ]
536
			: $date_format;
537
	}
538
539
	return apply_filters( 'give_date_format', $date_format );
540
}
541
542
/**
543
 * Get cache key.
544
 *
545
 * @since  1.7
546
 * @deprecated 1.8.7 You can access this function from Give_Cache.
547
 *
548
 * @param  string $action Cache key prefix.
549
 * @param array  $query_args Query array.
550
 *
551
 * @return string
552
 */
553
function give_get_cache_key( $action, $query_args ) {
554
	return Give_Cache::get_key( $action, $query_args );
555
}
556
557
/**
558
 * Clean variables using sanitize_text_field. Arrays are cleaned recursively.
559
 * Non-scalar values are ignored.
560
 *
561
 * @since  1.8
562
 *
563
 * @param  string|array $var
564
 *
565
 * @return string|array
566
 */
567
function give_clean( $var ) {
568
	if ( is_array( $var ) ) {
569
		return array_map( 'give_clean', $var );
570
	} else {
571
		return is_scalar( $var ) ? sanitize_text_field( $var ) : $var;
572
	}
573
}
574
575
/**
576
 * Transforms php.ini notation for numbers (like '2M') to an integer.
577
 *
578
 * @since 1.8
579
 *
580
 * @param $size
581
 *
582
 * @return int
583
 */
584
function give_let_to_num( $size ) {
585
	$l   = substr( $size, - 1 );
586
	$ret = substr( $size, 0, - 1 );
587
	switch ( strtoupper( $l ) ) {
588
		case 'P':
589
			$ret *= 1024;
590
		case 'T':
591
			$ret *= 1024;
592
		case 'G':
593
			$ret *= 1024;
594
		case 'M':
595
			$ret *= 1024;
596
		case 'K':
597
			$ret *= 1024;
598
	}
599
600
	return $ret;
601
}
602
603
/**
604
 * Verify nonce.
605
 *
606
 * @since 1.8
607
 *
608
 * @param        $nonce
609
 * @param int   $action
610
 * @param array $wp_die_args
611
 */
612
function give_validate_nonce( $nonce, $action = - 1, $wp_die_args = array() ) {
613
614
	$default_wp_die_args = array(
615
		'message' => esc_html__( 'Nonce verification has failed.', 'give' ),
616
		'title'   => esc_html__( 'Error', 'give' ),
617
		'args'    => array(
618
			'response' => 403,
619
		),
620
	);
621
622
	$wp_die_args = wp_parse_args( $wp_die_args, $default_wp_die_args );
623
624
	if ( ! wp_verify_nonce( $nonce, $action ) ) {
625
		wp_die(
626
			$wp_die_args['message'],
627
			$wp_die_args['title'],
628
			$wp_die_args['args']
629
		);
630
	}
631
}
632
633
/**
634
 * Check variable and get default or valid value.
635
 *
636
 * Helper function to check if a variable is set, empty, etc.
637
 *
638
 * @since 1.8
639
 *
640
 * @param                   $variable
641
 * @param string (optional) $conditional    default value: isset
642
 * @param bool (optional)   $default        default value: false
643
 * @param string (optional) $array_key_name default value: false
644
 *
645
 * @return mixed
646
 */
647
function give_check_variable( $variable, $conditional = '', $default = false, $array_key_name = '' ) {
648
	// Get value from array if array key non empty.
649
	if( empty( $array_key_name ) ) {
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...
650
		switch ( $conditional ) {
651
			case 'isset_empty':
652
				$variable = ( isset( $variable ) && ! empty( $variable ) ) ? $variable : $default;
653
				break;
654
655
			case 'empty':
656
				$variable = ! empty( $variable ) ? $variable : $default;
657
				break;
658
659
			case 'null':
660
				$variable = ! is_null( $variable ) ? $variable : $default;
661
				break;
662
663
			default:
664
				$variable = isset( $variable ) ? $variable : $default;
665
		}
666
	} else {
667
		$isset = array_key_exists( $array_key_name, $variable );
668
669
		switch ( $conditional ) {
670
			case 'isset_empty':
671
				$variable = ( $isset && ! empty( $variable[ $array_key_name ] ) ) ? $variable[ $array_key_name ] : $default;
672
				break;
673
674
			case 'empty':
675
				$variable = ! empty( $variable[ $array_key_name ] ) ? $variable[ $array_key_name ] : $default;
676
				break;
677
678
			case 'null':
679
				$variable = $isset && ! is_null( $variable[ $array_key_name ] ) ? $variable[ $array_key_name ] : $default;
680
				break;
681
682
			default:
683
				$variable = $isset && isset( $variable[ $array_key_name ] ) ? $variable[ $array_key_name ] : $default;
684
		}
685
	}
686
687
	return $variable;
688
689
}
690