PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.9.3
GiveWP – Donation Plugin and Fundraising Platform v2.9.3
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / formatting.php
give / includes Last commit date
admin 5 years ago api 5 years ago database 6 years ago deprecated 5 years ago donors 5 years ago emails 6 years ago forms 5 years ago frontend 6 years ago gateways 5 years ago libraries 6 years ago payments 5 years ago actions.php 6 years ago ajax-functions.php 5 years ago class-give-async-process.php 6 years ago class-give-background-updater.php 6 years ago class-give-cache-setting.php 5 years ago class-give-cache.php 6 years ago class-give-cli-commands.php 6 years ago class-give-comment.php 6 years ago class-give-cron.php 6 years ago class-give-donate-form.php 6 years ago class-give-donor.php 6 years ago class-give-email-access.php 6 years ago class-give-license-handler.php 5 years ago class-give-logging.php 6 years ago class-give-readme-parser.php 6 years ago class-give-roles.php 6 years ago class-give-scripts.php 5 years ago class-give-session.php 5 years ago class-give-stats.php 6 years ago class-give-template-loader.php 6 years ago class-give-tooltips.php 6 years ago class-give-translation.php 6 years ago class-notices.php 5 years ago country-functions.php 5 years ago currencies-list.php 6 years ago currency-functions.php 6 years ago error-tracking.php 6 years ago filters.php 6 years ago formatting.php 6 years ago install.php 5 years ago login-register.php 6 years ago misc-functions.php 5 years ago plugin-compatibility.php 6 years ago post-types.php 5 years ago price-functions.php 6 years ago process-donation.php 5 years ago setting-functions.php 6 years ago shortcodes.php 6 years ago template-functions.php 6 years ago user-functions.php 6 years ago
formatting.php
866 lines
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, GiveWP
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.0
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Get Currency Formatting Settings for each donation.
19 *
20 * @param int|string $id_or_currency_code Donation ID or Currency code.
21 *
22 * @since 1.8.15
23 *
24 * @return mixed
25 */
26 function give_get_currency_formatting_settings( $id_or_currency_code = null ) {
27 $give_options = give_get_settings();
28 $setting = array();
29
30 if ( ! empty( $id_or_currency_code ) ) {
31 $currencies = give_get_currencies( 'all' );
32
33 // Set default formatting setting only if currency not set as global currency.
34 if (
35 is_string( $id_or_currency_code ) &&
36 ! empty( $give_options['currency'] ) &&
37 $id_or_currency_code !== $give_options['currency'] &&
38 array_key_exists( $id_or_currency_code, $currencies )
39 ) {
40 $setting = $currencies[ $id_or_currency_code ]['setting'];
41 } elseif ( is_numeric( $id_or_currency_code ) && 'give_payment' === get_post_type( $id_or_currency_code ) ) {
42 $currency = give_get_meta( $id_or_currency_code, '_give_payment_currency', true );
43
44 if (
45 ! empty( $currency ) &&
46 $give_options['currency'] !== $currency
47 ) {
48 $setting = $currencies[ $currency ]['setting'];
49 }
50 }
51 }
52
53 if ( empty( $setting ) ) {
54 // Set thousand separator.
55 $thousand_separator = isset( $give_options['thousands_separator'] ) ? $give_options['thousands_separator'] : ',';
56 $thousand_separator = empty( $thousand_separator ) ? ' ' : $thousand_separator;
57
58 // Set decimal separator.
59 $default_decimal_separators = array(
60 '.' => ',',
61 ',' => '.',
62 );
63
64 $default_decimal_separator = in_array( $thousand_separator, $default_decimal_separators ) ?
65 $default_decimal_separators[ $thousand_separator ] :
66 '.';
67
68 $decimal_separator = ! empty( $give_options['decimal_separator'] ) ? $give_options['decimal_separator'] : $default_decimal_separator;
69
70 $setting = array(
71 'currency_position' => give_get_option( 'currency_position', 'before' ),
72 'thousands_separator' => $thousand_separator,
73 'decimal_separator' => $decimal_separator,
74 'number_decimals' => give_get_option( 'number_decimals', 0 ),
75 );
76 }
77
78 /**
79 * Filter the currency formatting setting.
80 *
81 * @since 1.8.15
82 */
83 return apply_filters( 'give_get_currency_formatting_settings', $setting, $id_or_currency_code );
84 }
85
86 /**
87 * Get decimal count
88 *
89 * @since 1.6
90 *
91 * @param int|string $id_or_currency_code
92 *
93 * @return mixed
94 */
95 function give_get_price_decimals( $id_or_currency_code = null ) {
96 // Set currency on basis of donation id.
97 if ( empty( $id_or_currency_code ) ) {
98 $id_or_currency_code = give_get_currency();
99 }
100
101 $number_of_decimals = 0;
102
103 if ( ! give_is_zero_based_currency( $id_or_currency_code ) ) {
104 $setting = give_get_currency_formatting_settings( $id_or_currency_code );
105 $number_of_decimals = $setting['number_decimals'];
106 }
107
108 /**
109 * Filter the number of decimals
110 *
111 * @since 1.6
112 */
113 return apply_filters( 'give_sanitize_amount_decimals', $number_of_decimals, $id_or_currency_code );
114 }
115
116 /**
117 * Get thousand separator
118 *
119 * @param int|string $id_or_currency_code
120 *
121 * @since 1.6
122 *
123 * @return mixed
124 */
125 function give_get_price_thousand_separator( $id_or_currency_code = null ) {
126 $setting = give_get_currency_formatting_settings( $id_or_currency_code );
127
128 /**
129 * Filter the thousand separator
130 *
131 * @since 1.6
132 */
133 return apply_filters( 'give_get_price_thousand_separator', $setting['thousands_separator'], $id_or_currency_code );
134 }
135
136 /**
137 * Get decimal separator
138 *
139 * @param string $id_or_currency_code
140 *
141 * @since 1.6
142 *
143 * @return mixed
144 */
145 function give_get_price_decimal_separator( $id_or_currency_code = null ) {
146 $setting = give_get_currency_formatting_settings( $id_or_currency_code );
147
148 /**
149 * Filter the thousand separator
150 *
151 * @since 1.6
152 */
153 return apply_filters( 'give_get_price_decimal_separator', $setting['decimal_separator'], $id_or_currency_code );
154 }
155
156 /**
157 * Check if amount sanitized
158 * Note: only for internal purpose
159 *
160 * Current this function only check if number is DB sanitize.
161 *
162 * @param string $amount
163 *
164 * @return bool
165 * @since 2.4.5
166 */
167 function give_is_amount_sanitized( $amount ) {
168 $is_sanitize = false;
169
170 if ( false === strpos( $amount, '.' ) ) {
171 return $is_sanitize;
172 }
173
174 $number_parts = explode( '.', $amount );
175
176 // Handle thousand separator as '.'
177 // Handle sanitize database values.
178 $is_sanitize = ( 2 === count( $number_parts ) &&
179 is_numeric( $number_parts[0] ) &&
180 is_numeric( $number_parts[1] ) &&
181 in_array( strlen( $number_parts[1] ), array( 6, 10 ) ) );
182
183 return $is_sanitize;
184 }
185
186 /**
187 * Sanitize Amount before saving to database
188 *
189 * @since 1.8.12
190 *
191 * @param int|float|string $number Expects either a float or a string with a decimal separator only (no thousands)
192 * @param array|bool $args It accepts 'number_decimals', 'trim_zeros', 'currency'.
193 *
194 * @return string $amount Newly sanitized amount
195 */
196 function give_sanitize_amount_for_db( $number, $args = array() ) {
197 $args['number_decimals'] = 6;
198
199 if (
200 ( isset( $args['currency'] ) && 'BTC' === $args['currency'] )
201 || 'BTC' === give_get_currency()
202 ) {
203 $args['number_decimals'] = 10;
204 }
205
206 return give_maybe_sanitize_amount( $number, $args );
207 }
208
209 /**
210 * Sanitize Amount before saving to database
211 *
212 * @since 1.8.12
213 *
214 * @param int|float|string $number Expects either a float or a string with a decimal separator only (no thousands)
215 * @param array|bool $args It accepts 'number_decimals', 'trim_zeros', 'currency'.
216 *
217 * @return string $amount Newly sanitized amount
218 */
219 function give_maybe_sanitize_amount( $number, $args = array() ) {
220 // Bailout.
221 if ( empty( $number ) || ( ! is_numeric( $number ) && ! is_string( $number ) ) ) {
222 return $number;
223 }
224
225 $func_args = func_get_args();
226
227 // Backward compatibility.
228 if ( isset( $func_args[1] ) && ( is_bool( $func_args[1] ) || is_numeric( $func_args[1] ) ) ) {
229 $args = array(
230 'number_decimals' => $func_args[1],
231 'trim_zeros' => isset( $func_args[2] ) ? $func_args[2] : false,
232 );
233 }
234
235 $args = wp_parse_args(
236 $args,
237 array(
238 'number_decimals' => false,
239 'trim_zeros' => false,
240 'currency' => give_get_currency(),
241 )
242 );
243
244 $thousand_separator = give_get_price_thousand_separator( $args['currency'] );
245 $decimal_separator = give_get_price_decimal_separator( $args['currency'] );
246 $number_decimals = is_bool( $args['number_decimals'] ) ?
247 give_get_price_decimals( $args['currency'] ) :
248 $args['number_decimals'];
249
250 // Explode number by . decimal separator.
251 $number_parts = explode( '.', $number );
252
253 // Remove currency symbols from number if any.
254 $number = trim( str_replace( give_currency_symbols( true ), '', $number ) );
255
256 if (
257 // Non formatted number.
258 false === strpos( $number, $thousand_separator )
259 && false === strpos( $number, $decimal_separator )
260 ) {
261 return number_format( $number, $number_decimals, '.', '' );
262 } elseif (
263 // Decimal formatted number.
264 // If number of decimal place set to non zero and
265 // number only contains `.` as separator, precision set to less then or equal to number of decimal
266 // then number will be consider as decimal formatted which means number is already sanitized.
267 $number_decimals
268 && '.' === $thousand_separator
269 && false !== strpos( $number, $thousand_separator )
270 && false === strpos( $number, $decimal_separator )
271 && 2 === count( $number_parts )
272 && ( $number_decimals >= strlen( $number_parts[1] ) )
273 ) {
274 return number_format( $number, $number_decimals, '.', '' );
275 }
276
277 if ( give_is_amount_sanitized( $number ) ) {
278 // Sanitize database value.
279 return number_format( $number, $number_decimals, '.', '' );
280
281 } elseif (
282 '.' === $thousand_separator &&
283 false !== strpos( $number, $thousand_separator )
284 ) {
285 // Fix point thousand separator value.
286 $number = str_replace( '.', '', $number );
287 }
288
289 return give_sanitize_amount( $number, $args );
290 }
291
292 /**
293 * Sanitize Amount
294 *
295 * Note: Do not this function to sanitize amount instead use give_maybe_sanitize_amount function.
296 *
297 * Returns a sanitized amount by stripping out thousands separators.
298 *
299 * @since 1.0
300 *
301 * @param int|float|string $number Expects either a float or a string with a decimal separator only (no thousands)
302 * @param array|bool $args It accepts 'number_decimals', 'trim_zeros', 'currency'.
303 *
304 * @return string $amount Newly sanitized amount
305 */
306 function give_sanitize_amount( $number, $args = array() ) {
307
308 // Bailout.
309 if ( empty( $number ) || ( ! is_numeric( $number ) && ! is_string( $number ) ) ) {
310 return $number;
311 }
312
313 // Get function arguments.
314 $func_args = func_get_args();
315
316 // Backward compatibility.
317 if ( isset( $func_args[1] ) && ( is_bool( $func_args[1] ) || is_numeric( $func_args[1] ) ) ) {
318 $args = array(
319 'number_decimals' => $func_args[1],
320 'trim_zeros' => isset( $func_args[2] ) ? $func_args[2] : false,
321 );
322 }
323
324 $args = wp_parse_args(
325 $args,
326 array(
327 'number_decimals' => false,
328 'trim_zeros' => false,
329 'currency' => give_get_currency(),
330 )
331 );
332
333 // Remove slash from amount.
334 // If thousand or decimal separator is set to ' then in $_POST or $_GET param we will get an escaped number.
335 // To prevent notices and warning remove slash from amount/number.
336 $number = wp_unslash( $number );
337
338 $thousand_separator = give_get_price_thousand_separator( $args['currency'] );
339
340 $locale = localeconv();
341 $decimals = array(
342 give_get_price_decimal_separator( $args['currency'] ),
343 $locale['decimal_point'],
344 $locale['mon_decimal_point'],
345 );
346
347 // Remove locale from string
348 if ( ! is_float( $number ) ) {
349 $number = str_replace( $decimals, '.', $number );
350 }
351
352 // Remove thousand amount formatting if amount has.
353 // This condition use to add backward compatibility to version before 1.6, because before version 1.6 we were saving formatted amount to db.
354 // Do not replace thousand separator from price if it is same as decimal separator, because it will be already replace by above code.
355 if ( ! in_array( $thousand_separator, $decimals ) && ( false !== strpos( $number, $thousand_separator ) ) ) {
356 $number = str_replace( $thousand_separator, '', $number );
357 } elseif ( in_array( $thousand_separator, $decimals ) ) {
358 $number = preg_replace( '/\.(?=.*\.)/', '', $number );
359 }
360
361 // Remove non numeric entity before decimal separator.
362 $number = preg_replace( '/[^0-9\.]/', '', $number );
363 $default_dp = give_get_price_decimals( $args['currency'] );
364
365 // Reset negative amount to zero.
366 if ( 0 > $number ) {
367 $number = number_format( 0, $default_dp, '.' );
368 }
369
370 // If number does not have decimal then add number of decimals to it.
371 if (
372 false === strpos( $number, '.' )
373 || ( $default_dp > strlen( substr( $number, strpos( $number, '.' ) + 1 ) ) )
374 ) {
375 $number = number_format( $number, $default_dp, '.', '' );
376 }
377
378 // Format number by custom number of decimals.
379 if ( false !== $args['number_decimals'] ) {
380 $dp = intval( is_bool( $args['number_decimals'] ) ? $default_dp : $args['number_decimals'] );
381 $dp = apply_filters( 'give_sanitize_amount_decimals', $dp, $number );
382 $number = number_format( floatval( $number ), $dp, '.', '' );
383 }
384
385 // Trim zeros.
386 if ( $args['trim_zeros'] && strstr( $number, '.' ) ) {
387 $number = rtrim( rtrim( $number, '0' ), '.' );
388 }
389
390 /**
391 * Filter the sanitize amount
392 *
393 * @since 1.0
394 */
395 return apply_filters( 'give_sanitize_amount', $number );
396 }
397
398 /**
399 * Returns a nicely formatted amount.
400 *
401 * @since 1.0
402 *
403 * @param string $amount Price amount to format
404 * @param array $args Array of arguments.
405 *
406 * @return string $amount Newly formatted amount or Price Not Available
407 */
408 function give_format_amount( $amount, $args = array() ) {
409 // Backward compatibility.
410 if ( is_bool( $args ) ) {
411 $args = array(
412 'decimal' => $args,
413 );
414 }
415
416 $default_args = array(
417 'decimal' => true,
418 'sanitize' => true,
419 'donation_id' => 0,
420 'currency' => '',
421 );
422
423 $args = wp_parse_args( $args, $default_args );
424
425 // Set Currency based on donation id, if required.
426 if ( $args['donation_id'] && empty( $args['currency'] ) ) {
427 $args['currency'] = give_get_meta( $args['donation_id'], '_give_payment_currency', true );
428 }
429
430 $formatted = 0;
431 $currency = ! empty( $args['currency'] ) ? $args['currency'] : give_get_currency( $args['donation_id'] );
432 $thousands_sep = give_get_price_thousand_separator( $currency );
433 $decimal_sep = give_get_price_decimal_separator( $currency );
434 $decimals = ! empty( $args['decimal'] ) ? give_get_price_decimals( $currency ) : 0;
435
436 if ( ! empty( $amount ) ) {
437 // Sanitize amount before formatting.
438 $amount = ! empty( $args['sanitize'] ) ?
439 give_maybe_sanitize_amount(
440 $amount,
441 array(
442 'number_decimals' => $decimals,
443 'currency' => $currency,
444 )
445 ) :
446 number_format( $amount, $decimals, '.', '' );
447
448 switch ( $currency ) {
449 case 'INR':
450 $decimal_amount = '';
451
452 // Extract decimals from amount
453 if ( ( $pos = strpos( $amount, '.' ) ) !== false ) {
454 if ( ! empty( $decimals ) ) {
455 $decimal_amount = substr( round( substr( $amount, $pos ), $decimals ), 1 );
456 $amount = substr( $amount, 0, $pos );
457
458 if ( ! $decimal_amount ) {
459 $decimal_amount = substr( "{$decimal_sep}0000000000", 0, ( $decimals + 1 ) );
460 } elseif ( ( $decimals + 1 ) > strlen( $decimal_amount ) ) {
461 $decimal_amount = substr( "{$decimal_amount}000000000", 0, ( $decimals + 1 ) );
462 }
463 } else {
464 $amount = number_format( $amount, $decimals, $decimal_sep, '' );
465 }
466 }
467
468 // Extract last 3 from amount
469 $result = substr( $amount, - 3 );
470 $amount = substr( $amount, 0, - 3 );
471
472 // Apply digits 2 by 2
473 while ( strlen( $amount ) > 0 ) {
474 $result = substr( $amount, - 2 ) . $thousands_sep . $result;
475 $amount = substr( $amount, 0, - 2 );
476 }
477
478 $formatted = $result . $decimal_amount;
479 break;
480
481 default:
482 $formatted = number_format( $amount, $decimals, $decimal_sep, $thousands_sep );
483 }
484 }
485
486 /**
487 * Filter the formatted amount
488 *
489 * @since 1.0
490 */
491 return apply_filters( 'give_format_amount', $formatted, $amount, $decimals, $decimal_sep, $thousands_sep, $currency, $args );
492 }
493
494
495 /**
496 * Get human readable amount.
497 *
498 * Note: This function only support large number formatting from million to trillion
499 *
500 * @since 1.6
501 *
502 * @use give_get_price_thousand_separator Get thousand separator.
503 *
504 * @param string $amount formatted amount number.
505 * @param array $args Array of arguments.
506 *
507 * @return string formatted amount number with large number names.
508 */
509 function give_human_format_large_amount( $amount, $args = array() ) {
510
511 // Set default currency;
512 if ( empty( $args['currency'] ) ) {
513 $args['currency'] = give_get_currency();
514 }
515
516 // Get thousand separator.
517 $thousands_sep = give_get_price_thousand_separator( $args['currency'] );
518
519 // Sanitize amount for calculation purpose.
520 $sanitize_amount = give_maybe_sanitize_amount(
521 $amount,
522 array(
523 'currency' => $args['currency'],
524 )
525 );
526
527 // Bailout.
528 if ( ! floatval( $sanitize_amount ) ) {
529 return '0';
530 };
531
532 // Explode amount to calculate name of large numbers.
533 $amount_array = explode( $thousands_sep, $amount );
534
535 // Calculate amount parts count.
536 $amount_count_parts = count( $amount_array );
537
538 // Human format amount (default).
539 $human_format_amount = $amount;
540
541 switch ( $args['currency'] ) {
542 case 'INR':
543 // Calculate large number formatted amount.
544 if ( 4 < $amount_count_parts ) {
545 $human_format_amount = sprintf( esc_html__( '%s arab', 'give' ), round( ( $sanitize_amount / 1000000000 ), 2 ) );
546 } elseif ( 3 < $amount_count_parts ) {
547 $human_format_amount = sprintf( esc_html__( '%s crore', 'give' ), round( ( $sanitize_amount / 10000000 ), 2 ) );
548 } elseif ( 2 < $amount_count_parts ) {
549 $human_format_amount = sprintf( esc_html__( '%s lakh', 'give' ), round( ( $sanitize_amount / 100000 ), 2 ) );
550 }
551 break;
552 default:
553 // Calculate large number formatted amount.
554 if ( 4 < $amount_count_parts ) {
555 $human_format_amount = sprintf( esc_html__( '%s trillion', 'give' ), round( ( $sanitize_amount / 1000000000000 ), 2 ) );
556 } elseif ( 3 < $amount_count_parts ) {
557 $human_format_amount = sprintf( esc_html__( '%s billion', 'give' ), round( ( $sanitize_amount / 1000000000 ), 2 ) );
558 } elseif ( 2 < $amount_count_parts ) {
559 $human_format_amount = sprintf( esc_html__( '%s million', 'give' ), round( ( $sanitize_amount / 1000000 ), 2 ) );
560 }
561 }
562
563 return apply_filters( 'give_human_format_large_amount', $human_format_amount, $amount, $sanitize_amount );
564 }
565
566 /**
567 * Returns a nicely formatted amount with custom decimal separator.
568 *
569 * @since 1.0
570 *
571 * @param array $args {
572 *
573 * @type int|float|string $amount Formatted or sanitized price. (optional if donation id set)
574 * @type int $donation_id donation amount (optional if set amount, but provide it for better result if formatting decimal amount of donation).
575 * @type string $currency donation amount (optional if set donation id). Provide either amount or donation id
576 * @type int|bool $dp number of decimals
577 * @type bool $sanitize Whether or not sanitize number
578 * }
579 *
580 * @return string $amount Newly formatted amount or Price Not Available
581 */
582 function give_format_decimal( $args ) {
583 // Backward compatibility.
584 if ( ! is_array( $args ) ) {
585 $func_args = func_get_args();
586 $args = array(
587 'amount' => $func_args[0],
588 'dp' => isset( $func_args[1] ) ? $func_args[1] : false,
589 'sanitize' => isset( $func_args[2] ) ? $func_args[2] : true,
590 );
591 }
592
593 $args = wp_parse_args(
594 $args,
595 array(
596 'amount' => '',
597 'donation_id' => 0,
598 'currency' => '',
599 'dp' => false,
600 'sanitize' => false,
601 )
602 );
603
604 if ( ! empty( $args['donation_id'] ) ) {
605
606 // Set currency if not already done.
607 if ( empty( $args['currency'] ) ) {
608 $args['currency'] = give_get_payment_currency_code( $args['donation_id'] );
609 }
610
611 // Set amount if not already done.
612 if ( empty( $args['amount'] ) ) {
613 $args['amount'] = give_donation_amount( $args['donation_id'] );
614 }
615 }
616
617 $decimal_separator = give_get_price_decimal_separator();
618 $formatted_amount = $args['sanitize'] ?
619 give_maybe_sanitize_amount(
620 $args['amount'],
621 array(
622 'number_decimals' => $args['dp'],
623 'currency' => $args['currency'],
624 )
625 ) :
626 number_format( $args['amount'], ( is_bool( $args['dp'] ) ? give_get_price_decimals( $args['currency'] ) : $args['dp'] ), '.', '' );
627
628 if ( false !== strpos( $formatted_amount, '.' ) ) {
629 $formatted_amount = str_replace( '.', $decimal_separator, $formatted_amount );
630 }
631
632 return apply_filters( 'give_format_decimal', $formatted_amount, $args['amount'], $decimal_separator, $args );
633 }
634
635 /**
636 * Get date format string on basis of given context.
637 *
638 * @since 1.7
639 *
640 * @param string $date_context Date format context name.
641 *
642 * @return string Date format string
643 */
644 function give_date_format( $date_context = '' ) {
645 /**
646 * Filter the date context
647 *
648 * You can add your own date context or use already exist context.
649 * For example:
650 * add_filter( 'give_date_format_contexts', 'add_new_date_contexts' );
651 * function add_new_date_contexts( $date_format_contexts ) {
652 * // You can add single context like this $date_format_contexts['checkout'] = 'F j, Y';
653 * // Instead add multiple date context at once.
654 * $new_date_format_contexts = array(
655 * 'checkout' => 'F j, Y',
656 * 'report' => 'Y-m-d',
657 * 'email' => 'm/d/Y',
658 * );
659 *
660 * // Merge date contexts array only if you are adding multiple date contexts at once otherwise return $date_format_contexts.
661 * return array_merge( $new_date_format_contexts, $date_format_contexts );
662 *
663 * }
664 */
665 $date_format_contexts = apply_filters( 'give_date_format_contexts', array() );
666
667 // Set date format to default date format.
668 $date_format = get_option( 'date_format' );
669
670 // Update date format if we have non empty date format context array and non empty date format string for that context.
671 if ( $date_context && ! empty( $date_format_contexts ) && array_key_exists( $date_context, $date_format_contexts ) ) {
672 $date_format = ! empty( $date_format_contexts[ $date_context ] )
673 ? $date_format_contexts[ $date_context ]
674 : $date_format;
675 }
676
677 return apply_filters( 'give_date_format', $date_format );
678 }
679
680 /**
681 * Get cache key.
682 *
683 * @since 1.7
684 * @deprecated 1.8.7 You can access this function from Give_Cache.
685 *
686 * @param string $action Cache key prefix.
687 * @param array $query_args Query array.
688 *
689 * @return string
690 */
691 function give_get_cache_key( $action, $query_args ) {
692 return Give_Cache::get_key( $action, $query_args );
693 }
694
695 /**
696 * Clean variables using sanitize_text_field. Arrays are cleaned recursively.
697 * Non-scalar values are ignored.
698 *
699 * @since 1.8
700 *
701 * @param string|array $var
702 *
703 * @return string|array
704 */
705 function give_clean( $var ) {
706 if ( is_array( $var ) ) {
707 return array_map( 'give_clean', $var );
708 }
709
710 return is_scalar( $var ) ? sanitize_text_field( wp_unslash( $var ) ) : $var;
711 }
712
713 /**
714 * Transforms php.ini notation for numbers (like '2M') to an integer.
715 *
716 * @since 1.8
717 *
718 * @param $size
719 *
720 * @return int
721 */
722 function give_let_to_num( $size ) {
723 $l = substr( $size, - 1 );
724 $ret = substr( $size, 0, - 1 );
725 switch ( strtoupper( $l ) ) {
726 case 'P':
727 $ret *= 1024;
728 case 'T':
729 $ret *= 1024;
730 case 'G':
731 $ret *= 1024;
732 case 'M':
733 $ret *= 1024;
734 case 'K':
735 $ret *= 1024;
736 }
737
738 return $ret;
739 }
740
741 /**
742 * Verify nonce.
743 *
744 * @since 1.8
745 *
746 * @param string $nonce Nonce Hash.
747 * @param int $action Nonce verification action.
748 * @param array $wp_die_args Nonce fail arguments.
749 *
750 * @return bool
751 */
752 function give_validate_nonce( $nonce, $action = - 1, $wp_die_args = array() ) {
753
754 // Verify nonce.
755 $verify_nonce = wp_verify_nonce( $nonce, $action );
756
757 // On ajax request send nonce verification status.
758 if ( wp_doing_ajax() ) {
759 return $verify_nonce;
760 }
761
762 if ( ! $verify_nonce ) {
763 $wp_die_args = wp_parse_args(
764 $wp_die_args,
765 array(
766 'message' => __( 'We\'re unable to recognize your session. Please refresh the screen to try again; otherwise contact your website administrator for assistance.', 'give' ),
767 'title' => __( 'Error', 'give' ),
768 'args' => array(
769 'response' => 403,
770 ),
771 )
772 );
773
774 wp_die(
775 $wp_die_args['message'],
776 $wp_die_args['title'],
777 $wp_die_args['args']
778 );
779 }
780
781 return true;
782 }
783
784 /**
785 * Verify nonce while processing donation form.
786 *
787 * @since 2.0
788 *
789 * @param string $nonce Nonce value.
790 * @param int $form_id Donation Form ID.
791 *
792 * @return bool
793 */
794 function give_verify_donation_form_nonce( $nonce = '', $form_id ) {
795
796 // Form nonce action.
797 $nonce_action = "give_donation_form_nonce_{$form_id}";
798
799 // Nonce validation.
800 $verify_nonce = give_validate_nonce( $nonce, $nonce_action );
801
802 if ( ! $verify_nonce ) {
803 give_set_error( 'donation_form_nonce', __( 'We\'re unable to recognize your session. Please refresh the screen to try again; otherwise contact your website administrator for assistance.', 'give' ) );
804 }
805
806 return $verify_nonce;
807 }
808
809 /**
810 * Check variable and get default or valid value.
811 *
812 * Helper function to check if a variable is set, empty, etc.
813 *
814 * @since 1.8
815 *
816 * @param $variable
817 * @param string (optional) $conditional default value: isset
818 * @param mixed (optional) $default default value: false
819 * @param string (optional) $array_key_name default value: false
820 *
821 * @return mixed
822 */
823 function give_check_variable( $variable, $conditional = '', $default = false, $array_key_name = '' ) {
824 // Get value from array if array key non empty.
825 if ( empty( $array_key_name ) ) {
826 switch ( $conditional ) {
827 case 'isset_empty':
828 $variable = ( isset( $variable ) && ! empty( $variable ) ) ? $variable : $default;
829 break;
830
831 case 'empty':
832 $variable = ! empty( $variable ) ? $variable : $default;
833 break;
834
835 case 'null':
836 $variable = ! is_null( $variable ) ? $variable : $default;
837 break;
838
839 default:
840 $variable = isset( $variable ) ? $variable : $default;
841 }
842 } else {
843 $isset = array_key_exists( $array_key_name, $variable );
844
845 switch ( $conditional ) {
846 case 'isset_empty':
847 $variable = ( $isset && ! empty( $variable[ $array_key_name ] ) ) ? $variable[ $array_key_name ] : $default;
848 break;
849
850 case 'empty':
851 $variable = ! empty( $variable[ $array_key_name ] ) ? $variable[ $array_key_name ] : $default;
852 break;
853
854 case 'null':
855 $variable = $isset && ! is_null( $variable[ $array_key_name ] ) ? $variable[ $array_key_name ] : $default;
856 break;
857
858 default:
859 $variable = $isset && isset( $variable[ $array_key_name ] ) ? $variable[ $array_key_name ] : $default;
860 }
861 }
862
863 return $variable;
864
865 }
866