PluginProbe
Elementor Website Builder – more than just a page builder / 3.22.0-dev4
Elementor Website Builder – more than just a page builder v3.22.0-dev4
4.3.0-beta3 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 All 452 releases
← All changes | core/admin/admin-notices.php +61 -608 4.2.13.22.0-dev4 View file →
@@ -3,17 +3,15 @@
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 -use Elementor\Settings;
12 9 use Elementor\Tracker;
13 10 use Elementor\User;
14 11 use Elementor\Utils;
15 12 use Elementor\Core\Admin\Notices\Base_Notice;
13 +use Elementor\Core\Admin\Notices\Elementor_Dev_Notice;
16 14
17 15 if ( ! defined( 'ABSPATH' ) ) {
18 16 exit; // Exit if accessed directly.
19 17 }
@@ -20,25 +18,18 @@
20 18
21 19 class Admin_Notices extends Module {
22 20
23 21 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 22
27 - const EXIT_EARLY_FOR_BACKWARD_COMPATIBILITY = false;
28 -
29 23 private $plain_notices = [
30 24 'api_notice',
31 25 'api_upgrade_plugin',
32 26 'tracker',
33 - 'tracker_last_update',
34 27 'rate_us_feedback',
35 28 'role_manager_promote',
36 29 'experiment_promotion',
37 - 'site_mailer_promotion',
30 + 'design_not_appearing',
38 31 'plugin_image_optimization',
39 - 'ally_pages_promotion',
40 - self::LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID,
41 32 ];
42 33
43 34 private $elementor_pages_count = null;
44 35
@@ -46,8 +37,12 @@
46 37
47 38 private $current_screen_id = null;
48 39
49 40 private function get_notices() {
41 + $notices = [
42 + new Elementor_Dev_Notice(),
43 + ];
44 +
50 45 /**
51 46 * Admin notices.
52 47 *
53 48 * Filters Elementor admin notices.
@@ -56,9 +51,9 @@
56 51 * admin notice or to add new notices for Elementor add-ons.
57 52 *
58 53 * @param array $notices A list of notice classes.
59 54 */
60 - $notices = apply_filters( 'elementor/core/admin/notices', [] );
55 + $notices = apply_filters( 'elementor/core/admin/notices', $notices );
61 56
62 57 return $notices;
63 58 }
64 59
@@ -98,9 +93,9 @@
98 93 if ( ! current_user_can( 'update_plugins' ) ) {
99 94 return false;
100 95 }
101 96
102 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
97 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
103 98 return false;
104 99 }
105 100
106 101 // Check for upgrades.
@@ -138,16 +133,16 @@
138 133 $message = sprintf(
139 134 /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text. */
140 135 __( '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 136 esc_url( $details_url ),
142 - sprintf(
137 + esc_attr( sprintf(
143 138 /* translators: %s: Elementor version. */
144 - esc_attr__( 'View Elementor version %s details', 'elementor' ),
139 + __( 'View Elementor version %s details', 'elementor' ),
145 140 $new_version
146 - ),
141 + ) ),
147 142 $new_version,
148 143 esc_url( $upgrade_url ),
149 - esc_attr__( 'Update Now', 'elementor' )
144 + esc_attr( esc_html__( 'Update Now', 'elementor' ) )
150 145 );
151 146
152 147 $options = [
153 148 'title' => esc_html__( 'Update Notification', 'elementor' ),
@@ -174,9 +169,9 @@
174 169 if ( ! current_user_can( 'manage_options' ) ) {
175 170 return false;
176 171 }
177 172
178 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
173 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
179 174 return false;
180 175 }
181 176
182 177 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
@@ -220,9 +215,9 @@
220 215 // TODO: Skip for development env.
221 216 $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
222 217 $optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
223 218
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' );
219 + $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 220
226 221 /**
227 222 * Tracker admin description text.
228 223 *
@@ -236,11 +231,10 @@
236 231
237 232 $message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
238 233
239 234 $options = [
240 - 'title' => esc_html__( 'Want to shape the future of web creation?', 'elementor' ),
235 + 'title' => esc_html__( 'Love using Elementor?', 'elementor' ),
241 236 'description' => $message,
242 - 'dismissible' => false,
243 237 'button' => [
244 238 'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
245 239 'url' => $optin_url,
246 240 'type' => 'cta',
@@ -257,49 +251,8 @@
257 251
258 252 return true;
259 253 }
260 254
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 255 private function notice_rate_us_feedback() {
303 256 $notice_id = 'rate_us_feedback';
304 257
305 258 if ( ! current_user_can( 'manage_options' ) ) {
@@ -316,9 +269,8 @@
316 269
317 270 $dismiss_url = add_query_arg( [
318 271 'action' => 'elementor_set_admin_notice_viewed',
319 272 'notice_id' => esc_attr( $notice_id ),
320 - '_wpnonce' => wp_create_nonce( 'elementor_set_admin_notice_viewed' ),
321 273 ], admin_url( 'admin-post.php' ) );
322 274
323 275 $options = [
324 276 'title' => esc_html__( 'Congrats!', 'elementor' ),
@@ -396,10 +348,10 @@
396 348 }
397 349
398 350 $experiments = Plugin::$instance->experiments;
399 351 $is_all_performance_features_active = (
400 - $experiments->is_feature_active( 'e_font_icon_svg' ) &&
401 - $experiments->is_feature_active( 'e_optimized_markup' )
352 + $experiments->is_feature_active( 'additional_custom_breakpoints' ) &&
353 + $experiments->is_feature_active( 'e_optimized_css_loading' )
402 354 );
403 355
404 356 if ( $is_all_performance_features_active ) {
405 357 return false;
@@ -410,9 +362,9 @@
410 362 'description' => esc_html__( 'With our experimental speed boosting features you can go faster than ever before. Look for the Performance label on our Experiments page and activate those experiments to improve your site loading speed.', 'elementor' ),
411 363 'id' => $notice_id,
412 364 'button' => [
413 365 'text' => esc_html__( 'Try it out', 'elementor' ),
414 - 'url' => Settings::get_settings_tab_url( 'experiments' ),
366 + 'url' => admin_url( 'admin.php?page=elementor#tab-experiments' ),
415 367 'type' => 'cta',
416 368 ],
417 369 'button_secondary' => [
418 370 'text' => esc_html__( 'Learn more', 'elementor' ),
@@ -426,427 +378,50 @@
426 378
427 379 return true;
428 380 }
429 381
430 - 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' );
432 - }
382 + private function notice_design_not_appearing() {
383 + $installs_history = get_option( 'elementor_install_history', [] );
384 + $is_first_install = 1 === count( $installs_history );
433 385
434 - private function site_has_woocommerce() {
435 - return class_exists( 'WooCommerce' );
436 - }
437 -
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() ) {
386 + if ( $is_first_install || ! current_user_can( 'update_plugins' ) ) {
476 387 return false;
477 388 }
478 389
479 - if ( ! Manager::had_install_prior_to( self::LOCAL_GOOGLE_FONTS_NOTICE_MIN_VERSION ) ) {
480 - return false;
481 - }
390 + $notice_id = 'design_not_appearing';
391 + $notice = User::get_user_notices()[ $notice_id ] ?? [];
392 + $notice_version = $notice['meta']['version'] ?? null;
393 + $is_version_changed = $this->get_elementor_version() !== $notice_version;
482 394
483 - if ( User::is_user_notice_viewed( self::LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID ) ) {
484 - return false;
395 + if ( $is_version_changed ) {
396 + User::set_user_notice( $notice_id, false, [ 'version' => $this->get_elementor_version() ] );
485 397 }
486 398
487 - $is_local_gf_enabled = (bool) get_option( 'elementor_local_google_fonts', '0' );
488 -
489 - if ( $is_local_gf_enabled ) {
399 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard', 'update-core', 'plugins' ], true ) ) {
490 400 return false;
491 401 }
492 402
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 403 if ( User::is_user_notice_viewed( $notice_id ) ) {
530 404 return false;
531 405 }
532 406
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 Web Accessibility, 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 Web Accessibility. 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 Web Accessibility, 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 407 $options = [
594 - 'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
595 - 'description' => $description,
408 + 'title' => esc_html__( 'The version was updated successfully!', 'elementor' ),
409 + 'description' => sprintf(
410 + esc_html__( 'Encountering issues after updating the version? Don’t worry - we’ve collected all the fixes for troubleshooting common issues. %1$sFind a solution%2$s', 'elementor' ),
411 + '<a href="https://go.elementor.com/wp-dash-changes-do-not-appear-online/" target="_blank">',
412 + '</a>'
413 + ),
596 414 '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 415 ];
610 416
611 - $this->print_admin_notice( $options );
417 + $excluded_pages = [];
418 + $this->print_admin_notice( $options, $excluded_pages );
612 419
613 420 return true;
614 421 }
615 422
616 - private function notice_site_mailer_promotion() {
617 - $notice_id = 'site_mailer_promotion';
618 - $has_forms = $this->site_has_forms_plugins();
619 - $has_woocommerce = $this->site_has_woocommerce();
620 -
621 - if ( ! $has_forms && ! $has_woocommerce ) {
622 - return false;
623 - }
624 -
625 - if ( ! $this->is_elementor_page() && ! $this->is_elementor_admin_screen() ) {
626 - return false;
627 - }
628 -
629 - if ( ( Utils::has_pro() && ! $has_woocommerce ) || ! current_user_can( 'install_plugins' ) || User::is_user_notice_viewed( $notice_id ) ) {
630 - return false;
631 - }
632 -
633 - $plugin_slug = 'site-mailer';
634 - $plugin_file_path = 'site-mailer/site-mailer.php';
635 -
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 ) {
642 - return false;
643 - }
644 -
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 Email Deliverability 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__( 'Email Deliverability 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 Email Deliverability 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 Email Deliverability to ensure emails reach the inbox and track delivery with built-in logs. Email Deliverability 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 Email Deliverability 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 Email Deliverability 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 - $options = [
751 - 'title' => $title,
752 - 'description' => $description,
753 - 'id' => $notice_id,
754 - 'type' => 'cta',
755 - 'button' => [
756 - 'text' => $button_text,
757 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
758 - 'type' => 'cta',
759 - 'data' => [
760 - 'campaign' => $campaign_data['campaign'],
761 - 'source' => $campaign_data['source'],
762 - 'medium' => $campaign_data['medium'],
763 - ],
764 - ],
765 - 'button_secondary' => [
766 - 'text' => esc_html__( 'Learn more', 'elementor' ),
767 - 'url' => $learn_more_url,
768 - 'new_tab' => true,
769 - 'type' => 'cta',
770 - ],
771 - ];
772 -
773 - if ( $is_woocommerce ) {
774 - // We include WP's default notice class so it will be properly handled by WP's js handler
775 - // And add a new one to distinguish between the two types of notices
776 - $options['classes'] = [ 'notice', 'e-notice', 'sm-notice-wc' ];
777 - }
778 -
779 - $this->print_admin_notice( $options );
780 -
781 - return true;
782 - }
783 -
784 - private function should_render_woocommerce_hint( $has_forms, $has_woocommerce ): bool {
785 - if ( ! $has_forms && ! $has_woocommerce ) {
786 - return false;
787 - }
788 -
789 - if ( ! $has_forms && $has_woocommerce ) {
790 - return true;
791 - }
792 -
793 - if ( $has_forms && $has_woocommerce && Utils::has_pro() ) {
794 - return true;
795 - }
796 -
797 - if ( ! $has_woocommerce ) {
798 - return false;
799 - }
800 -
801 - return (bool) wp_rand( 0, 1 );
802 - }
803 -
804 - private function is_elementor_page(): bool {
805 - return 0 === strpos( $this->current_screen_id, 'elementor_page' );
806 - }
807 -
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 - private function get_plugin_cta_data( $plugin_slug, $plugin_file_path ) {
828 - if ( Hints::is_plugin_active( $plugin_slug ) ) {
829 - return false;
830 - }
831 -
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' );
835 - } else {
836 - $url = $this->get_plugin_button_install_url( $plugin_slug );
837 - $cta_text = esc_html__( 'Install now', 'elementor' );
838 - }
839 -
840 - return [
841 - 'url' => $url,
842 - 'text' => $cta_text,
843 - ];
844 - }
845 -
846 - /**
847 - * For testing purposes
848 - */
423 + // For testing purposes
849 424 public function get_elementor_version() {
850 425 return ELEMENTOR_VERSION;
851 426 }
852 427
@@ -856,16 +431,12 @@
856 431 if ( 'upload' !== $this->current_screen_id ) {
857 432 return false;
858 433 }
859 434
860 - if ( ! current_user_can( 'manage_options' ) ) {
435 + if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
861 436 return false;
862 437 }
863 438
864 - if ( User::is_user_notice_viewed( $notice_id ) ) {
865 - return false;
866 - }
867 -
868 439 $attachments = new \WP_Query( [
869 440 'post_type' => 'attachment',
870 441 'post_status' => 'any',
871 442 'fields' => 'ids',
@@ -874,79 +445,32 @@
874 445 if ( 1 > $attachments->found_posts ) {
875 446 return false;
876 447 }
877 448
449 + $plugin_file_path = 'image-optimization/image-optimization.php';
878 450 $plugin_slug = 'image-optimization';
879 - $plugin_file_path = 'image-optimization/image-optimization.php';
880 451
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 );
884 -
885 - if ( $is_active ) {
452 + if ( is_plugin_active( $plugin_file_path ) ) {
886 453 return false;
887 454 }
888 455
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 Optimization. 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 - }
456 + if ( $this->is_plugin_installed( $plugin_file_path ) ) {
457 + $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 );
458 + $cta_text = esc_html__( 'Activate Plugin', 'elementor' );
911 459 } 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 - }
460 + $url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $plugin_slug ), 'install-plugin_' . $plugin_slug );
461 + $cta_text = esc_html__( 'Install Plugin', 'elementor' );
933 462 }
934 463
935 464 $options = [
936 - 'title' => esc_html__( 'Speed up your website with Image Optimization', 'elementor' ),
937 - 'description' => $description,
465 + 'title' => esc_html__( 'Speed up your website with Image Optimizer by Elementor', 'elementor' ),
466 + '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 467 'id' => $notice_id,
939 468 'type' => 'cta',
940 - 'button' => [
941 - 'text' => $button_text,
942 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
469 + 'button_secondary' => [
470 + 'text' => $cta_text,
471 + 'url' => $url,
943 472 'type' => 'cta',
944 - 'data' => [
945 - 'campaign' => $campaign_data['campaign'],
946 - 'source' => $campaign_data['source'],
947 - 'medium' => $campaign_data['medium'],
948 - ],
949 473 ],
950 474 ];
951 475
952 476 $this->print_admin_notice( $options );
@@ -953,8 +477,14 @@
953 477
954 478 return true;
955 479 }
956 480
481 + private function is_plugin_installed( $file_path ): bool {
482 + $installed_plugins = get_plugins();
483 +
484 + return isset( $installed_plugins[ $file_path ] );
485 + }
486 +
957 487 public function print_admin_notice( array $options, $exclude_pages = self::DEFAULT_EXCLUDED_PAGES ) {
958 488 global $pagenow;
959 489
960 490 if ( in_array( $pagenow, $exclude_pages, true ) ) {
@@ -967,9 +497,9 @@
967 497 'description' => '',
968 498 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
969 499 'type' => '',
970 500 'dismissible' => true,
971 - 'icon' => 'eicon-elementor-circle',
501 + 'icon' => 'eicon-elementor',
972 502 'button' => [],
973 503 'button_secondary' => [],
974 504 ];
975 505
@@ -982,19 +512,12 @@
982 512 if ( $options['type'] ) {
983 513 $notice_classes[] = 'e-notice--' . $options['type'];
984 514 }
985 515
986 - $wrapper_attributes = [
987 - 'role' => 'region',
988 - 'aria-label' => esc_html__( 'Elementor notice', 'elementor' ),
989 - ];
990 -
991 516 if ( $options['dismissible'] ) {
992 517 $label = esc_html__( 'Dismiss this notice.', 'elementor' );
993 518 $notice_classes[] = 'e-notice--dismissible';
994 519 $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 520 }
998 521
999 522 if ( $options['icon'] ) {
1000 523 $notice_classes[] = 'e-notice--extended';
@@ -1000,17 +523,15 @@
1000 523 $notice_classes[] = 'e-notice--extended';
1001 524 $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
1002 525 }
1003 526
1004 - $wrapper_attributes['class'] = $notice_classes;
527 + $wrapper_attributes = [
528 + 'class' => $notice_classes,
529 + ];
1005 530
1006 531 if ( $options['id'] ) {
1007 532 $wrapper_attributes['data-notice_id'] = $options['id'];
1008 533 }
1009 -
1010 - if ( ! empty( $options['source'] ) ) {
1011 - $wrapper_attributes['data-source'] = $options['source'];
1012 - }
1013 534 ?>
1014 535 <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
1015 536 <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
1016 537 <div class="e-notice__aside">
@@ -1027,9 +548,8 @@
1027 548
1028 549 <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
1029 550 <div class="e-notice__actions">
1030 551 <?php
1031 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
1032 552 foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
1033 553 if ( empty( $button_settings['variant'] ) && $index ) {
1034 554 $button_settings['variant'] = 'outline';
1035 555 }
@@ -1037,20 +557,8 @@
1037 557 if ( empty( $button_settings['text'] ) ) {
1038 558 continue;
1039 559 }
1040 560
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 561 $button = new Button( $button_settings );
1054 562 $button->print_button();
1055 563 } ?>
1056 564 </div>
@@ -1082,61 +590,8 @@
1082 590 return;
1083 591 }
1084 592 }
1085 593
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 594 /**
1140 595 * @since 2.9.0
1141 596 * @access public
1142 597 */
@@ -1141,10 +596,8 @@
1141 596 * @access public
1142 597 */
1143 598 public function __construct() {
1144 599 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 600 }
1148 601
1149 602 /**
1150 603 * Get module name.