PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.6.0
GiveWP – Donation Plugin and Fundraising Platform v2.6.0
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 / class-notices.php
give / includes Last commit date
admin 6 years ago api 6 years ago database 6 years ago deprecated 6 years ago donors 6 years ago emails 6 years ago forms 6 years ago frontend 7 years ago gateways 6 years ago libraries 7 years ago payments 6 years ago actions.php 6 years ago ajax-functions.php 6 years ago class-give-async-process.php 7 years ago class-give-background-updater.php 6 years ago class-give-cache-setting.php 6 years ago class-give-cache.php 6 years ago class-give-cli-commands.php 6 years ago class-give-comment.php 7 years ago class-give-cron.php 6 years ago class-give-donate-form.php 6 years ago class-give-donor-wall-widget.php 6 years ago class-give-donor.php 6 years ago class-give-email-access.php 7 years ago class-give-license-handler.php 6 years ago class-give-logging.php 6 years ago class-give-readme-parser.php 7 years ago class-give-roles.php 6 years ago class-give-scripts.php 6 years ago class-give-session.php 6 years ago class-give-stats.php 7 years ago class-give-template-loader.php 8 years ago class-give-tooltips.php 7 years ago class-give-translation.php 8 years ago class-notices.php 6 years ago country-functions.php 6 years ago currencies-list.php 6 years ago currency-functions.php 6 years ago error-tracking.php 7 years ago filters.php 6 years ago formatting.php 6 years ago install.php 6 years ago login-register.php 7 years ago misc-functions.php 6 years ago plugin-compatibility.php 6 years ago post-types.php 6 years ago price-functions.php 7 years ago process-donation.php 6 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
class-notices.php
759 lines
1 <?php
2 /**
3 * Admin Notices Class.
4 *
5 * @package Give
6 * @subpackage Admin/Notices
7 * @copyright Copyright (c) 2016, GiveWP
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.8.9
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Give_Notices Class
19 *
20 * @since 1.8.9
21 */
22 class Give_Notices {
23 /**
24 * List of notices
25 * @var array
26 * @since 1.8.9
27 * @access private
28 */
29 private static $notices = array();
30
31
32 /**
33 * Flag to check if any notice auto dismissible among all notices
34 *
35 * @since 1.8.9
36 * @access private
37 * @var bool
38 */
39 private static $has_auto_dismissible_notice = false;
40
41 /**
42 * Flag to check if any notice has dismiss interval among all notices
43 *
44 * @since 1.8.9
45 * @access private
46 * @var bool
47 */
48 private static $has_dismiss_interval_notice = false;
49
50 /**
51 * Get things started.
52 *
53 * @since 1.8.9
54 */
55 public function __construct() {
56 add_action( 'admin_notices', array( $this, 'render_admin_notices' ), 999 );
57 add_action( 'admin_footer', array( $this, '__reveal_notices' ) );
58 add_action( 'give_dismiss_notices', array( $this, 'dismiss_notices' ) );
59
60 add_action( 'give_frontend_notices', array( $this, 'render_frontend_notices' ), 999 );
61 add_action( 'give_pre_form_output', array( $this, 'render_frontend_form_notices' ), 10, 1 );
62 add_action( 'give_ajax_donation_errors', array( $this, 'render_frontend_notices' ) );
63
64 /**
65 * Backward compatibility for deprecated params.
66 *
67 * @since 1.8.14
68 */
69 add_filter( 'give_register_notice_args', array( $this, 'bc_deprecated_params' ) );
70 add_filter( 'give_frontend_errors_args', array( $this, 'bc_deprecated_params' ) );
71 add_filter( 'give_frontend_notice_args', array( $this, 'bc_deprecated_params' ) );
72 }
73
74 /**
75 * Add backward compatibility to deprecated params.
76 *
77 * @since 1.8.14
78 * @access public
79 *
80 * @param array $args Array of notice params
81 *
82 * @return array
83 */
84 public function bc_deprecated_params( $args ) {
85 /**
86 * Param: auto_dismissible
87 * deprecated in 1.8.14
88 *
89 * Check if auto_dismissible is set and it true then unset and change dismissible parameter value to auto
90 */
91 if ( isset( $args['auto_dismissible'] ) ) {
92 if ( ! empty( $args['auto_dismissible'] ) ) {
93 $args['dismissible'] = 'auto';
94 }
95 // unset auto_dismissible as it has been deprecated.
96 unset( $args['auto_dismissible'] );
97 }
98
99 return $args;
100 }
101
102 /**
103 * Register notice.
104 *
105 * @since 1.8.9
106 * @access public
107 *
108 * @param $notice_args
109 *
110 * @return bool
111 */
112 public function register_notice( $notice_args ) {
113 // Bailout.
114 if ( empty( $notice_args['id'] ) || array_key_exists( $notice_args['id'], self::$notices ) ) {
115 return false;
116 }
117
118 $notice_args = wp_parse_args(
119 $notice_args,
120 array(
121 'id' => '',
122 'description' => '',
123
124 /*
125 * Add custom notice html
126 * Note: This param has more priority then description, so if you have both param then this one will be use
127 * for generating notice html. Most of feature of notice attach to core generated html, so if you set
128 * custom html then please add required classes and data attribute which help to apply feature on notice.
129 *
130 * @since 1.8.16
131 */
132 'description_html' => '',
133
134 /*
135 * Add New Parameter and remove the auto_dismissible parameter.
136 * Value: auto/true/false
137 *
138 * @since 1.8.14
139 */
140 'dismissible' => true,
141
142 // Value: error/warning/success/info/updated
143 'type' => 'error',
144
145 // Value: null/user/all
146 'dismissible_type' => null,
147
148 // Value: shortly/permanent/null/custom
149 'dismiss_interval' => null,
150
151 // Only set it when custom is defined.
152 'dismiss_interval_time' => null,
153
154
155 )
156 );
157
158 /**
159 * Filter to modify Notice args before it get add
160 *
161 * @since 1.8.14
162 */
163 $notice_args = apply_filters( 'give_register_notice_args', $notice_args );
164
165 // Set extra dismiss links if any.
166 if ( false !== strpos( $notice_args['description'], 'data-dismiss-interval' ) ) {
167
168 preg_match_all( "/data-([^\"]*)=\"([^\"]*)\"/", $notice_args['description'], $extra_notice_dismiss_link );
169
170 if ( ! empty( $extra_notice_dismiss_link ) ) {
171 $extra_notice_dismiss_links = array_chunk( current( $extra_notice_dismiss_link ), 3 );
172 foreach ( $extra_notice_dismiss_links as $extra_notice_dismiss_link ) {
173 // Create array og key ==> value by parsing query string created after renaming data attributes.
174 $data_attribute_query_str = str_replace( array( 'data-', '-', '"' ), array(
175 '',
176 '_',
177 '',
178 ), implode( '&', $extra_notice_dismiss_link ) );
179
180 $notice_args['extra_links'][] = wp_parse_args( $data_attribute_query_str );
181 }
182 }
183 }
184
185
186 self::$notices[ $notice_args['id'] ] = $notice_args;
187
188 // Auto set show param if not already set.
189 if ( ! isset( self::$notices[ $notice_args['id'] ]['show'] ) ) {
190 self::$notices[ $notice_args['id'] ]['show'] = $this->is_notice_dismissed( $notice_args ) ? false : true;
191 }
192
193 // Auto set time interval for shortly.
194 if ( 'shortly' === self::$notices[ $notice_args['id'] ]['dismiss_interval'] ) {
195 self::$notices[ $notice_args['id'] ]['dismiss_interval_time'] = DAY_IN_SECONDS;
196 }
197
198 return true;
199 }
200
201 /**
202 * Display notice.
203 *
204 * @since 1.8.9
205 *
206 */
207 public function render_admin_notices() {
208 /* @var WP_Screen $wp_screen */
209 $wp_screen = get_current_screen();
210
211 // Bailout.
212 if ( empty( self::$notices ) ) {
213 return;
214 }
215
216 // Do not render notices on Gutenberg editor page.
217 if (
218 method_exists( $wp_screen, 'is_block_editor' )
219 && $wp_screen->is_block_editor()
220 ) {
221 return;
222 }
223
224 // Do not render notices on these pages as well.
225 // We don't want to annoy admins with notices on important screens like WP or GiveWP updates, etc.
226 if (
227 'update-core' === $wp_screen->id
228 || 'give_forms_page_give-addons' === $wp_screen->id
229 || 'give_forms_page_give-updates' === $wp_screen->id
230 ) {
231 return;
232 }
233
234 $output = '';
235
236 foreach ( self::$notices as $notice_id => $notice ) {
237 // Check flag set to true to show notice.
238 if ( ! $notice['show'] ) {
239 continue;
240 }
241
242
243 // Render custom html.
244 if( ! empty( $notice['description_html'] ) ) {
245 $output .= "{$notice['description_html']} \n";
246 continue;
247 }
248
249 // Check if notice dismissible or not.
250 if ( ! self::$has_auto_dismissible_notice ) {
251 self::$has_auto_dismissible_notice = ( 'auto' === $notice['dismissible'] );
252 }
253
254 // Check if notice dismissible or not.
255 if ( ! self::$has_dismiss_interval_notice ) {
256 self::$has_dismiss_interval_notice = $notice['dismiss_interval'];
257 }
258
259 $css_id = ( false === strpos( $notice['id'], 'give' ) ? "give-{$notice['id']}" : $notice['id'] );
260
261 $css_class = 'give-notice notice ' . ( empty( $notice['dismissible'] ) ? 'non' : 'is' ) . "-dismissible {$notice['type']} notice-{$notice['type']}";
262 $output .= sprintf(
263 '<div id="%1$s" class="%2$s" data-dismissible="%3$s" data-dismissible-type="%4$s" data-dismiss-interval="%5$s" data-notice-id="%6$s" data-security="%7$s" data-dismiss-interval-time="%8$s" style="display: none">' . " \n",
264 $css_id,
265 $css_class,
266 give_clean( $notice['dismissible'] ),
267 $notice['dismissible_type'],
268 $notice['dismiss_interval'],
269 $notice['id'],
270 empty( $notice['dismissible_type'] ) ? '' : wp_create_nonce( "give_edit_{$notice_id}_notice" ),
271 $notice['dismiss_interval_time']
272 );
273
274 $output .= ( 0 === strpos( $notice['description'], '<div' ) || 0 === strpos( $notice['description'], '<p' ) ? $notice['description'] : "<p>{$notice['description']}</p>" );
275 $output .= "</div> \n";
276 }
277
278 echo $output;
279
280 $this->print_js();
281 }
282
283
284 /**
285 * Render give frontend notices.
286 *
287 * @since 1.8.9
288 * @access public
289 *
290 * @param int $form_id
291 */
292 public function render_frontend_notices( $form_id = 0 ) {
293 $errors = give_get_errors();
294
295 $request_form_id = isset( $_REQUEST['form-id'] ) ? absint( $_REQUEST['form-id'] ) : 0;
296
297 // Sanity checks first: Ensure that gateway returned errors display on the appropriate form.
298 if ( ! isset( $_POST['give_ajax'] ) && $request_form_id !== $form_id ) {
299 return;
300 }
301
302 if ( $errors ) {
303 self::print_frontend_errors( $errors );
304
305 give_clear_errors();
306 }
307 }
308
309 /**
310 * Renders notices for different actions depending on
311 * the type of form display option.
312 *
313 * @since 2.2
314 * @access public
315 *
316 * @param int $form_id Form ID.
317 *
318 * @return void
319 */
320 public function render_frontend_form_notices( $form_id ) {
321 $display_option = give_get_meta( $form_id, '_give_payment_display', true );
322
323 if ( 'modal' === $display_option ) {
324 add_action( 'give_payment_mode_top', array( $this, 'render_frontend_notices' ) );
325 } else {
326 add_action( 'give_pre_form', array( $this, 'render_frontend_notices' ), 11 );
327 }
328 }
329
330 /**
331 * Print notice js.
332 *
333 * @since 1.8.9
334 * @access private
335 */
336 private function print_js() {
337 if ( self::$has_auto_dismissible_notice ) :
338 ?>
339 <script>
340 jQuery(document).ready(function () {
341 // auto hide setting message in 5 seconds.
342 window.setTimeout(
343 function () {
344 jQuery('.give-notice[data-dismissible="auto"]').slideUp();
345 },
346 5000
347 );
348 })
349 </script>
350 <?php
351 endif;
352
353 if ( self::$has_dismiss_interval_notice ) :
354 ?>
355 <script>
356 jQuery(document).ready(function () {
357 var $body = jQuery('body');
358
359 $body.on('click', '.give_dismiss_notice', function (e) {
360 var $parent = jQuery(this).parents('.give-notice'),
361 custom_notice_data = {
362 'dismissible_type': jQuery(this).data('dismissible-type'),
363 'dismiss_interval': jQuery(this).data('dismiss-interval'),
364 'dismiss_interval_time': jQuery(this).data('dismiss-interval-time')
365 };
366
367 $parent.find('button.notice-dismiss').trigger('click', [custom_notice_data]);
368 return false;
369 });
370
371 $body.on('click', 'button.notice-dismiss', function (e, custom_notice_data) {
372 var $parent = jQuery(this).parents('.give-notice'),
373 custom_notice_data = custom_notice_data || {};
374
375 e.preventDefault();
376
377 var data = {
378 'give-action': 'dismiss_notices',
379 'notice_id': $parent.data('notice-id'),
380 'dismissible_type': $parent.data('dismissible-type'),
381 'dismiss_interval': $parent.data('dismiss-interval'),
382 'dismiss_interval_time': $parent.data('dismiss-interval-time'),
383 '_wpnonce': $parent.data('security')
384 };
385
386 if (Object.keys(custom_notice_data).length) {
387 jQuery.extend(data, custom_notice_data);
388 }
389
390 // Bailout.
391 if (
392 !data.dismiss_interval ||
393 !data.dismissible_type
394 ) {
395 return false;
396 }
397
398 jQuery.post(
399 '<?php echo admin_url(); ?>admin-ajax.php',
400 data,
401 function (response) {
402
403 })
404 })
405 });
406 </script>
407 <?php
408 endif;
409 }
410
411 /**
412 * Show notices
413 * Note: only for internal use
414 *
415 * @since 2.3.0
416 */
417 public function __reveal_notices(){
418 ?>
419 <script>
420 jQuery(document).ready(function($){
421 // Fix notice appearance issue.
422 window.setTimeout(
423 function(){
424 var give_notices = $('.give-notice');
425
426 if( give_notices.length ) {
427 give_notices.slideDown();
428 }
429 },
430 1000
431 );
432 });
433 </script>
434 <?php
435 }
436
437
438 /**
439 * Hide notice.
440 *
441 * @since 1.8.9
442 * @access public
443 */
444 public function dismiss_notices() {
445 $_post = give_clean( $_POST );
446 $notice_id = esc_attr( $_post['notice_id'] );
447
448 // Bailout.
449 if (
450 empty( $notice_id ) ||
451 empty( $_post['dismissible_type'] ) ||
452 empty( $_post['dismiss_interval'] ) ||
453 ! check_ajax_referer( "give_edit_{$notice_id}_notice", '_wpnonce' )
454 ) {
455 wp_send_json_error();
456 }
457
458 $notice_key = Give()->notices->get_notice_key( $notice_id, $_post['dismiss_interval'] );
459 if ( 'user' === $_post['dismissible_type'] ) {
460 $current_user = wp_get_current_user();
461 $notice_key = Give()->notices->get_notice_key( $notice_id, $_post['dismiss_interval'], $current_user->ID );
462 }
463
464 $notice_dismiss_time = ! empty( $_post['dismiss_interval_time'] ) ? $_post['dismiss_interval_time'] : null;
465
466 // Save option to hide notice.
467 Give_Cache::set( $notice_key, true, $notice_dismiss_time, true );
468
469 /**
470 * Fire the action when notice dismissed
471 *
472 * @since 2.2.0
473 */
474 do_action( 'give_notice_dismissed', $_post );
475
476 wp_send_json_success();
477 }
478
479
480 /**
481 * Get notice key.
482 *
483 * @since 1.8.9
484 * @access public
485 *
486 * @param string $notice_id
487 * @param string $dismiss_interval
488 * @param int $user_id
489 *
490 * @return string
491 */
492 public function get_notice_key( $notice_id, $dismiss_interval = null, $user_id = 0 ) {
493 $notice_key = "_give_notice_{$notice_id}";
494
495 if ( ! empty( $dismiss_interval ) ) {
496 $notice_key .= "_{$dismiss_interval}";
497 }
498
499 if ( $user_id ) {
500 $notice_key .= "_{$user_id}";
501 }
502
503 $notice_key = sanitize_key( $notice_key );
504
505 return $notice_key;
506 }
507
508
509 /**
510 * Get notice dismiss link.
511 *
512 * @param $notice_args
513 *
514 * @return string
515 */
516 public function get_dismiss_link( $notice_args ) {
517 $notice_args = wp_parse_args(
518 $notice_args,
519 array(
520 'title' => __( 'Click here', 'give' ),
521 'dismissible_type' => '',
522 'dismiss_interval' => '',
523 'dismiss_interval_time' => null,
524 )
525 );
526
527 return sprintf(
528 '<a href="#" class="give_dismiss_notice" data-dismissible-type="%1$s" data-dismiss-interval="%2$s" data-dismiss-interval-time="%3$s">%4$s</a>',
529 $notice_args['dismissible_type'],
530 $notice_args['dismiss_interval'],
531 $notice_args['dismiss_interval_time'],
532 $notice_args['title']
533 );
534 }
535
536
537 /**
538 * Check if notice dismissed or not
539 *
540 * @since 1.8.9
541 * @access public
542 *
543 * @param array $notice
544 *
545 * @return bool|null
546 */
547 public function is_notice_dismissed( $notice ) {
548 $notice_key = $this->get_notice_key( $notice['id'], $notice['dismiss_interval'] );
549 $is_notice_dismissed = false;
550
551 if ( 'user' === $notice['dismissible_type'] ) {
552 $current_user = wp_get_current_user();
553 $notice_key = Give()->notices->get_notice_key( $notice['id'], $notice['dismiss_interval'], $current_user->ID );
554 }
555
556 $notice_data = Give_Cache::get( $notice_key, true );
557
558 // Find notice dismiss link status if notice has extra dismissible links.
559 if ( ( empty( $notice_data ) || is_wp_error( $notice_data ) ) && ! empty( $notice['extra_links'] ) ) {
560
561 foreach ( $notice['extra_links'] as $extra_link ) {
562 $new_notice_data = wp_parse_args( $extra_link, $notice );
563 unset( $new_notice_data['extra_links'] );
564
565 if ( $is_notice_dismissed = $this->is_notice_dismissed( $new_notice_data ) ) {
566 return $is_notice_dismissed;
567 }
568 }
569 }
570
571 $is_notice_dismissed = ! empty( $notice_data ) && ! is_wp_error( $notice_data );
572
573 return $is_notice_dismissed;
574 }
575
576
577 /**
578 * Print frontend errors.
579 *
580 * @since 1.8.9
581 * @access public
582 *
583 * @param array $errors
584 */
585 public static function print_frontend_errors( $errors ) {
586 // Bailout.
587 if ( ! $errors ) {
588 return;
589 }
590
591 /**
592 * Change auto_dismissible to dismissible and set the value to true
593 *
594 * @since 1.8.14
595 */
596 $default_notice_args = array(
597 'dismissible' => true,
598 'dismiss_interval' => 5000,
599 );
600
601 // Note: we will remove give_errors class in future.
602 $classes = apply_filters( 'give_error_class', array( 'give_notices', 'give_errors' ) );
603
604 echo sprintf( '<div class="%s">', implode( ' ', $classes ) );
605
606 // Loop error codes and display errors.
607 foreach ( $errors as $error_id => $error ) {
608 // Backward compatibility v<1.8.11
609 if ( is_string( $error ) ) {
610 $error = array(
611 'message' => $error,
612 'notice_args' => array(),
613 );
614 }
615
616 $notice_args = wp_parse_args( $error['notice_args'], $default_notice_args );
617
618 /**
619 * Filter to modify Frontend Errors args before errors is display.
620 *
621 * @since 1.8.14
622 */
623 $notice_args = apply_filters( 'give_frontend_errors_args', $notice_args );
624
625 echo sprintf(
626 '<div class="give_error give_notice" id="give_error_%1$s" data-dismissible="%2$s" data-dismiss-interval="%3$d">
627 <p><strong>%4$s</strong>: %5$s</p>
628 </div>',
629 $error_id,
630 give_clean( $notice_args['dismissible'] ),
631 absint( $notice_args['dismiss_interval'] ),
632 esc_html__( 'Error', 'give' ),
633 $error['message']
634 );
635 }
636
637 echo '</div>';
638 }
639
640 /**
641 * Print frontend notice.
642 * Notice: notice type can be success/error/warning
643 *
644 * @since 1.8.9
645 * @access public
646 *
647 * @param string $message
648 * @param bool $echo
649 * @param string $notice_type
650 * @param array $notice_args
651 *
652 * @return string
653 */
654 public static function print_frontend_notice( $message, $echo = true, $notice_type = 'warning', $notice_args = array() ) {
655 if ( empty( $message ) ) {
656 return '';
657 }
658
659 /**
660 * Change auto_dismissible to dismissible and set the value to true
661 *
662 * @since 1.8.14
663 */
664 $default_notice_args = array(
665 'dismissible' => false,
666 'dismiss_type' => 'auto',
667 'dismiss_interval' => 5000,
668 );
669
670 $notice_args = wp_parse_args( $notice_args, $default_notice_args );
671
672 // Notice dismissible must be true for dismiss type.
673 $notice_args['dismiss_type'] = ! $notice_args['dismissible'] ? '' : $notice_args['dismiss_type'];
674
675 /**
676 * Filter to modify Frontend notice args before notices is display.
677 *
678 * @since 1.8.14
679 */
680 $notice_args = apply_filters( 'give_frontend_notice_args', $notice_args );
681
682 $close_icon = 'manual' === $notice_args['dismiss_type'] ?
683 sprintf(
684 '<img class="notice-dismiss give-notice-close" src="%s" />',
685 esc_url( GIVE_PLUGIN_URL . 'assets/dist/images/close.svg' )
686
687 ) :
688 '';
689
690 // Note: we will remove give_errors class in future.
691 $error = sprintf(
692 '<div class="give_notices give_errors" id="give_error_%1$s">
693 <p class="give_notice give_%1$s" data-dismissible="%2$s" data-dismiss-interval="%3$d" data-dismiss-type="%4$s">
694 %5$s
695 </p>
696 %6$s
697 </div>',
698 $notice_type,
699 give_clean( $notice_args['dismissible'] ),
700 absint( $notice_args['dismiss_interval'] ),
701 give_clean( $notice_args['dismiss_type'] ),
702 $message,
703 $close_icon
704
705 );
706
707 if ( ! $echo ) {
708 return $error;
709 }
710
711 echo $error;
712 }
713
714 /**
715 * Print Inline Notice.
716 * Note: dismissible feature will note work if notice will add to dom by javascript after document load.
717 *
718 * @param array $notice_args An array of notice arguments.
719 *
720 * @todo Implement render_admin_notices function within this function in future.
721 *
722 * @access public
723 * @since 1.8.17
724 *
725 * @return string
726 */
727 public function print_admin_notices( $notice_args = array() ) {
728 // Bailout.
729 if ( empty( $notice_args['description'] ) ) {
730 return '';
731 }
732
733 $defaults = array(
734 'id' => '',
735 'echo' => true,
736 'notice_type' => 'warning',
737 'dismissible' => true,
738 );
739 $notice_args = wp_parse_args( $notice_args, $defaults );
740
741 $output = '';
742 $css_id = ! empty( $notice_args['id'] ) ? $notice_args['id'] : uniqid( 'give-inline-notice-' );
743 $css_class = "notice-{$notice_args['notice_type']} give-notice notice inline";
744 $css_class .= ( $notice_args['dismissible'] ) ? ' is-dismissible' : '';
745 $output .= sprintf(
746 '<div id="%1$s" class="%2$s"><p>%3$s</p></div>',
747 $css_id,
748 $css_class,
749 $notice_args['description']
750 );
751
752 if ( ! $notice_args['echo'] ) {
753 return $output;
754 }
755
756 echo $output;
757 }
758 }
759