PluginProbe
Elementor Website Builder – more than just a page builder / 3.27.4
Elementor Website Builder – more than just a page builder v3.27.4
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
← All changes | core/admin/admin-notices.php +56 -546 4.1.43.27.4 View file →
@@ -3,10 +3,8 @@
3 3
4 4 use Elementor\Api;
5 5 use Elementor\Core\Admin\UI\Components\Button;
6 6 use Elementor\Core\Base\Module;
7 -use Elementor\Core\Upgrade\Manager;
8 -use Elementor\Core\Utils\Hints;
9 7 use Elementor\Core\Utils\Promotions\Filtered_Promotions_Manager;
10 8 use Elementor\Plugin;
11 9 use Elementor\Settings;
12 10 use Elementor\Tracker;
@@ -12,8 +10,9 @@
12 10 use Elementor\Tracker;
13 11 use Elementor\User;
14 12 use Elementor\Utils;
15 13 use Elementor\Core\Admin\Notices\Base_Notice;
14 +use Elementor\Core\Admin\Notices\Elementor_Dev_Notice;
16 15
17 16 if ( ! defined( 'ABSPATH' ) ) {
18 17 exit; // Exit if accessed directly.
19 18 }
@@ -20,25 +19,18 @@
20 19
21 20 class Admin_Notices extends Module {
22 21
23 22 const DEFAULT_EXCLUDED_PAGES = [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ];
24 - const LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID = 'local_google_fonts_disabled';
25 - const LOCAL_GOOGLE_FONTS_NOTICE_MIN_VERSION = '3.33.3';
26 23
27 - const EXIT_EARLY_FOR_BACKWARD_COMPATIBILITY = false;
28 -
29 24 private $plain_notices = [
30 25 'api_notice',
31 26 'api_upgrade_plugin',
32 27 'tracker',
33 - 'tracker_last_update',
34 28 'rate_us_feedback',
35 29 'role_manager_promote',
36 30 'experiment_promotion',
37 31 'site_mailer_promotion',
38 32 'plugin_image_optimization',
39 - 'ally_pages_promotion',
40 - self::LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID,
41 33 ];
42 34
43 35 private $elementor_pages_count = null;
44 36
@@ -46,8 +38,12 @@
46 38
47 39 private $current_screen_id = null;
48 40
49 41 private function get_notices() {
42 + $notices = [
43 + new Elementor_Dev_Notice(),
44 + ];
45 +
50 46 /**
51 47 * Admin notices.
52 48 *
53 49 * Filters Elementor admin notices.
@@ -56,9 +52,9 @@
56 52 * admin notice or to add new notices for Elementor add-ons.
57 53 *
58 54 * @param array $notices A list of notice classes.
59 55 */
60 - $notices = apply_filters( 'elementor/core/admin/notices', [] );
56 + $notices = apply_filters( 'elementor/core/admin/notices', $notices );
61 57
62 58 return $notices;
63 59 }
64 60
@@ -98,9 +94,9 @@
98 94 if ( ! current_user_can( 'update_plugins' ) ) {
99 95 return false;
100 96 }
101 97
102 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
98 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
103 99 return false;
104 100 }
105 101
106 102 // Check for upgrades.
@@ -138,16 +134,16 @@
138 134 $message = sprintf(
139 135 /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text. */
140 136 __( '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' ),
141 137 esc_url( $details_url ),
142 - sprintf(
138 + esc_attr( sprintf(
143 139 /* translators: %s: Elementor version. */
144 - esc_attr__( 'View Elementor version %s details', 'elementor' ),
140 + __( 'View Elementor version %s details', 'elementor' ),
145 141 $new_version
146 - ),
142 + ) ),
147 143 $new_version,
148 144 esc_url( $upgrade_url ),
149 - esc_attr__( 'Update Now', 'elementor' )
145 + esc_attr( esc_html__( 'Update Now', 'elementor' ) )
150 146 );
151 147
152 148 $options = [
153 149 'title' => esc_html__( 'Update Notification', 'elementor' ),
@@ -174,9 +170,9 @@
174 170 if ( ! current_user_can( 'manage_options' ) ) {
175 171 return false;
176 172 }
177 173
178 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
174 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
179 175 return false;
180 176 }
181 177
182 178 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
@@ -220,9 +216,9 @@
220 216 // TODO: Skip for development env.
221 217 $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
222 218 $optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
223 219
224 - $tracker_description_text = esc_html__( 'Become a super contributor by helping us understand how you use our service to enhance your experience and improve our product.', 'elementor' );
220 + $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' );
225 221
226 222 /**
227 223 * Tracker admin description text.
228 224 *
@@ -236,11 +232,10 @@
236 232
237 233 $message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
238 234
239 235 $options = [
240 - 'title' => esc_html__( 'Want to shape the future of web creation?', 'elementor' ),
236 + 'title' => esc_html__( 'Love using Elementor?', 'elementor' ),
241 237 'description' => $message,
242 - 'dismissible' => false,
243 238 'button' => [
244 239 'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
245 240 'url' => $optin_url,
246 241 'type' => 'cta',
@@ -257,49 +252,8 @@
257 252
258 253 return true;
259 254 }
260 255
261 - private function notice_tracker_last_update() {
262 - if ( ! current_user_can( 'manage_options' ) ) {
263 - return false;
264 - }
265 -
266 - if ( ! Tracker::has_terms_changed() ) {
267 - return false;
268 - }
269 -
270 - $notice_id = 'tracker_last_update_' . Tracker::LAST_TERMS_UPDATED;
271 -
272 - if ( User::is_user_notice_viewed( $notice_id ) ) {
273 - return false;
274 - }
275 -
276 - $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
277 -
278 - $message = esc_html__( 'We\'re updating our Terms and Conditions to include the collection of usage and behavioral data. This information helps us understand how you use Elementor so we can make informed improvements to the product.', 'elementor' );
279 -
280 - $options = [
281 - 'id' => $notice_id,
282 - 'title' => esc_html__( 'Update regarding usage data collection', 'elementor' ),
283 - 'description' => $message,
284 - 'button' => [
285 - 'text' => esc_html__( 'Opt in', 'elementor' ),
286 - 'url' => $optin_url,
287 - 'type' => 'cta',
288 - ],
289 - 'button_secondary' => [
290 - 'text' => esc_html__( 'Learn more', 'elementor' ),
291 - 'url' => 'https://go.elementor.com/wp-dash-update-usage-notice/',
292 - 'new_tab' => true,
293 - 'type' => 'cta',
294 - ],
295 - ];
296 -
297 - $this->print_admin_notice( $options );
298 -
299 - return true;
300 - }
301 -
302 256 private function notice_rate_us_feedback() {
303 257 $notice_id = 'rate_us_feedback';
304 258
305 259 if ( ! current_user_can( 'manage_options' ) ) {
@@ -316,9 +270,8 @@
316 270
317 271 $dismiss_url = add_query_arg( [
318 272 'action' => 'elementor_set_admin_notice_viewed',
319 273 'notice_id' => esc_attr( $notice_id ),
320 - '_wpnonce' => wp_create_nonce( 'elementor_set_admin_notice_viewed' ),
321 274 ], admin_url( 'admin-post.php' ) );
322 275
323 276 $options = [
324 277 'title' => esc_html__( 'Congrats!', 'elementor' ),
@@ -396,10 +349,10 @@
396 349 }
397 350
398 351 $experiments = Plugin::$instance->experiments;
399 352 $is_all_performance_features_active = (
400 - $experiments->is_feature_active( 'e_font_icon_svg' ) &&
401 - $experiments->is_feature_active( 'e_optimized_markup' )
353 + $experiments->is_feature_active( 'e_element_cache' ) &&
354 + $experiments->is_feature_active( 'e_font_icon_svg' )
402 355 );
403 356
404 357 if ( $is_all_performance_features_active ) {
405 358 return false;
@@ -427,9 +380,9 @@
427 380 return true;
428 381 }
429 382
430 383 private function site_has_forms_plugins() {
431 - return defined( 'WPFORMS_VERSION' ) || defined( 'WPCF7_VERSION' ) || defined( 'FLUENTFORM_VERSION' ) || class_exists( '\GFCommon' ) || class_exists( '\Ninja_Forms' ) || function_exists( 'load_formidable_forms' ) || did_action( 'metform/after_load' ) || defined( 'FORMINATOR_PLUGIN_BASENAME' );
384 + return defined( 'WPFORMS_VERSION' ) || defined( 'WPCF7_VERSION' ) || defined( 'FLUENTFORM_VERSION' ) || class_exists( '\GFCommon' ) || class_exists( '\Ninja_Forms' ) || function_exists( 'load_formidable_forms' );
432 385 }
433 386
434 387 private function site_has_woocommerce() {
435 388 return class_exists( 'WooCommerce' );
@@ -434,186 +387,8 @@
434 387 private function site_has_woocommerce() {
435 388 return class_exists( 'WooCommerce' );
436 389 }
437 390
438 - private function get_installed_form_plugin_name() {
439 - static $detected_form_plugin = null;
440 -
441 - if ( null !== $detected_form_plugin ) {
442 - return $detected_form_plugin;
443 - }
444 -
445 - $form_plugins_constants_to_name_mapper = [
446 - 'WPFORMS_VERSION' => 'WPForms',
447 - 'WPCF7_VERSION' => 'Contact Form 7',
448 - ];
449 -
450 - foreach ( $form_plugins_constants_to_name_mapper as $constant => $name ) {
451 - if ( defined( $constant ) ) {
452 - $detected_form_plugin = $name;
453 - return $detected_form_plugin;
454 - }
455 - }
456 -
457 - $form_plugins_classes_to_name_mapper = [
458 - '\GFCommon' => 'Gravity Forms',
459 - '\Ninja_Forms' => 'Ninja Forms',
460 - ];
461 -
462 - foreach ( $form_plugins_classes_to_name_mapper as $class => $name ) {
463 - if ( class_exists( $class ) ) {
464 - $detected_form_plugin = $name;
465 - return $detected_form_plugin;
466 - }
467 - }
468 -
469 - $detected_form_plugin = false;
470 - return $detected_form_plugin;
471 - }
472 -
473 - private function notice_local_google_fonts_disabled() {
474 -
475 - if ( ! $this->is_elementor_page() && ! $this->is_elementor_admin_screen() ) {
476 - return false;
477 - }
478 -
479 - if ( ! Manager::had_install_prior_to( self::LOCAL_GOOGLE_FONTS_NOTICE_MIN_VERSION ) ) {
480 - return false;
481 - }
482 -
483 - if ( User::is_user_notice_viewed( self::LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID ) ) {
484 - return false;
485 - }
486 -
487 - $is_local_gf_enabled = (bool) get_option( 'elementor_local_google_fonts', '0' );
488 -
489 - if ( $is_local_gf_enabled ) {
490 - return false;
491 - }
492 -
493 - $options = [
494 - 'title' => esc_html__( 'Important: Local Google Fonts Settings in Elementor', 'elementor' ),
495 - 'description' => esc_html__( 'Please note: The "Load Google Fonts Locally" feature has been disabled by default on all websites. To turn it back on, go to Elementor → Settings → Performance → Enable Load Google Fonts Locally.', 'elementor' ),
496 - 'id' => self::LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID,
497 - 'type' => '',
498 - 'button' => [
499 - 'text' => esc_html__( 'Take me there', 'elementor' ),
500 - 'url' => '../wp-admin/admin.php?page=elementor-settings#tab-performance',
501 - 'new_tab' => false,
502 - 'type' => 'cta',
503 - ],
504 - 'button_secondary' => [
505 - 'text' => esc_html__( 'Learn more', 'elementor' ),
506 - 'url' => 'https://go.elementor.com/wp-dash-google-fonts-locally-notice/',
507 - 'new_tab' => true,
508 - 'type' => 'cta',
509 - ],
510 - ];
511 -
512 - $this->print_admin_notice( $options );
513 -
514 - return true;
515 - }
516 -
517 - private function notice_ally_pages_promotion() {
518 - global $pagenow;
519 - $notice_id = 'ally_pages_promotion';
520 -
521 - if ( 'edit.php' !== $pagenow || empty( $_GET['post_type'] ) || 'page' !== $_GET['post_type'] ) {
522 - return false;
523 - }
524 -
525 - if ( ! current_user_can( 'manage_options' ) ) {
526 - return false;
527 - }
528 -
529 - if ( User::is_user_notice_viewed( $notice_id ) ) {
530 - return false;
531 - }
532 -
533 - $plugin_slug = 'pojo-accessibility';
534 - $plugin_file_path = 'pojo-accessibility/pojo-accessibility.php';
535 -
536 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
537 - $is_installed = Hints::is_plugin_installed( $plugin_slug );
538 - $is_active = Hints::is_plugin_active( $plugin_slug );
539 -
540 - if ( $is_active ) {
541 - return false;
542 - }
543 -
544 - if ( $one_subscription ) {
545 - $learn_more_url = 'https://go.elementor.com/acc-plg-learn-more-one';
546 -
547 - if ( ! $is_installed ) {
548 - $description = esc_html__( 'Make sure your site has an accessibility statement page. Install Ally, included in ONE, to create it in a few clicks.', 'elementor' );
549 - $button_text = esc_html__( 'Install now', 'elementor' );
550 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
551 - $campaign_data = [
552 - 'name' => 'elementor_ea11y_campaign',
553 - 'campaign' => 'acc-statement-plg-pages-one-install',
554 - 'source' => 'wp-pages-one-install',
555 - 'medium' => 'wp-dash-one',
556 - ];
557 - } elseif ( ! $is_active ) {
558 - $description = esc_html__( 'Your ONE subscription includes Ally. Activate it to create your accessibility statement page quickly.', 'elementor' );
559 - $button_text = esc_html__( 'Activate now', 'elementor' );
560 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
561 - $campaign_data = [
562 - 'name' => 'elementor_ea11y_campaign',
563 - 'campaign' => 'acc-statement-plg-pages-one-activate',
564 - 'source' => 'wp-pages-one-activate',
565 - 'medium' => 'wp-dash-one',
566 - ];
567 - }
568 - } else {
569 - $description = esc_html__( "Create a more inclusive site experience for all your visitors. With Ally, it's easy to add your statement page in just a few clicks.", 'elementor' );
570 - $learn_more_url = 'https://go.elementor.com/acc-plg-learn-more';
571 -
572 - if ( ! $is_installed ) {
573 - $button_text = esc_html__( 'Install now', 'elementor' );
574 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
575 - $campaign_data = [
576 - 'name' => 'elementor_ea11y_campaign',
577 - 'campaign' => 'acc-statement-plg-pages-install',
578 - 'source' => 'wp-pages-install',
579 - 'medium' => 'wp-dash',
580 - ];
581 - } elseif ( ! $is_active ) {
582 - $button_text = esc_html__( 'Activate now', 'elementor' );
583 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
584 - $campaign_data = [
585 - 'name' => 'elementor_ea11y_campaign',
586 - 'campaign' => 'acc-statement-plg-pages-activate',
587 - 'source' => 'wp-pages-activate',
588 - 'medium' => 'wp-dash',
589 - ];
590 - }
591 - }
592 -
593 - $options = [
594 - 'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
595 - 'description' => $description,
596 - 'id' => $notice_id,
597 - 'type' => 'cta',
598 - 'button' => [
599 - 'text' => $button_text,
600 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
601 - 'type' => 'cta',
602 - ],
603 - 'button_secondary' => [
604 - 'text' => esc_html__( 'Learn more', 'elementor' ),
605 - 'url' => $learn_more_url,
606 - 'new_tab' => true,
607 - 'type' => 'cta',
608 - ],
609 - ];
610 -
611 - $this->print_admin_notice( $options );
612 -
613 - return true;
614 - }
615 -
616 391 private function notice_site_mailer_promotion() {
617 392 $notice_id = 'site_mailer_promotion';
618 393 $has_forms = $this->site_has_forms_plugins();
619 394 $has_woocommerce = $this->site_has_woocommerce();
@@ -621,9 +396,9 @@
621 396 if ( ! $has_forms && ! $has_woocommerce ) {
622 397 return false;
623 398 }
624 399
625 - if ( ! $this->is_elementor_page() && ! $this->is_elementor_admin_screen() ) {
400 + if ( ! $this->is_elementor_page() && ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'dashboard' ], true ) ) {
626 401 return false;
627 402 }
628 403
629 404 if ( ( Utils::has_pro() && ! $has_woocommerce ) || ! current_user_can( 'install_plugins' ) || User::is_user_notice_viewed( $notice_id ) ) {
@@ -629,152 +404,40 @@
629 404 if ( ( Utils::has_pro() && ! $has_woocommerce ) || ! current_user_can( 'install_plugins' ) || User::is_user_notice_viewed( $notice_id ) ) {
630 405 return false;
631 406 }
632 407
408 + $plugin_file_path = 'site-mailer/site-mailer.php';
633 409 $plugin_slug = 'site-mailer';
634 - $plugin_file_path = 'site-mailer/site-mailer.php';
635 410
636 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
637 - $is_woocommerce = $this->should_render_woocommerce_hint( $has_forms, $has_woocommerce );
638 - $is_installed = Hints::is_plugin_installed( $plugin_slug );
639 - $is_active = Hints::is_plugin_active( $plugin_slug );
640 -
641 - if ( $is_active ) {
411 + $cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
412 + if ( empty( $cta_data ) ) {
642 413 return false;
643 414 }
644 415
645 - if ( $one_subscription ) {
646 - if ( $is_woocommerce ) {
647 - $title = esc_html__( 'Improve transactional email deliverability', 'elementor' );
648 -
649 - if ( ! $is_installed ) {
650 - $description = esc_html__( 'Use Site Mailer to ensure store emails like purchase confirmations and shipping updates reach the inbox every time. Included in your ONE subscription.', 'elementor' );
651 - $button_text = esc_html__( 'Install now', 'elementor' );
652 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
653 - $campaign_data = [
654 - 'name' => 'elementor_site_mailer_campaign',
655 - 'campaign' => 'sm-plg-one',
656 - 'source' => 'sm-core-woo-one-install',
657 - 'medium' => 'wp-dash',
658 - ];
659 - } elseif ( ! $is_active ) {
660 - $description = esc_html__( 'Site Mailer is installed and included in your ONE subscription. Activate it to ensure store emails like purchase confirmations and shipping updates reach the inbox every time.', 'elementor' );
661 - $button_text = esc_html__( 'Activate now', 'elementor' );
662 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
663 - $campaign_data = [
664 - 'name' => 'elementor_site_mailer_campaign',
665 - 'campaign' => 'sm-plg-one',
666 - 'source' => 'sm-core-woo-one-activate',
667 - 'medium' => 'wp-dash',
668 - ];
669 - }
670 - } else {
671 - $title = esc_html__( 'Keep your form emails out of the spam folder', 'elementor' );
672 -
673 - if ( ! $is_installed ) {
674 - $description = esc_html__( 'Use Site Mailer to ensure emails reach the inbox and track delivery with built-in logs. Included in your ONE subscription.', 'elementor' );
675 - $button_text = esc_html__( 'Install now', 'elementor' );
676 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
677 - $campaign_data = [
678 - 'name' => 'elementor_site_mailer_campaign',
679 - 'campaign' => 'sm-plg-one',
680 - 'source' => 'sm-core-form-one-install',
681 - 'medium' => 'wp-dash',
682 - ];
683 - } elseif ( ! $is_active ) {
684 - $description = esc_html__( 'Use Site Mailer to ensure emails reach the inbox and track delivery with built-in logs. Site Mailer is included in your ONE subscription. Activate it to continue.', 'elementor' );
685 - $button_text = esc_html__( 'Activate now', 'elementor' );
686 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
687 - $campaign_data = [
688 - 'name' => 'elementor_site_mailer_campaign',
689 - 'campaign' => 'sm-plg-one',
690 - 'source' => 'sm-core-form-one-activate',
691 - 'medium' => 'wp-dash',
692 - ];
693 - }
694 - }
695 - // phpcs:ignore Universal.ControlStructures.DisallowLonelyIf.Found
696 - } else {
697 - if ( $is_woocommerce ) {
698 - $title = esc_html__( 'Improve Transactional Email Deliverability', 'elementor' );
699 - $description = esc_html__( "Use Elementor's Site Mailer to ensure your store emails like purchase confirmations, shipping updates and more are reliably delivered.", 'elementor' );
700 -
701 - if ( ! $is_installed ) {
702 - $button_text = esc_html__( 'Install now', 'elementor' );
703 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
704 - $campaign_data = [
705 - 'name' => 'elementor_site_mailer_campaign',
706 - 'campaign' => 'sm-plg',
707 - 'source' => 'sm-core-woo-install',
708 - 'medium' => 'wp-dash',
709 - ];
710 - } elseif ( ! $is_active ) {
711 - $button_text = esc_html__( 'Activate now', 'elementor' );
712 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
713 - $campaign_data = [
714 - 'name' => 'elementor_site_mailer_campaign',
715 - 'campaign' => 'sm-plg',
716 - 'source' => 'sm-core-woo-activate',
717 - 'medium' => 'wp-dash',
718 - ];
719 - }
720 - } else {
721 - $title = esc_html__( 'Ensure your form emails avoid the spam folder!', 'elementor' );
722 - $description = esc_html__( 'Use Site Mailer for improved email deliverability, detailed email logs, and an easy setup.', 'elementor' );
723 -
724 - if ( ! $is_installed ) {
725 - $button_text = esc_html__( 'Install now', 'elementor' );
726 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
727 - $campaign_data = [
728 - 'name' => 'elementor_site_mailer_campaign',
729 - 'campaign' => 'sm-plg',
730 - 'source' => 'sm-core-form-install',
731 - 'medium' => 'wp-dash',
732 - ];
733 - } elseif ( ! $is_active ) {
734 - $button_text = esc_html__( 'Activate now', 'elementor' );
735 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
736 - $campaign_data = [
737 - 'name' => 'elementor_site_mailer_campaign',
738 - 'campaign' => 'sm-plg',
739 - 'source' => 'sm-core-form-activate',
740 - 'medium' => 'wp-dash',
741 - ];
742 - }
743 - }
744 - }
745 -
746 - $learn_more_url = $one_subscription && $is_woocommerce
747 - ? 'https://go.elementor.com/sm-woo-learn-more-one'
748 - : 'https://go.elementor.com/sm-core-form/';
749 -
750 416 $options = [
751 - 'title' => $title,
752 - 'description' => $description,
417 + 'title' => esc_html__( 'Ensure your form emails avoid the spam folder!', 'elementor' ),
418 + 'description' => esc_html__( 'Use Site Mailer for improved email deliverability, detailed email logs, and an easy setup.', 'elementor' ),
753 419 'id' => $notice_id,
754 420 'type' => 'cta',
755 421 'button' => [
756 - 'text' => $button_text,
757 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
422 + 'text' => $cta_data['text'],
423 + 'url' => $cta_data['url'],
758 424 'type' => 'cta',
759 - 'data' => [
760 - 'campaign' => $campaign_data['campaign'],
761 - 'source' => $campaign_data['source'],
762 - 'medium' => $campaign_data['medium'],
763 - ],
764 425 ],
765 426 'button_secondary' => [
766 427 'text' => esc_html__( 'Learn more', 'elementor' ),
767 - 'url' => $learn_more_url,
428 + 'url' => 'https://go.elementor.com/sm-core-form/',
768 429 'new_tab' => true,
769 430 'type' => 'cta',
770 431 ],
771 432 ];
772 433
773 - if ( $is_woocommerce ) {
434 + if ( $this->should_render_woocommerce_hint( $has_forms, $has_woocommerce ) ) {
774 435 // We include WP's default notice class so it will be properly handled by WP's js handler
775 436 // And add a new one to distinguish between the two types of notices
776 437 $options['classes'] = [ 'notice', 'e-notice', 'sm-notice-wc' ];
438 + $options['title'] = esc_html__( 'Improve Transactional Email Deliverability', 'elementor' );
439 + $options['description'] = esc_html__( 'Use Elementor\'s Site Mailer to ensure your store emails like purchase confirmations, shipping updates and more are reliably delivered.', 'elementor' );
777 440 }
778 441
779 442 $this->print_admin_notice( $options );
780 443
@@ -793,13 +456,9 @@
793 456 if ( $has_forms && $has_woocommerce && Utils::has_pro() ) {
794 457 return true;
795 458 }
796 459
797 - if ( ! $has_woocommerce ) {
798 - return false;
799 - }
800 -
801 - return (bool) wp_rand( 0, 1 );
460 + return (bool) mt_rand( 0, 1 );
802 461 }
803 462
804 463 private function is_elementor_page(): bool {
805 464 return 0 === strpos( $this->current_screen_id, 'elementor_page' );
@@ -804,38 +463,19 @@
804 463 private function is_elementor_page(): bool {
805 464 return 0 === strpos( $this->current_screen_id, 'elementor_page' );
806 465 }
807 466
808 - private function is_elementor_admin_screen(): bool {
809 - return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library' ], true );
810 - }
811 -
812 - private function is_elementor_admin_screen_with_system_info(): bool {
813 - return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true );
814 - }
815 - private function get_plugin_button_install_url( $plugin_slug ) {
816 - return wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $plugin_slug ), 'install-plugin_' . $plugin_slug );
817 - }
818 -
819 - private function get_plugin_button_activate_url( $plugin_file_path ) {
820 - return wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file_path . '&amp;plugin_status=all&amp;paged=1&amp;s', 'activate-plugin_' . $plugin_file_path );
821 - }
822 -
823 - private function get_plugin_button_connect_url( $plugin_settings_page ) {
824 - return self_admin_url( $plugin_settings_page );
825 - }
826 -
827 467 private function get_plugin_cta_data( $plugin_slug, $plugin_file_path ) {
828 - if ( Hints::is_plugin_active( $plugin_slug ) ) {
468 + if ( is_plugin_active( $plugin_file_path ) ) {
829 469 return false;
830 470 }
831 471
832 - if ( Hints::is_plugin_installed( $plugin_slug ) ) {
833 - $url = $this->get_plugin_button_activate_url( $plugin_file_path );
834 - $cta_text = esc_html__( 'Activate now', 'elementor' );
472 + if ( $this->is_plugin_installed( $plugin_file_path ) ) {
473 + $url = wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file_path . '&amp;plugin_status=all&amp;paged=1&amp;s', 'activate-plugin_' . $plugin_file_path );
474 + $cta_text = esc_html__( 'Activate Plugin', 'elementor' );
835 475 } else {
836 - $url = $this->get_plugin_button_install_url( $plugin_slug );
837 - $cta_text = esc_html__( 'Install now', 'elementor' );
476 + $url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $plugin_slug ), 'install-plugin_' . $plugin_slug );
477 + $cta_text = esc_html__( 'Install Plugin', 'elementor' );
838 478 }
839 479
840 480 return [
841 481 'url' => $url,
@@ -842,11 +482,9 @@
842 482 'text' => $cta_text,
843 483 ];
844 484 }
845 485
846 - /**
847 - * For testing purposes
848 - */
486 + // For testing purposes
849 487 public function get_elementor_version() {
850 488 return ELEMENTOR_VERSION;
851 489 }
852 490
@@ -856,16 +494,12 @@
856 494 if ( 'upload' !== $this->current_screen_id ) {
857 495 return false;
858 496 }
859 497
860 - if ( ! current_user_can( 'manage_options' ) ) {
498 + if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
861 499 return false;
862 500 }
863 501
864 - if ( User::is_user_notice_viewed( $notice_id ) ) {
865 - return false;
866 - }
867 -
868 502 $attachments = new \WP_Query( [
869 503 'post_type' => 'attachment',
870 504 'post_status' => 'any',
871 505 'fields' => 'ids',
@@ -874,79 +508,26 @@
874 508 if ( 1 > $attachments->found_posts ) {
875 509 return false;
876 510 }
877 511
512 + $plugin_file_path = 'image-optimization/image-optimization.php';
878 513 $plugin_slug = 'image-optimization';
879 - $plugin_file_path = 'image-optimization/image-optimization.php';
880 514
881 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
882 - $is_installed = Hints::is_plugin_installed( $plugin_slug );
883 - $is_active = Hints::is_plugin_active( $plugin_slug );
515 + $cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
884 516
885 - if ( $is_active ) {
517 + if ( empty( $cta_data ) ) {
886 518 return false;
887 519 }
888 520
889 - if ( $one_subscription ) {
890 - if ( ! $is_installed ) {
891 - $description = esc_html__( 'Automatically optimize images to improve site speed and performance. Included with your ONE subscription.', 'elementor' );
892 - $button_text = esc_html__( 'Install now', 'elementor' );
893 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
894 - $campaign_data = [
895 - 'name' => 'elementor_image_optimization_campaign',
896 - 'campaign' => 'io-plg-one',
897 - 'source' => 'io-wp-media-library-one-install',
898 - 'medium' => 'wp-dash-one',
899 - ];
900 - } elseif ( ! $is_active ) {
901 - $description = esc_html__( 'Your ONE subscription includes Image Optimizer. Activate it to optimize images and improve site performance.', 'elementor' );
902 - $button_text = esc_html__( 'Activate now', 'elementor' );
903 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
904 - $campaign_data = [
905 - 'name' => 'elementor_image_optimization_campaign',
906 - 'campaign' => 'io-plg-one',
907 - 'source' => 'io-wp-media-library-one-activate',
908 - 'medium' => 'wp-dash-one',
909 - ];
910 - }
911 - } else {
912 - $description = esc_html__( 'Automatically compress and optimize images, resize larger files, or convert to WebP. Optimize images individually, in bulk, or on upload.', 'elementor' );
913 -
914 - if ( ! $is_installed ) {
915 - $button_text = esc_html__( 'Install now', 'elementor' );
916 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
917 - $campaign_data = [
918 - 'name' => 'elementor_image_optimization_campaign',
919 - 'campaign' => 'io-plg',
920 - 'source' => 'io-wp-media-library-install',
921 - 'medium' => 'wp-dash',
922 - ];
923 - } elseif ( ! $is_active ) {
924 - $button_text = esc_html__( 'Activate now', 'elementor' );
925 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
926 - $campaign_data = [
927 - 'name' => 'elementor_image_optimization_campaign',
928 - 'campaign' => 'io-plg',
929 - 'source' => 'io-wp-media-library-activate',
930 - 'medium' => 'wp-dash',
931 - ];
932 - }
933 - }
934 -
935 521 $options = [
936 - 'title' => esc_html__( 'Speed up your website with Image Optimizer', 'elementor' ),
937 - 'description' => $description,
522 + 'title' => esc_html__( 'Speed up your website with Image Optimizer by Elementor', 'elementor' ),
523 + 'description' => esc_html__( 'Automatically compress and optimize images, resize larger files, or convert to WebP. Optimize images individually, in bulk, or on upload.', 'elementor' ),
938 524 'id' => $notice_id,
939 525 'type' => 'cta',
940 - 'button' => [
941 - 'text' => $button_text,
942 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
526 + 'button_secondary' => [
527 + 'text' => $cta_data['text'],
528 + 'url' => $cta_data['url'],
943 529 'type' => 'cta',
944 - 'data' => [
945 - 'campaign' => $campaign_data['campaign'],
946 - 'source' => $campaign_data['source'],
947 - 'medium' => $campaign_data['medium'],
948 - ],
949 530 ],
950 531 ];
951 532
952 533 $this->print_admin_notice( $options );
@@ -953,8 +534,14 @@
953 534
954 535 return true;
955 536 }
956 537
538 + private function is_plugin_installed( $file_path ): bool {
539 + $installed_plugins = get_plugins();
540 +
541 + return isset( $installed_plugins[ $file_path ] );
542 + }
543 +
957 544 public function print_admin_notice( array $options, $exclude_pages = self::DEFAULT_EXCLUDED_PAGES ) {
958 545 global $pagenow;
959 546
960 547 if ( in_array( $pagenow, $exclude_pages, true ) ) {
@@ -967,9 +554,9 @@
967 554 'description' => '',
968 555 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
969 556 'type' => '',
970 557 'dismissible' => true,
971 - 'icon' => 'eicon-elementor-circle',
558 + 'icon' => 'eicon-elementor',
972 559 'button' => [],
973 560 'button_secondary' => [],
974 561 ];
975 562
@@ -982,19 +569,12 @@
982 569 if ( $options['type'] ) {
983 570 $notice_classes[] = 'e-notice--' . $options['type'];
984 571 }
985 572
986 - $wrapper_attributes = [
987 - 'role' => 'region',
988 - 'aria-label' => esc_html__( 'Elementor notice', 'elementor' ),
989 - ];
990 -
991 573 if ( $options['dismissible'] ) {
992 574 $label = esc_html__( 'Dismiss this notice.', 'elementor' );
993 575 $notice_classes[] = 'e-notice--dismissible';
994 576 $dismiss_button = '<i class="e-notice__dismiss" role="button" aria-label="' . $label . '" tabindex="0"></i>';
995 -
996 - $wrapper_attributes['data-nonce'] = wp_create_nonce( 'elementor_set_admin_notice_viewed' );
997 577 }
998 578
999 579 if ( $options['icon'] ) {
1000 580 $notice_classes[] = 'e-notice--extended';
@@ -1000,17 +580,15 @@
1000 580 $notice_classes[] = 'e-notice--extended';
1001 581 $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
1002 582 }
1003 583
1004 - $wrapper_attributes['class'] = $notice_classes;
584 + $wrapper_attributes = [
585 + 'class' => $notice_classes,
586 + ];
1005 587
1006 588 if ( $options['id'] ) {
1007 589 $wrapper_attributes['data-notice_id'] = $options['id'];
1008 590 }
1009 -
1010 - if ( ! empty( $options['source'] ) ) {
1011 - $wrapper_attributes['data-source'] = $options['source'];
1012 - }
1013 591 ?>
1014 592 <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
1015 593 <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
1016 594 <div class="e-notice__aside">
@@ -1027,9 +605,8 @@
1027 605
1028 606 <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
1029 607 <div class="e-notice__actions">
1030 608 <?php
1031 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
1032 609 foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
1033 610 if ( empty( $button_settings['variant'] ) && $index ) {
1034 611 $button_settings['variant'] = 'outline';
1035 612 }
@@ -1037,20 +614,8 @@
1037 614 if ( empty( $button_settings['text'] ) ) {
1038 615 continue;
1039 616 }
1040 617
1041 - if ( $one_subscription ) {
1042 - if ( ! isset( $button_settings['classes'] ) ) {
1043 - $button_settings['classes'] = [];
1044 - }
1045 - if ( ! is_array( $button_settings['classes'] ) ) {
1046 - $button_settings['classes'] = [ $button_settings['classes'] ];
1047 - }
1048 - // index 0 = button, index 1 = button_secondary
1049 - $button_class = ( 0 === $index ) ? 'button-primary' : 'button-secondary';
1050 - $button_settings['classes'][] = $button_class;
1051 - }
1052 -
1053 618 $button = new Button( $button_settings );
1054 619 $button->print_button();
1055 620 } ?>
1056 621 </div>
@@ -1082,61 +647,8 @@
1082 647 return;
1083 648 }
1084 649 }
1085 650
1086 - public function maybe_log_campaign() {
1087 - if ( empty( $_GET['plg_campaign'] ) || empty( $_GET['plg_campaign_name'] ) ) {
1088 - return;
1089 - }
1090 -
1091 - $allowed_plgs = [
1092 - 'elementor_image_optimization_campaign',
1093 - 'elementor_ea11y_campaign',
1094 - 'elementor_site_mailer_campaign',
1095 - ];
1096 -
1097 - if ( ! in_array( $_GET['plg_campaign_name'], $allowed_plgs, true ) ) {
1098 - return;
1099 - }
1100 -
1101 - if ( ! isset( $_GET['plg_campaign_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['plg_campaign_nonce'] ), sanitize_key( $_GET['plg_campaign_name'] ) ) ) {
1102 - return;
1103 - }
1104 -
1105 - if ( ! current_user_can( 'manage_options' ) ) {
1106 - return;
1107 - }
1108 -
1109 - if ( empty( $_GET['plg_source'] ) || empty( $_GET['plg_medium'] ) ) {
1110 - return;
1111 - }
1112 -
1113 - $campaign_data = [
1114 - 'source' => sanitize_key( $_GET['plg_source'] ),
1115 - 'campaign' => sanitize_key( $_GET['plg_campaign'] ),
1116 - 'medium' => sanitize_key( $_GET['plg_medium'] ),
1117 - ];
1118 -
1119 - set_transient( sanitize_key( $_GET['plg_campaign_name'] ), $campaign_data, 30 * DAY_IN_SECONDS );
1120 - }
1121 -
1122 - public static function add_plg_campaign_data( $url, $campaign_data ) {
1123 -
1124 - foreach ( [ 'name', 'campaign' ] as $key ) {
1125 - if ( empty( $campaign_data[ $key ] ) ) {
1126 - return $url;
1127 - }
1128 - }
1129 -
1130 - return add_query_arg( [
1131 - 'plg_campaign_name' => $campaign_data['name'],
1132 - 'plg_campaign' => $campaign_data['campaign'],
1133 - 'plg_source' => empty( $campaign_data['source'] ) ? '' : $campaign_data['source'],
1134 - 'plg_medium' => empty( $campaign_data['medium'] ) ? '' : $campaign_data['medium'],
1135 - 'plg_campaign_nonce' => wp_create_nonce( $campaign_data['name'] ),
1136 - ], $url );
1137 - }
1138 -
1139 651 /**
1140 652 * @since 2.9.0
1141 653 * @access public
1142 654 */
@@ -1141,10 +653,8 @@
1141 653 * @access public
1142 654 */
1143 655 public function __construct() {
1144 656 add_action( 'admin_notices', [ $this, 'admin_notices' ], 20 );
1145 - add_action( 'admin_action_install-plugin', [ $this, 'maybe_log_campaign' ] );
1146 - add_action( 'admin_action_activate', [ $this, 'maybe_log_campaign' ] );
1147 657 }
1148 658
1149 659 /**
1150 660 * Get module name.