PluginProbe
Elementor Website Builder – more than just a page builder / 3.4.5
Elementor Website Builder – more than just a page builder v3.4.5
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / core / admin / admin-notices.php

admin-notices.php in Elementor Website Builder – more than just a page builder 3.4.5, at core/admin/admin-notices.php

628 lines 17.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Elementor\Core\Admin;
3
4 use Elementor\Api;
5 use Elementor\Core\Admin\UI\Components\Button;
6 use Elementor\Core\Base\Module;
7 use Elementor\Plugin;
8 use Elementor\Tracker;
9 use Elementor\User;
10 use Elementor\Utils;
11 use Elementor\Core\Admin\Notices\Base_Notice;
12 use Elementor\Core\Admin\Notices\Elementor_Dev_Notice;
13
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit; // Exit if accessed directly.
16 }
17
18 class Admin_Notices extends Module {
19
20 private $plain_notices = [
21 'api_notice',
22 'api_upgrade_plugin',
23 'tracker',
24 'rate_us_feedback',
25 'woocommerce_promote',
26 'cf7_promote',
27 'mc4wp_promote',
28 'popup_maker_promote',
29 'role_manager_promote',
30 ];
31
32 private $elementor_pages_count = null;
33
34 private $install_time = null;
35
36 private $current_screen_id = null;
37
38 private function get_notices() {
39 $notices = [
40 new Elementor_Dev_Notice(),
41 ];
42
43 /**
44 * Admin notices.
45 *
46 * Filters Elementor admin notices.
47 *
48 * This hook can be used by external developers to manage existing
49 * admin notice or to add new notices for Elementor addons.
50 *
51 * @param array $notices A list of notice classes.
52 */
53 $notices = apply_filters( 'elementor/core/admin/notices', $notices );
54
55 return $notices;
56 }
57
58 private function get_install_time() {
59 if ( null === $this->install_time ) {
60 $this->install_time = Plugin::$instance->get_install_time();
61 }
62
63 return $this->install_time;
64 }
65
66 private function get_elementor_pages_count() {
67 if ( null === $this->elementor_pages_count ) {
68 $elementor_pages = new \WP_Query( [
69 'post_type' => 'any',
70 'post_status' => 'publish',
71 'fields' => 'ids',
72 'update_post_meta_cache' => false,
73 'update_post_term_cache' => false,
74 'meta_key' => '_elementor_edit_mode',
75 'meta_value' => 'builder',
76 ] );
77
78 $this->elementor_pages_count = $elementor_pages->post_count;
79 }
80
81 return $this->elementor_pages_count;
82 }
83
84 private function notice_api_upgrade_plugin() {
85 $upgrade_notice = Api::get_upgrade_notice();
86 if ( empty( $upgrade_notice ) ) {
87 return false;
88 }
89
90 if ( ! current_user_can( 'update_plugins' ) ) {
91 return false;
92 }
93
94 if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
95 return false;
96 }
97
98 // Check if have any upgrades.
99 $update_plugins = get_site_transient( 'update_plugins' );
100
101 $has_remote_update_package = ! ( empty( $update_plugins ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ] ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ]->package ) );
102
103 if ( ! $has_remote_update_package && empty( $upgrade_notice['update_link'] ) ) {
104 return false;
105 }
106
107 if ( $has_remote_update_package ) {
108 $product = $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ];
109
110 $details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $product->slug . '&section=changelog&TB_iframe=true&width=600&height=800' );
111 $upgrade_url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . ELEMENTOR_PLUGIN_BASE ), 'upgrade-plugin_' . ELEMENTOR_PLUGIN_BASE );
112 $new_version = $product->new_version;
113 } else {
114 $upgrade_url = $upgrade_notice['update_link'];
115 $details_url = $upgrade_url;
116
117 $new_version = $upgrade_notice['version'];
118 }
119
120 // Check if have upgrade notices to show.
121 if ( version_compare( ELEMENTOR_VERSION, $upgrade_notice['version'], '>=' ) ) {
122 return false;
123 }
124
125 $notice_id = 'upgrade_notice_' . $upgrade_notice['version'];
126 if ( User::is_user_notice_viewed( $notice_id ) ) {
127 return false;
128 }
129
130 $message = sprintf(
131 /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text */
132 __( 'There is a new version of Elementor Page Builder available. <a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">View version %3$s details</a> or <a href="%4$s" class="update-link" aria-label="%5$s">update now</a>.', 'elementor' ),
133 esc_url( $details_url ),
134 esc_attr( sprintf(
135 /* translators: %s: Elementor version */
136 __( 'View Elementor version %s details', 'elementor' ),
137 $new_version
138 ) ),
139 $new_version,
140 esc_url( $upgrade_url ),
141 esc_attr( esc_html__( 'Update Elementor Now', 'elementor' ) )
142 );
143
144 $options = [
145 'title' => esc_html__( 'Update Notification', 'elementor' ),
146 'description' => $message,
147 'button' => [
148 'icon_classes' => 'dashicons dashicons-update',
149 'text' => esc_html__( 'Update Now', 'elementor' ),
150 'url' => $upgrade_url,
151 ],
152 'id' => $notice_id,
153 ];
154
155 $this->print_admin_notice( $options );
156
157 return true;
158 }
159
160 private function notice_api_notice() {
161 $admin_notice = Api::get_admin_notice();
162 if ( empty( $admin_notice ) ) {
163 return false;
164 }
165
166 if ( ! current_user_can( 'manage_options' ) ) {
167 return false;
168 }
169
170 if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
171 return false;
172 }
173
174 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
175 if ( User::is_user_notice_viewed( $notice_id ) ) {
176 return false;
177 }
178
179 $options = [
180 'title' => esc_html__( 'Update Notification', 'elementor' ),
181 'description' => $admin_notice['notice_text'],
182 'id' => $notice_id,
183 ];
184
185 $this->print_admin_notice( $options );
186
187 return true;
188 }
189
190 private function notice_tracker() {
191 if ( ! current_user_can( 'manage_options' ) ) {
192 return false;
193 }
194
195 // Show tracker notice after 24 hours from installed time.
196 if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
197 return false;
198 }
199
200 if ( '1' === get_option( 'elementor_tracker_notice' ) ) {
201 return false;
202 }
203
204 if ( Tracker::is_allow_track() ) {
205 return false;
206 }
207
208 if ( 2 > $this->get_elementor_pages_count() ) {
209 return false;
210 }
211
212 // TODO: Skip for development env.
213 $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
214 $optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
215
216 $tracker_description_text = esc_html__( 'Become a super contributor by opting in to share non-sensitive plugin data and to receive periodic email updates from us.', 'elementor' );
217
218 /**
219 * Tracker admin description text.
220 *
221 * Filters the admin notice text for non-sensitive data collection.
222 *
223 * @since 1.0.0
224 *
225 * @param string $tracker_description_text Description text displayed in admin notice.
226 */
227 $tracker_description_text = apply_filters( 'elementor/tracker/admin_description_text', $tracker_description_text );
228
229 $message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
230
231 $options = [
232 'title' => esc_html__( 'Love using Elementor?', 'elementor' ),
233 'description' => $message,
234 'button' => [
235 'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
236 'url' => $optin_url,
237 'type' => 'cta',
238 ],
239 'button_secondary' => [
240 'text' => esc_html__( 'No thanks', 'elementor' ),
241 'url' => $optout_url,
242 'variant' => 'outline',
243 'type' => 'cta',
244 ],
245 ];
246
247 $this->print_admin_notice( $options );
248
249 return true;
250 }
251
252 private function notice_rate_us_feedback() {
253 $notice_id = 'rate_us_feedback';
254
255 if ( ! current_user_can( 'manage_options' ) ) {
256 return false;
257 }
258
259 if ( 'dashboard' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
260 return false;
261 }
262
263 if ( 10 >= $this->get_elementor_pages_count() ) {
264 return false;
265 }
266
267 $dismiss_url = add_query_arg( [
268 'action' => 'elementor_set_admin_notice_viewed',
269 'notice_id' => esc_attr( $notice_id ),
270 ], admin_url( 'admin-post.php' ) );
271
272 $options = [
273 'title' => esc_html__( 'Congrats!', 'elementor' ),
274 'description' => esc_html__( 'You created over 10 pages with Elementor. Great job! If you can spare a minute,
275 please help us by leaving a five star review on WordPress.org.', 'elementor' ),
276 'id' => $notice_id,
277 'button' => [
278 'text' => esc_html__( 'Happy To Help', 'elementor' ),
279 'url' => 'https://go.elementor.com/admin-review/',
280 'new_tab' => true,
281 'type' => 'cta',
282 ],
283 'button_secondary' => [
284 'text' => esc_html__( 'Hide Notification', 'elementor' ),
285 'classes' => [ 'e-notice-dismiss' ],
286 'url' => esc_url_raw( $dismiss_url ),
287 'new_tab' => true,
288 'type' => 'cta',
289 ],
290 ];
291
292 $this->print_admin_notice( $options );
293
294 return true;
295 }
296
297 private function notice_woocommerce_promote() {
298 $notice_id = 'woocommerce_promote';
299
300 if ( Utils::has_pro() || ! function_exists( 'WC' ) ) {
301 return false;
302 }
303
304 if ( ! current_user_can( 'install_plugins' ) ) {
305 return false;
306 }
307
308 if ( ! in_array( $this->current_screen_id, [ 'edit-product', 'woocommerce_page_wc-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
309 return false;
310 }
311
312 if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
313 return false;
314 }
315
316 if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
317 return false;
318 }
319
320 $options = [
321 'title' => esc_html__( 'Using WooCommerce?', 'elementor' ),
322 'description' => esc_html__( 'With Elementor Pro’s WooCommerce Builder, you’ll be able to design your store without coding!', 'elementor' ),
323 'id' => $notice_id,
324
325 'button' => [
326 'text' => esc_html__( 'Learn More', 'elementor' ),
327 'url' => 'https://go.elementor.com/plugin-promotion-woocommerce/',
328 'new_tab' => true,
329 'type' => 'cta',
330 ],
331 ];
332
333 $this->print_admin_notice( $options );
334
335 return true;
336 }
337
338 private function notice_cf7_promote() {
339 $notice_id = 'cf7_promote';
340
341 if ( Utils::has_pro() || ! defined( 'WPCF7_VERSION' ) ) {
342 return false;
343 }
344
345 if ( ! current_user_can( 'install_plugins' ) ) {
346 return false;
347 }
348
349 if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_wpcf7', 'contact_page_wpcf7-integration' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
350 return false;
351 }
352
353 if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
354 return false;
355 }
356
357 if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
358 return false;
359 }
360
361 $options = [
362 'title' => esc_html__( 'Using Elementor & Contact Form 7?', 'elementor' ),
363 'description' => esc_html__( 'Try out Elementor Pro and design your forms visually with one powerful tool.', 'elementor' ),
364
365 'id' => $notice_id,
366 'button' => [
367 'text' => esc_html__( 'Learn More', 'elementor' ),
368 'url' => 'https://go.elementor.com/plugin-promotion-contactform7/',
369 'new_tab' => true,
370 'type' => 'cta',
371 ],
372 ];
373
374 $this->print_admin_notice( $options );
375
376 return true;
377 }
378
379 private function notice_mc4wp_promote() {
380 $notice_id = 'mc4wp_promote';
381
382 if ( Utils::has_pro() || ! defined( 'MC4WP_VERSION' ) ) {
383 return false;
384 }
385
386 if ( ! current_user_can( 'install_plugins' ) ) {
387 return false;
388 }
389
390 if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_mailchimp-for-wp', 'mc4wp_page_mailchimp-for-wp-forms', 'mc4wp_page_mailchimp-for-wp-integrations', 'mc4wp_page_mailchimp-for-wp-other', 'mc4wp_page_mailchimp-for-wp-extensions' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
391 return false;
392 }
393
394 if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
395 return false;
396 }
397
398 if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
399 return false;
400 }
401
402 $options = [
403 'title' => esc_html__( 'Want to design better MailChimp forms?', 'elementor' ),
404 'description' => esc_html__( 'Use Elementor Pro and enjoy unlimited integrations, visual design, templates and more.', 'elementor' ),
405 'dismissible' => true,
406 'id' => $notice_id,
407
408 'button' => [
409 'text' => esc_html__( 'Learn More', 'elementor' ),
410 'url' => 'https://go.elementor.com/plugin-promotion-mc4wp/',
411 'new_tab' => true,
412 'type' => 'cta',
413 ],
414 ];
415
416 $this->print_admin_notice( $options );
417
418 return true;
419 }
420
421 private function notice_popup_maker_promote() {
422 $notice_id = 'popup_maker_promote';
423
424 if ( Utils::has_pro() || ! class_exists( 'Popup_Maker' ) ) {
425 return false;
426 }
427
428 if ( ! current_user_can( 'install_plugins' ) ) {
429 return false;
430 }
431
432 if ( ! in_array( $this->current_screen_id, [ 'edit-popup', 'popup_page_pum-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
433 return false;
434 }
435
436 if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
437 return false;
438 }
439
440 if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
441 return false;
442 }
443
444 $options = [
445 'title' => esc_html__( 'Using popups on your site?', 'elementor' ),
446 'description' => esc_html__( 'Build outstanding popups using Elementor Pro and get more leads, sales and subscribers.', 'elementor' ),
447 'dismissible' => true,
448 'id' => $notice_id,
449
450 'button' => [
451 'text' => esc_html__( 'Learn More', 'elementor' ),
452 'url' => 'https://go.elementor.com/plugin-promotion-popupmaker/',
453 'new_tab' => true,
454 'type' => 'cta',
455 ],
456 ];
457
458 $this->print_admin_notice( $options );
459
460 return true;
461 }
462
463 private function notice_role_manager_promote() {
464 $notice_id = 'role_manager_promote';
465
466 if ( Utils::has_pro() ) {
467 return false;
468 }
469
470 if ( ! current_user_can( 'manage_options' ) ) {
471 return false;
472 }
473
474 if ( 'elementor_page_elementor-role-manager' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
475 return false;
476 }
477
478 $users = new \WP_User_Query( [
479 'fields' => 'ID',
480 'number' => 10,
481 ] );
482
483 if ( 5 > $users->get_total() ) {
484 return false;
485 }
486
487 $options = [
488 'title' => esc_html__( 'Managing a multi-user site?', 'elementor' ),
489 'description' => esc_html__( 'With Elementor Pro, you can control user access and make sure no one messes up your design.', 'elementor' ),
490 'id' => $notice_id,
491
492 'button' => [
493 'text' => esc_html__( 'Learn More', 'elementor' ),
494 'url' => 'https://go.elementor.com/plugin-promotion-role-manager/',
495 'new_tab' => true,
496 'type' => 'cta',
497 ],
498 ];
499
500 $this->print_admin_notice( $options );
501
502 return true;
503 }
504
505 public function print_admin_notice( array $options ) {
506 $default_options = [
507 'id' => null,
508 'title' => '',
509 'description' => '',
510 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
511 'type' => '',
512 'dismissible' => true,
513 'icon' => 'eicon-elementor',
514 'button' => [],
515 'button_secondary' => [],
516 ];
517
518 $options = array_replace_recursive( $default_options, $options );
519
520 $notice_classes = $options['classes'];
521 $dismiss_button = '';
522 $icon = '';
523
524 if ( $options['type'] ) {
525 $notice_classes[] = 'e-notice--' . $options['type'];
526 }
527
528 if ( $options['dismissible'] ) {
529 $label = esc_html__( 'Dismiss', 'elementor' );
530 $notice_classes[] = 'e-notice--dismissible';
531 $dismiss_button = '<i class="e-notice__dismiss" role="button" aria-label="' . $label . '" tabindex="0"></i>';
532 }
533
534 if ( $options['icon'] ) {
535 $notice_classes[] = 'e-notice--extended';
536 $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
537 }
538
539 $wrapper_attributes = [
540 'class' => $notice_classes,
541 ];
542
543 if ( $options['id'] ) {
544 $wrapper_attributes['data-notice_id'] = $options['id'];
545 }
546 ?>
547 <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
548 <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
549 <div class="e-notice__aside">
550 <?php echo $icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
551 </div>
552 <div class="e-notice__content">
553 <?php if ( $options['title'] ) { ?>
554 <h3><?php echo wp_kses_post( $options['title'] ); ?></h3>
555 <?php } ?>
556
557 <?php if ( $options['description'] ) { ?>
558 <p><?php echo wp_kses_post( $options['description'] ); ?></p>
559 <?php } ?>
560
561 <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
562 <div class="e-notice__actions">
563 <?php
564 foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
565 if ( empty( $button_settings['variant'] ) && $index ) {
566 $button_settings['variant'] = 'outline';
567 }
568
569 if ( empty( $button_settings['text'] ) ) {
570 continue;
571 }
572
573 $button = new Button( $button_settings );
574 $button->print_button();
575 } ?>
576 </div>
577 <?php } ?>
578 </div>
579 </div>
580 <?php }
581
582 public function admin_notices() {
583 $this->install_time = Plugin::$instance->get_install_time();
584 $this->current_screen_id = get_current_screen()->id;
585
586 foreach ( $this->plain_notices as $notice ) {
587 $method_callback = "notice_{$notice}";
588 if ( $this->$method_callback() ) {
589 return;
590 }
591 }
592
593 /** @var Base_Notice $notice_instance */
594 foreach ( $this->get_notices() as $notice_instance ) {
595 if ( ! $notice_instance->should_print() ) {
596 continue;
597 }
598
599 $this->print_admin_notice( $notice_instance->get_config() );
600
601 // It exits the method to make sure it prints only one notice.
602 return;
603 }
604 }
605
606 /**
607 * @since 2.9.0
608 * @access public
609 */
610 public function __construct() {
611 add_action( 'admin_notices', [ $this, 'admin_notices' ], 20 );
612 }
613
614 /**
615 * Get module name.
616 *
617 * Retrieve the module name.
618 *
619 * @since 2.9.0
620 * @access public
621 *
622 * @return string Module name.
623 */
624 public function get_name() {
625 return 'admin-notices';
626 }
627 }
628