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-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 +116 -319 4.3.0-beta33.27.4 View file →
@@ -3,15 +3,16 @@
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\Utils\Hints;
8 7 use Elementor\Core\Utils\Promotions\Filtered_Promotions_Manager;
9 8 use Elementor\Plugin;
9 +use Elementor\Settings;
10 10 use Elementor\Tracker;
11 11 use Elementor\User;
12 12 use Elementor\Utils;
13 13 use Elementor\Core\Admin\Notices\Base_Notice;
14 +use Elementor\Core\Admin\Notices\Elementor_Dev_Notice;
14 15
15 16 if ( ! defined( 'ABSPATH' ) ) {
16 17 exit; // Exit if accessed directly.
17 18 }
@@ -19,19 +20,17 @@
19 20 class Admin_Notices extends Module {
20 21
21 22 const DEFAULT_EXCLUDED_PAGES = [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ];
22 23
23 - const EXIT_EARLY_FOR_BACKWARD_COMPATIBILITY = false;
24 -
25 24 private $plain_notices = [
26 25 'api_notice',
27 26 'api_upgrade_plugin',
28 27 'tracker',
29 - 'tracker_last_update',
30 28 'rate_us_feedback',
31 29 'role_manager_promote',
30 + 'experiment_promotion',
31 + 'site_mailer_promotion',
32 32 'plugin_image_optimization',
33 - 'ally_pages_promotion',
34 33 ];
35 34
36 35 private $elementor_pages_count = null;
37 36
@@ -39,8 +38,12 @@
39 38
40 39 private $current_screen_id = null;
41 40
42 41 private function get_notices() {
42 + $notices = [
43 + new Elementor_Dev_Notice(),
44 + ];
45 +
43 46 /**
44 47 * Admin notices.
45 48 *
46 49 * Filters Elementor admin notices.
@@ -49,9 +52,9 @@
49 52 * admin notice or to add new notices for Elementor add-ons.
50 53 *
51 54 * @param array $notices A list of notice classes.
52 55 */
53 - $notices = apply_filters( 'elementor/core/admin/notices', [] );
56 + $notices = apply_filters( 'elementor/core/admin/notices', $notices );
54 57
55 58 return $notices;
56 59 }
57 60
@@ -91,9 +94,9 @@
91 94 if ( ! current_user_can( 'update_plugins' ) ) {
92 95 return false;
93 96 }
94 97
95 - 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 ) ) {
96 99 return false;
97 100 }
98 101
99 102 // Check for upgrades.
@@ -131,16 +134,16 @@
131 134 $message = sprintf(
132 135 /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text. */
133 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' ),
134 137 esc_url( $details_url ),
135 - sprintf(
138 + esc_attr( sprintf(
136 139 /* translators: %s: Elementor version. */
137 - esc_attr__( 'View Elementor version %s details', 'elementor' ),
140 + __( 'View Elementor version %s details', 'elementor' ),
138 141 $new_version
139 - ),
142 + ) ),
140 143 $new_version,
141 144 esc_url( $upgrade_url ),
142 - esc_attr__( 'Update Now', 'elementor' )
145 + esc_attr( esc_html__( 'Update Now', 'elementor' ) )
143 146 );
144 147
145 148 $options = [
146 149 'title' => esc_html__( 'Update Notification', 'elementor' ),
@@ -167,9 +170,9 @@
167 170 if ( ! current_user_can( 'manage_options' ) ) {
168 171 return false;
169 172 }
170 173
171 - 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 ) ) {
172 175 return false;
173 176 }
174 177
175 178 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
@@ -213,9 +216,9 @@
213 216 // TODO: Skip for development env.
214 217 $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
215 218 $optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
216 219
217 - $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' );
218 221
219 222 /**
220 223 * Tracker admin description text.
221 224 *
@@ -229,11 +232,10 @@
229 232
230 233 $message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
231 234
232 235 $options = [
233 - 'title' => esc_html__( 'Want to shape the future of web creation?', 'elementor' ),
236 + 'title' => esc_html__( 'Love using Elementor?', 'elementor' ),
234 237 'description' => $message,
235 - 'dismissible' => false,
236 238 'button' => [
237 239 'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
238 240 'url' => $optin_url,
239 241 'type' => 'cta',
@@ -250,49 +252,8 @@
250 252
251 253 return true;
252 254 }
253 255
254 - private function notice_tracker_last_update() {
255 - if ( ! current_user_can( 'manage_options' ) ) {
256 - return false;
257 - }
258 -
259 - if ( ! Tracker::has_terms_changed() ) {
260 - return false;
261 - }
262 -
263 - $notice_id = 'tracker_last_update_' . Tracker::LAST_TERMS_UPDATED;
264 -
265 - if ( User::is_user_notice_viewed( $notice_id ) ) {
266 - return false;
267 - }
268 -
269 - $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
270 -
271 - $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' );
272 -
273 - $options = [
274 - 'id' => $notice_id,
275 - 'title' => esc_html__( 'Update regarding usage data collection', 'elementor' ),
276 - 'description' => $message,
277 - 'button' => [
278 - 'text' => esc_html__( 'Opt in', 'elementor' ),
279 - 'url' => $optin_url,
280 - 'type' => 'cta',
281 - ],
282 - 'button_secondary' => [
283 - 'text' => esc_html__( 'Learn more', 'elementor' ),
284 - 'url' => 'https://go.elementor.com/wp-dash-update-usage-notice/',
285 - 'new_tab' => true,
286 - 'type' => 'cta',
287 - ],
288 - ];
289 -
290 - $this->print_admin_notice( $options );
291 -
292 - return true;
293 - }
294 -
295 256 private function notice_rate_us_feedback() {
296 257 $notice_id = 'rate_us_feedback';
297 258
298 259 if ( ! current_user_can( 'manage_options' ) ) {
@@ -309,9 +270,8 @@
309 270
310 271 $dismiss_url = add_query_arg( [
311 272 'action' => 'elementor_set_admin_notice_viewed',
312 273 'notice_id' => esc_attr( $notice_id ),
313 - '_wpnonce' => wp_create_nonce( 'elementor_set_admin_notice_viewed' ),
314 274 ], admin_url( 'admin-post.php' ) );
315 275
316 276 $options = [
317 277 'title' => esc_html__( 'Congrats!', 'elementor' ),
@@ -380,176 +340,142 @@
380 340
381 341 return true;
382 342 }
383 343
384 - private function get_installed_form_plugin_name() {
385 - static $detected_form_plugin = null;
344 + private function notice_experiment_promotion() {
345 + $notice_id = 'experiment_promotion';
386 346
387 - if ( null !== $detected_form_plugin ) {
388 - return $detected_form_plugin;
347 + if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
348 + return false;
389 349 }
390 350
391 - $form_plugins_constants_to_name_mapper = [
392 - 'WPFORMS_VERSION' => 'WPForms',
393 - 'WPCF7_VERSION' => 'Contact Form 7',
394 - ];
351 + $experiments = Plugin::$instance->experiments;
352 + $is_all_performance_features_active = (
353 + $experiments->is_feature_active( 'e_element_cache' ) &&
354 + $experiments->is_feature_active( 'e_font_icon_svg' )
355 + );
395 356
396 - foreach ( $form_plugins_constants_to_name_mapper as $constant => $name ) {
397 - if ( defined( $constant ) ) {
398 - $detected_form_plugin = $name;
399 - return $detected_form_plugin;
400 - }
357 + if ( $is_all_performance_features_active ) {
358 + return false;
401 359 }
402 360
403 - $form_plugins_classes_to_name_mapper = [
404 - '\GFCommon' => 'Gravity Forms',
405 - '\Ninja_Forms' => 'Ninja Forms',
361 + $options = [
362 + 'title' => esc_html__( 'Improve your site’s performance score.', 'elementor' ),
363 + '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' ),
364 + 'id' => $notice_id,
365 + 'button' => [
366 + 'text' => esc_html__( 'Try it out', 'elementor' ),
367 + 'url' => Settings::get_settings_tab_url( 'experiments' ),
368 + 'type' => 'cta',
369 + ],
370 + 'button_secondary' => [
371 + 'text' => esc_html__( 'Learn more', 'elementor' ),
372 + 'url' => 'https://go.elementor.com/wp-dash-experiment-promotion/',
373 + 'new_tab' => true,
374 + 'type' => 'cta',
375 + ],
406 376 ];
407 377
408 - foreach ( $form_plugins_classes_to_name_mapper as $class => $name ) {
409 - if ( class_exists( $class ) ) {
410 - $detected_form_plugin = $name;
411 - return $detected_form_plugin;
412 - }
413 - }
378 + $this->print_admin_notice( $options );
414 379
415 - $detected_form_plugin = false;
416 - return $detected_form_plugin;
380 + return true;
417 381 }
418 382
419 - private function notice_ally_pages_promotion() {
420 - global $pagenow;
421 - $notice_id = 'ally_pages_promotion';
383 + private function site_has_forms_plugins() {
384 + return defined( 'WPFORMS_VERSION' ) || defined( 'WPCF7_VERSION' ) || defined( 'FLUENTFORM_VERSION' ) || class_exists( '\GFCommon' ) || class_exists( '\Ninja_Forms' ) || function_exists( 'load_formidable_forms' );
385 + }
422 386
423 - if ( 'edit.php' !== $pagenow || empty( $_GET['post_type'] ) || 'page' !== $_GET['post_type'] ) {
387 + private function site_has_woocommerce() {
388 + return class_exists( 'WooCommerce' );
389 + }
390 +
391 + private function notice_site_mailer_promotion() {
392 + $notice_id = 'site_mailer_promotion';
393 + $has_forms = $this->site_has_forms_plugins();
394 + $has_woocommerce = $this->site_has_woocommerce();
395 +
396 + if ( ! $has_forms && ! $has_woocommerce ) {
424 397 return false;
425 398 }
426 399
427 - if ( ! current_user_can( 'manage_options' ) ) {
400 + if ( ! $this->is_elementor_page() && ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'dashboard' ], true ) ) {
428 401 return false;
429 402 }
430 403
431 - if ( User::is_user_notice_viewed( $notice_id ) ) {
404 + if ( ( Utils::has_pro() && ! $has_woocommerce ) || ! current_user_can( 'install_plugins' ) || User::is_user_notice_viewed( $notice_id ) ) {
432 405 return false;
433 406 }
434 407
435 - $plugin_slug = 'pojo-accessibility';
436 - $plugin_file_path = 'pojo-accessibility/pojo-accessibility.php';
408 + $plugin_file_path = 'site-mailer/site-mailer.php';
409 + $plugin_slug = 'site-mailer';
437 410
438 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
439 - $is_installed = Hints::is_plugin_installed( $plugin_slug );
440 - $is_active = Hints::is_plugin_active( $plugin_slug );
441 -
442 - if ( $is_active ) {
411 + $cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
412 + if ( empty( $cta_data ) ) {
443 413 return false;
444 414 }
445 415
446 - if ( $one_subscription ) {
447 - $learn_more_url = 'https://go.elementor.com/acc-plg-learn-more-one';
448 -
449 - if ( ! $is_installed ) {
450 - $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' );
451 - $button_text = esc_html__( 'Install now', 'elementor' );
452 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
453 - $campaign_data = [
454 - 'name' => 'elementor_ea11y_campaign',
455 - 'campaign' => 'acc-statement-plg-pages-one-install',
456 - 'source' => 'wp-pages-one-install',
457 - 'medium' => 'wp-dash-one',
458 - ];
459 - } elseif ( ! $is_active ) {
460 - $description = esc_html__( 'Your ONE subscription includes Web Accessibility. Activate it to create your accessibility statement page quickly.', 'elementor' );
461 - $button_text = esc_html__( 'Activate now', 'elementor' );
462 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
463 - $campaign_data = [
464 - 'name' => 'elementor_ea11y_campaign',
465 - 'campaign' => 'acc-statement-plg-pages-one-activate',
466 - 'source' => 'wp-pages-one-activate',
467 - 'medium' => 'wp-dash-one',
468 - ];
469 - }
470 - } else {
471 - $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' );
472 - $learn_more_url = 'https://go.elementor.com/acc-plg-learn-more';
473 -
474 - if ( ! $is_installed ) {
475 - $button_text = esc_html__( 'Install now', 'elementor' );
476 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
477 - $campaign_data = [
478 - 'name' => 'elementor_ea11y_campaign',
479 - 'campaign' => 'acc-statement-plg-pages-install',
480 - 'source' => 'wp-pages-install',
481 - 'medium' => 'wp-dash',
482 - ];
483 - } elseif ( ! $is_active ) {
484 - $button_text = esc_html__( 'Activate now', 'elementor' );
485 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
486 - $campaign_data = [
487 - 'name' => 'elementor_ea11y_campaign',
488 - 'campaign' => 'acc-statement-plg-pages-activate',
489 - 'source' => 'wp-pages-activate',
490 - 'medium' => 'wp-dash',
491 - ];
492 - }
493 - }
494 -
495 416 $options = [
496 - 'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
497 - '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' ),
498 419 'id' => $notice_id,
499 420 'type' => 'cta',
500 421 'button' => [
501 - 'text' => $button_text,
502 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
422 + 'text' => $cta_data['text'],
423 + 'url' => $cta_data['url'],
503 424 'type' => 'cta',
504 425 ],
505 426 'button_secondary' => [
506 427 'text' => esc_html__( 'Learn more', 'elementor' ),
507 - 'url' => $learn_more_url,
428 + 'url' => 'https://go.elementor.com/sm-core-form/',
508 429 'new_tab' => true,
509 430 'type' => 'cta',
510 431 ],
511 432 ];
512 433
434 + if ( $this->should_render_woocommerce_hint( $has_forms, $has_woocommerce ) ) {
435 + // We include WP's default notice class so it will be properly handled by WP's js handler
436 + // And add a new one to distinguish between the two types of notices
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' );
440 + }
441 +
513 442 $this->print_admin_notice( $options );
514 443
515 444 return true;
516 445 }
517 446
518 - private function is_elementor_page(): bool {
519 - return 0 === strpos( $this->current_screen_id, 'elementor_page' );
520 - }
447 + private function should_render_woocommerce_hint( $has_forms, $has_woocommerce ): bool {
448 + if ( ! $has_forms && ! $has_woocommerce ) {
449 + return false;
450 + }
521 451
522 - private function is_elementor_admin_screen(): bool {
523 - return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library' ], true );
524 - }
452 + if ( ! $has_forms && $has_woocommerce ) {
453 + return true;
454 + }
525 455
526 - private function is_elementor_admin_screen_with_system_info(): bool {
527 - return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true );
528 - }
529 - private function get_plugin_button_install_url( $plugin_slug ) {
530 - return wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $plugin_slug ), 'install-plugin_' . $plugin_slug );
531 - }
456 + if ( $has_forms && $has_woocommerce && Utils::has_pro() ) {
457 + return true;
458 + }
532 459
533 - private function get_plugin_button_activate_url( $plugin_file_path ) {
534 - 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 );
460 + return (bool) mt_rand( 0, 1 );
535 461 }
536 462
537 - private function get_plugin_button_connect_url( $plugin_settings_page ) {
538 - return self_admin_url( $plugin_settings_page );
463 + private function is_elementor_page(): bool {
464 + return 0 === strpos( $this->current_screen_id, 'elementor_page' );
539 465 }
540 466
541 467 private function get_plugin_cta_data( $plugin_slug, $plugin_file_path ) {
542 - if ( Hints::is_plugin_active( $plugin_slug ) ) {
468 + if ( is_plugin_active( $plugin_file_path ) ) {
543 469 return false;
544 470 }
545 471
546 - if ( Hints::is_plugin_installed( $plugin_slug ) ) {
547 - $url = $this->get_plugin_button_activate_url( $plugin_file_path );
548 - $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' );
549 475 } else {
550 - $url = $this->get_plugin_button_install_url( $plugin_slug );
551 - $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' );
552 478 }
553 479
554 480 return [
555 481 'url' => $url,
@@ -556,11 +482,9 @@
556 482 'text' => $cta_text,
557 483 ];
558 484 }
559 485
560 - /**
561 - * For testing purposes
562 - */
486 + // For testing purposes
563 487 public function get_elementor_version() {
564 488 return ELEMENTOR_VERSION;
565 489 }
566 490
@@ -570,16 +494,12 @@
570 494 if ( 'upload' !== $this->current_screen_id ) {
571 495 return false;
572 496 }
573 497
574 - if ( ! current_user_can( 'manage_options' ) ) {
498 + if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
575 499 return false;
576 500 }
577 501
578 - if ( User::is_user_notice_viewed( $notice_id ) ) {
579 - return false;
580 - }
581 -
582 502 $attachments = new \WP_Query( [
583 503 'post_type' => 'attachment',
584 504 'post_status' => 'any',
585 505 'fields' => 'ids',
@@ -588,79 +508,26 @@
588 508 if ( 1 > $attachments->found_posts ) {
589 509 return false;
590 510 }
591 511
512 + $plugin_file_path = 'image-optimization/image-optimization.php';
592 513 $plugin_slug = 'image-optimization';
593 - $plugin_file_path = 'image-optimization/image-optimization.php';
594 514
595 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
596 - $is_installed = Hints::is_plugin_installed( $plugin_slug );
597 - $is_active = Hints::is_plugin_active( $plugin_slug );
515 + $cta_data = $this->get_plugin_cta_data( $plugin_slug, $plugin_file_path );
598 516
599 - if ( $is_active ) {
517 + if ( empty( $cta_data ) ) {
600 518 return false;
601 519 }
602 520
603 - if ( $one_subscription ) {
604 - if ( ! $is_installed ) {
605 - $description = esc_html__( 'Automatically optimize images to improve site speed and performance. Included with your ONE subscription.', 'elementor' );
606 - $button_text = esc_html__( 'Install now', 'elementor' );
607 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
608 - $campaign_data = [
609 - 'name' => 'elementor_image_optimization_campaign',
610 - 'campaign' => 'io-plg-one',
611 - 'source' => 'io-wp-media-library-one-install',
612 - 'medium' => 'wp-dash-one',
613 - ];
614 - } elseif ( ! $is_active ) {
615 - $description = esc_html__( 'Your ONE subscription includes Image Optimization. Activate it to optimize images and improve site performance.', 'elementor' );
616 - $button_text = esc_html__( 'Activate now', 'elementor' );
617 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
618 - $campaign_data = [
619 - 'name' => 'elementor_image_optimization_campaign',
620 - 'campaign' => 'io-plg-one',
621 - 'source' => 'io-wp-media-library-one-activate',
622 - 'medium' => 'wp-dash-one',
623 - ];
624 - }
625 - } else {
626 - $description = esc_html__( 'Automatically compress and optimize images, resize larger files, or convert to WebP. Optimize images individually, in bulk, or on upload.', 'elementor' );
627 -
628 - if ( ! $is_installed ) {
629 - $button_text = esc_html__( 'Install now', 'elementor' );
630 - $button_url = $this->get_plugin_button_install_url( $plugin_slug );
631 - $campaign_data = [
632 - 'name' => 'elementor_image_optimization_campaign',
633 - 'campaign' => 'io-plg',
634 - 'source' => 'io-wp-media-library-install',
635 - 'medium' => 'wp-dash',
636 - ];
637 - } elseif ( ! $is_active ) {
638 - $button_text = esc_html__( 'Activate now', 'elementor' );
639 - $button_url = $this->get_plugin_button_activate_url( $plugin_file_path );
640 - $campaign_data = [
641 - 'name' => 'elementor_image_optimization_campaign',
642 - 'campaign' => 'io-plg',
643 - 'source' => 'io-wp-media-library-activate',
644 - 'medium' => 'wp-dash',
645 - ];
646 - }
647 - }
648 -
649 521 $options = [
650 - 'title' => esc_html__( 'Speed up your website with Image Optimization', 'elementor' ),
651 - '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' ),
652 524 'id' => $notice_id,
653 525 'type' => 'cta',
654 - 'button' => [
655 - 'text' => $button_text,
656 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
526 + 'button_secondary' => [
527 + 'text' => $cta_data['text'],
528 + 'url' => $cta_data['url'],
657 529 'type' => 'cta',
658 - 'data' => [
659 - 'campaign' => $campaign_data['campaign'],
660 - 'source' => $campaign_data['source'],
661 - 'medium' => $campaign_data['medium'],
662 - ],
663 530 ],
664 531 ];
665 532
666 533 $this->print_admin_notice( $options );
@@ -667,8 +534,14 @@
667 534
668 535 return true;
669 536 }
670 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 +
671 544 public function print_admin_notice( array $options, $exclude_pages = self::DEFAULT_EXCLUDED_PAGES ) {
672 545 global $pagenow;
673 546
674 547 if ( in_array( $pagenow, $exclude_pages, true ) ) {
@@ -681,9 +554,9 @@
681 554 'description' => '',
682 555 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
683 556 'type' => '',
684 557 'dismissible' => true,
685 - 'icon' => 'eicon-elementor-circle',
558 + 'icon' => 'eicon-elementor',
686 559 'button' => [],
687 560 'button_secondary' => [],
688 561 ];
689 562
@@ -696,19 +569,12 @@
696 569 if ( $options['type'] ) {
697 570 $notice_classes[] = 'e-notice--' . $options['type'];
698 571 }
699 572
700 - $wrapper_attributes = [
701 - 'role' => 'region',
702 - 'aria-label' => esc_html__( 'Elementor notice', 'elementor' ),
703 - ];
704 -
705 573 if ( $options['dismissible'] ) {
706 574 $label = esc_html__( 'Dismiss this notice.', 'elementor' );
707 575 $notice_classes[] = 'e-notice--dismissible';
708 576 $dismiss_button = '<i class="e-notice__dismiss" role="button" aria-label="' . $label . '" tabindex="0"></i>';
709 -
710 - $wrapper_attributes['data-nonce'] = wp_create_nonce( 'elementor_set_admin_notice_viewed' );
711 577 }
712 578
713 579 if ( $options['icon'] ) {
714 580 $notice_classes[] = 'e-notice--extended';
@@ -714,17 +580,15 @@
714 580 $notice_classes[] = 'e-notice--extended';
715 581 $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
716 582 }
717 583
718 - $wrapper_attributes['class'] = $notice_classes;
584 + $wrapper_attributes = [
585 + 'class' => $notice_classes,
586 + ];
719 587
720 588 if ( $options['id'] ) {
721 589 $wrapper_attributes['data-notice_id'] = $options['id'];
722 590 }
723 -
724 - if ( ! empty( $options['source'] ) ) {
725 - $wrapper_attributes['data-source'] = $options['source'];
726 - }
727 591 ?>
728 592 <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
729 593 <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
730 594 <div class="e-notice__aside">
@@ -741,9 +605,8 @@
741 605
742 606 <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
743 607 <div class="e-notice__actions">
744 608 <?php
745 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
746 609 foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
747 610 if ( empty( $button_settings['variant'] ) && $index ) {
748 611 $button_settings['variant'] = 'outline';
749 612 }
@@ -751,20 +614,8 @@
751 614 if ( empty( $button_settings['text'] ) ) {
752 615 continue;
753 616 }
754 617
755 - if ( $one_subscription ) {
756 - if ( ! isset( $button_settings['classes'] ) ) {
757 - $button_settings['classes'] = [];
758 - }
759 - if ( ! is_array( $button_settings['classes'] ) ) {
760 - $button_settings['classes'] = [ $button_settings['classes'] ];
761 - }
762 - // index 0 = button, index 1 = button_secondary
763 - $button_class = ( 0 === $index ) ? 'button-primary' : 'button-secondary';
764 - $button_settings['classes'][] = $button_class;
765 - }
766 -
767 618 $button = new Button( $button_settings );
768 619 $button->print_button();
769 620 } ?>
770 621 </div>
@@ -796,60 +647,8 @@
796 647 return;
797 648 }
798 649 }
799 650
800 - public function maybe_log_campaign() {
801 - if ( empty( $_GET['plg_campaign'] ) || empty( $_GET['plg_campaign_name'] ) ) {
802 - return;
803 - }
804 -
805 - $allowed_plgs = [
806 - 'elementor_image_optimization_campaign',
807 - 'elementor_ea11y_campaign',
808 - ];
809 -
810 - if ( ! in_array( $_GET['plg_campaign_name'], $allowed_plgs, true ) ) {
811 - return;
812 - }
813 -
814 - if ( ! isset( $_GET['plg_campaign_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['plg_campaign_nonce'] ), sanitize_key( $_GET['plg_campaign_name'] ) ) ) {
815 - return;
816 - }
817 -
818 - if ( ! current_user_can( 'manage_options' ) ) {
819 - return;
820 - }
821 -
822 - if ( empty( $_GET['plg_source'] ) || empty( $_GET['plg_medium'] ) ) {
823 - return;
824 - }
825 -
826 - $campaign_data = [
827 - 'source' => sanitize_key( $_GET['plg_source'] ),
828 - 'campaign' => sanitize_key( $_GET['plg_campaign'] ),
829 - 'medium' => sanitize_key( $_GET['plg_medium'] ),
830 - ];
831 -
832 - set_transient( sanitize_key( $_GET['plg_campaign_name'] ), $campaign_data, 30 * DAY_IN_SECONDS );
833 - }
834 -
835 - public static function add_plg_campaign_data( $url, $campaign_data ) {
836 -
837 - foreach ( [ 'name', 'campaign' ] as $key ) {
838 - if ( empty( $campaign_data[ $key ] ) ) {
839 - return $url;
840 - }
841 - }
842 -
843 - return add_query_arg( [
844 - 'plg_campaign_name' => $campaign_data['name'],
845 - 'plg_campaign' => $campaign_data['campaign'],
846 - 'plg_source' => empty( $campaign_data['source'] ) ? '' : $campaign_data['source'],
847 - 'plg_medium' => empty( $campaign_data['medium'] ) ? '' : $campaign_data['medium'],
848 - 'plg_campaign_nonce' => wp_create_nonce( $campaign_data['name'] ),
849 - ], $url );
850 - }
851 -
852 651 /**
853 652 * @since 2.9.0
854 653 * @access public
855 654 */
@@ -854,10 +653,8 @@
854 653 * @access public
855 654 */
856 655 public function __construct() {
857 656 add_action( 'admin_notices', [ $this, 'admin_notices' ], 20 );
858 - add_action( 'admin_action_install-plugin', [ $this, 'maybe_log_campaign' ] );
859 - add_action( 'admin_action_activate', [ $this, 'maybe_log_campaign' ] );
860 657 }
861 658
862 659 /**
863 660 * Get module name.