PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets / 4.9.5
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets v4.9.5
4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 2.0.0 2.1.0 2.2.0 2.2.1 2.2.2 2.3.0 2.4.0 2.5.0 2.5.1 3.0.0 3.1.0 3.1.1 4.0.0 4.0.1 4.1.0 4.1.1 4.2.0 4.2.1 4.3.0 4.3.1 4.4.0 4.5.0 4.5.1 4.6.0 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.6.6 4.6.7 4.6.8 4.6.9 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8.0 4.8.1 4.8.2 4.8.3 4.8.4 4.8.5 4.8.6 4.8.7 4.8.8 4.8.9 trunk 0.1.2-beta 0.1.3-beta 0.1.4-beta 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.2.1 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.5.0 1.5.1 1.6.0 1.6.1 1.7.0 1.8.0 1.8.1 1.9.0
shopengine / utils / notice / notice.php
shopengine / utils / notice Last commit date
notice.php 1 week ago
notice.php
569 lines
1 <?php
2 namespace Oxaim\Libs;
3
4 defined( 'ABSPATH' ) || exit;
5
6 if(!class_exists('\Oxaim\Libs\Notice')):
7
8 class Notice{
9
10 /**
11 * scripts version
12 *
13 * @var string
14 */
15 protected $script_version = '2.2.0';
16
17 /**
18 * Unique ID to identify each notice
19 *
20 * @var string
21 */
22 protected $notice_id;
23
24 /**
25 * Plugin text-domain
26 *
27 * @var string
28 */
29 protected $text_domain;
30
31
32 /**
33 * Unique ID
34 *
35 * @var string
36 */
37 protected $unique_id;
38
39
40 /**
41 * Notice div container's class
42 *
43 * @var string
44 */
45 protected $class;
46
47
48 /**
49 * Single button's data
50 *
51 * @var array
52 */
53 protected $button;
54
55
56 /**
57 * Size class
58 *
59 * @var array
60 */
61 protected $size;
62
63
64 /**
65 * List of all buttons with it's config data
66 *
67 * @var array
68 */
69 protected $buttons;
70
71 /**
72 * Notice title
73 *
74 * @var string
75 */
76 protected $title;
77
78
79 /**
80 * Notice message
81 *
82 * @var string
83 */
84 protected $message;
85
86 /**
87 * Left logo
88 *
89 * @var string
90 */
91 protected $logo;
92 /**
93 * Container gutter
94 *
95 * @var string
96 */
97 protected $gutter;
98
99 /**
100 * Left logo style
101 *
102 * @var string
103 */
104 protected $logo_style;
105
106
107 /**
108 * Left logo style
109 *
110 * @var string
111 */
112 protected $dismissible;
113
114 protected $expired_time;
115
116
117
118 /**
119 * html markup for notice
120 *
121 * @var string
122 */
123 protected $html;
124
125
126
127 /**
128 * get_version
129 *
130 * @return string
131 */
132 public function get_version(){
133 return $this->script_version;
134 }
135
136 /**
137 * get_script_location
138 *
139 * @return string
140 */
141 public function get_script_location(){
142 return __FILE__;
143 }
144
145 // config
146
147 /**
148 * Configures all setter variables
149 *
150 * @param string $prefix
151 * @return void
152 */
153 public function config($text_domain = '', $unique_id = ''){
154 $this->text_domain = $text_domain;
155
156 $this->unique_id = $unique_id;
157
158 $this->notice_id = $text_domain . '-' . $unique_id;
159
160 $this->dismissible = false; // false, user, global
161
162 $this->expired_time = 1;
163
164 $this->html = '';
165
166 $this->title = '';
167
168 $this->message = '';
169
170 $this->class = '';
171
172 $this->gutter = true;
173
174 $this->logo = '';
175
176 $this->logo_style = '';
177
178 $this->size = [ ];
179
180 $this->button = [
181 'default_class' => 'button',
182 'class' => 'button-secondary ', // button-primary button-secondary button-small button-large button-link
183 'text' => 'Button',
184 'url' => '#',
185 'icon' => ''
186 ];
187
188 $this->buttons = [];
189
190 return $this;
191 }
192
193 // setters begin
194
195 /**
196 * Adds classes to the container
197 *
198 * @param string $classname
199 * @return void
200 */
201 public function set_class($classname = ''){
202 $this->class .= $classname;
203
204 return $this;
205 }
206
207 public function set_type($type = ''){
208 $this->class .= ' notice-' . $type;
209
210 return $this;
211 }
212
213 public function set_button($button = []){
214 $button = array_merge($this->button, $button);
215 $this->buttons[] = $button;
216
217 return $this;
218 }
219
220 public function set_id($id){
221 $this->notice_id = $id;
222 return $this;
223 }
224
225 public function set_title($title = ''){
226 $this->title .= $title;
227
228 return $this;
229 }
230
231 public function set_message($message = ''){
232 $this->message .= $message;
233
234 return $this;
235 }
236
237 public function set_gutter($gutter = true){
238 $this->gutter .= $gutter;
239 $this->class .= ($gutter === true ? '' : ' no-gutter');
240
241 return $this;
242 }
243
244 public function set_logo($logo = '', $logo_style = ""){
245 $this->logo = $logo;
246
247 $this->logo_style = $logo_style;
248
249 return $this;
250 }
251
252 public function set_html($html = ''){
253 $this->html .= $html;
254
255 return $this;
256 }
257
258 // setters ends
259
260
261 // group getter
262 public function get_data(){
263 return [
264 'message' => $this->message,
265 'title' => $this->title,
266 'buttons' => $this->buttons,
267 'class' => $this->class,
268 'html' => $this->html,
269 ];
270 }
271
272
273
274
275 public function call(){
276 add_action( 'admin_notices', [$this, 'get_notice'] );
277 }
278
279 public function get_notice(){
280 // dismissible conditions
281 if ( 'user' === $this->dismissible) {
282 $expired = get_user_meta( get_current_user_id(), $this->notice_id, true );
283 } elseif ( 'global' === $this->dismissible ) {
284 $expired = get_transient( $this->notice_id );
285 }else{
286 $expired = '';
287 }
288
289 global $oxaim_lib_notice_list;
290
291 if(!isset($oxaim_lib_notice_list[$this->notice_id])){
292 $oxaim_lib_notice_list[$this->notice_id] = __FILE__;
293
294 // is transient expired?
295 if ( false === $expired || empty( $expired ) ) {
296 $this->generate_html();
297 }
298 }
299 }
300
301 public function set_dismiss($scope = 'global', $time = (3600 * 24 * 7)){
302 $this->dismissible = $scope;
303 $this->expired_time = $time;
304
305 return $this;
306 }
307
308 /**
309 * URL schemes accepted inside notice markup.
310 */
311 public static function allowed_protocols() {
312 return ['http', 'https', 'mailto'];
313 }
314
315 /**
316 * HTML allowed inside a notice body.
317 *
318 * Callers may hand this class markup that originated from a remote API
319 * (see \Wpmet\Libs\Banner), so output is filtered here rather than
320 * trusted. Kept self-contained on purpose: this file is a shared library
321 * and whichever wpmet plugin loads first wins the class_exists() guard,
322 * so it must not depend on any single plugin's helper being present.
323 *
324 * Event handler attributes (on*) need no explicit rule -- wp_kses() drops
325 * every attribute that is not listed below.
326 */
327 public static function allowed_html() {
328
329 $common = [
330 'class' => [],
331 'style' => [],
332 'title' => [],
333 'id' => [],
334 ];
335
336 return [
337 'a' => array_merge($common, ['href' => [], 'target' => [], 'rel' => []]),
338 'abbr' => $common,
339 'b' => $common,
340 'br' => [],
341 'div' => $common,
342 'em' => $common,
343 'h1' => $common,
344 'h2' => $common,
345 'h3' => $common,
346 'h4' => $common,
347 'h5' => $common,
348 'h6' => $common,
349 'i' => $common,
350 'img' => array_merge($common, ['src' => [], 'alt' => [], 'width' => [], 'height' => []]),
351 'li' => $common,
352 'ol' => $common,
353 'p' => $common,
354 'small' => $common,
355 'span' => $common,
356 'strong' => $common,
357 'u' => $common,
358 'ul' => $common,
359 ];
360 }
361
362 public function generate_html() {
363
364 ?>
365 <div
366 id="<?php echo esc_attr($this->notice_id); ?>"
367 class="notice wpmet-notice notice-<?php echo esc_attr($this->notice_id . ' ' .$this->class); ?> <?php echo (false === $this->dismissible ? '' : 'is-dismissible') ;?>"
368
369 expired_time="<?php echo esc_attr($this->expired_time); ?>"
370 dismissible="<?php echo esc_attr($this->dismissible); ?>"
371 >
372 <?php if(!empty($this->logo)):?>
373 <img class="notice-logo" style="<?php echo esc_attr($this->logo_style); ?>" src="<?php echo esc_url($this->logo);?>" />
374 <?php endif; ?>
375
376 <div class="notice-right-container <?php echo (empty($this->logo) ? 'notice-container-full-width' : ''); ?>">
377
378 <?php if(empty($this->html)): ?>
379 <?php echo (empty($this->title) ? '' : sprintf('<div class="notice-main-title notice-vert-space">%s</div>', esc_html($this->title))); ?>
380
381 <div class="notice-message notice-vert-space">
382 <?php echo wp_kses($this->message, self::allowed_html(), self::allowed_protocols()); ?>
383 </div>
384
385 <?php if(!empty($this->buttons)): ?>
386 <div class="button-container notice-vert-space">
387 <?php foreach($this->buttons as $button):
388 $is_target_blank = isset($button['target']) && $button['target'] === '_blank' ? 'target="_blank"' : '';
389 ?>
390 <a <?php echo esc_attr($is_target_blank); ?> id="<?php echo (!isset($button['id']) ? '' : esc_attr($button['id'])); ?>" href="<?php echo esc_url($button['url']); ?>" class="wpmet-notice-button <?php echo esc_attr($button['class']); ?>">
391 <?php if(!empty($button['icon'])) :?>
392 <i class="notice-icon <?php echo esc_attr($button['icon']); ?>"></i>
393 <?php endif; ?>
394 <?php echo esc_html($button['text']);?>
395 </a>
396 &nbsp;
397 <?php endforeach; ?>
398 </div>
399 <?php endif;?>
400
401 <?php else:?>
402 <?php echo wp_kses($this->html, self::allowed_html(), self::allowed_protocols()); ?>
403 <?php endif;?>
404
405 </div>
406
407 <?php if(false !== $this->dismissible): ?>
408 <button type="button" class="notice-dismiss">
409 <span class="screen-reader-text">x</span>
410 </button>
411 <?php endif;?>
412
413 <div style="clear:both"></div>
414
415 </div>
416 <?php
417 }
418
419 public static function init(){
420 add_action( 'wp_ajax_wpmet-notices', [ __CLASS__, 'dismiss_ajax_call' ] );
421 add_action( 'admin_head', [ __CLASS__, 'enqueue_scripts' ] );
422 }
423
424 public static function dismiss_ajax_call() {
425 if(empty( $_REQUEST['_wpnonce'] ) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_wpnonce'])),'wpmet-notices')){
426 wp_send_json_error();
427 }
428
429 $notice_id = ( isset( $_POST['notice_id'] ) ) ? sanitize_text_field(wp_unslash($_POST['notice_id'])) : '';
430 $dismissible = ( isset( $_POST['dismissible'] ) ) ? sanitize_text_field(wp_unslash($_POST['dismissible'])) : '';
431 $expired_time = ( isset( $_POST['expired_time'] ) ) ? sanitize_text_field(wp_unslash($_POST['expired_time'])) : '';
432
433 if ( ! empty( $notice_id ) ) {
434 if ( 'user' === $dismissible ) {
435 update_user_meta( get_current_user_id(), $notice_id, true );
436 } else {
437 set_transient( $notice_id, true, $expired_time );
438 }
439
440 if( $notice_id == 'shopengine-edit_with_emailkit_banner' ) {
441 $counter = get_option('shopengine-edit_with_emailkit_banner_dismissed_'.get_current_user_id(), 0);
442 update_option('shopengine-edit_with_emailkit_banner_dismissed_'.get_current_user_id(), $counter+1);
443 }
444
445 wp_send_json_success();
446 }
447
448 wp_send_json_error();
449 }
450
451 public static function enqueue_scripts() {
452 echo "
453 <script>
454 jQuery(document).ready(function ($) {
455 $( '.wpmet-notice.is-dismissible' ).on( 'click', '.notice-dismiss', function() {
456
457 _this = $( this ).parents('.wpmet-notice').eq(0);
458 var notice_id = _this.attr( 'id' ) || '';
459 var expired_time = _this.attr( 'expired_time' ) || '';
460 var dismissible = _this.attr( 'dismissible' ) || '';
461 var x = $( this ).attr('class');
462
463 // console.log({
464 // _this, x, notice_id, expired_time, dismissible
465 // });
466 // return;
467
468 _this.hide();
469
470 $.ajax({
471 url: ajaxurl,
472 type: 'POST',
473 data: {
474 action : 'wpmet-notices',
475 notice_id : notice_id,
476 dismissible : dismissible,
477 expired_time : expired_time,
478 _wpnonce : '".esc_html(wp_create_nonce('wpmet-notices'))."',
479 },
480 });
481 });
482 });
483 </script>
484 <style>
485 .wpmet-notice{
486 margin: 5px 0 15px;
487 padding: 0!important;
488 display: flex;
489 flex-direction: row;
490 justify-content: flex-start;
491 align-items: center;
492 }
493
494 .wpmet-notice .notice-right-container{
495 margin: .7rem .8rem .8rem;
496 }
497
498 .notice-container-full-width{
499 width:100%!important;
500 }
501
502 .wpmet-notice.no-gutter, .wpmet-notice.no-gutter .notice-right-container{
503 padding: 0!important;
504 margin: 0!important;
505 }
506
507 .notice-right-container .notice-vert-space{
508 margin-bottom: .8rem;
509 }
510
511 .notice-right-container .notice-vert-space:last-child,
512 .notice-right-container .notice-vert-space:only-child{
513 margin-bottom: 0;
514 }
515
516 .wpmet-notice .notice-logo{
517 padding: .8rem;
518 max-width: 110px;
519 max-height: 110px;
520 }
521
522 .wpmet-notice-button {
523 text-decoration:none;
524 }
525
526 .wpmet-notice-button > i{
527 margin-right: 3px;
528 }
529
530 .wpmet-notice-button .notice-icon{
531 display:inline-block;
532 }
533
534 .wpmet-notice-button .notice-icon:before{
535 vertical-align: middle!important;
536 margin-top: -1px;
537 }
538
539 .wpmet-notice .notice-main-title{
540 color: #1d2327;
541 font-size: 1.2rem;
542 }
543
544 </style>
545 ";
546 }
547
548
549 private static $instance;
550
551 /**
552 * Method: instance -> Return Notice module class instance
553 *
554 * @param string|null $text_domain
555 * @param string|null $unique_id
556 * @return mixed
557 */
558 public static function instance($text_domain = null, $unique_id = null) {
559 if($text_domain == null){
560 return false;
561 }
562
563 self::$instance = new self();
564
565 return self::$instance->config($text_domain, (is_null($unique_id) ? uniqid() : $unique_id));
566 }
567 }
568
569 endif;