PluginProbe
Elementor Website Builder – more than just a page builder / 3.20.2
Elementor Website Builder – more than just a page builder v3.20.2
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 +43 -652 4.1.33.20.2 View file →
@@ -3,17 +3,14 @@
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 -use Elementor\Core\Utils\Promotions\Filtered_Promotions_Manager;
10 7 use Elementor\Plugin;
11 -use Elementor\Settings;
12 8 use Elementor\Tracker;
13 9 use Elementor\User;
14 10 use Elementor\Utils;
15 11 use Elementor\Core\Admin\Notices\Base_Notice;
12 +use Elementor\Core\Admin\Notices\Elementor_Dev_Notice;
16 13
17 14 if ( ! defined( 'ABSPATH' ) ) {
18 15 exit; // Exit if accessed directly.
19 16 }
@@ -20,25 +17,17 @@
20 17
21 18 class Admin_Notices extends Module {
22 19
23 20 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 21
27 - const EXIT_EARLY_FOR_BACKWARD_COMPATIBILITY = false;
28 -
29 22 private $plain_notices = [
30 23 'api_notice',
31 24 'api_upgrade_plugin',
32 25 'tracker',
33 - 'tracker_last_update',
34 26 'rate_us_feedback',
35 27 'role_manager_promote',
36 28 'experiment_promotion',
37 - 'site_mailer_promotion',
38 - 'plugin_image_optimization',
39 - 'ally_pages_promotion',
40 - self::LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID,
29 + 'design_not_appearing',
41 30 ];
42 31
43 32 private $elementor_pages_count = null;
44 33
@@ -46,8 +35,12 @@
46 35
47 36 private $current_screen_id = null;
48 37
49 38 private function get_notices() {
39 + $notices = [
40 + new Elementor_Dev_Notice(),
41 + ];
42 +
50 43 /**
51 44 * Admin notices.
52 45 *
53 46 * Filters Elementor admin notices.
@@ -56,9 +49,9 @@
56 49 * admin notice or to add new notices for Elementor add-ons.
57 50 *
58 51 * @param array $notices A list of notice classes.
59 52 */
60 - $notices = apply_filters( 'elementor/core/admin/notices', [] );
53 + $notices = apply_filters( 'elementor/core/admin/notices', $notices );
61 54
62 55 return $notices;
63 56 }
64 57
@@ -98,9 +91,9 @@
98 91 if ( ! current_user_can( 'update_plugins' ) ) {
99 92 return false;
100 93 }
101 94
102 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
95 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
103 96 return false;
104 97 }
105 98
106 99 // Check for upgrades.
@@ -138,16 +131,16 @@
138 131 $message = sprintf(
139 132 /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text. */
140 133 __( '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 134 esc_url( $details_url ),
142 - sprintf(
135 + esc_attr( sprintf(
143 136 /* translators: %s: Elementor version. */
144 - esc_attr__( 'View Elementor version %s details', 'elementor' ),
137 + __( 'View Elementor version %s details', 'elementor' ),
145 138 $new_version
146 - ),
139 + ) ),
147 140 $new_version,
148 141 esc_url( $upgrade_url ),
149 - esc_attr__( 'Update Now', 'elementor' )
142 + esc_attr( esc_html__( 'Update Now', 'elementor' ) )
150 143 );
151 144
152 145 $options = [
153 146 'title' => esc_html__( 'Update Notification', 'elementor' ),
@@ -174,9 +167,9 @@
174 167 if ( ! current_user_can( 'manage_options' ) ) {
175 168 return false;
176 169 }
177 170
178 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
171 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
179 172 return false;
180 173 }
181 174
182 175 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
@@ -220,9 +213,9 @@
220 213 // TODO: Skip for development env.
221 214 $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
222 215 $optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
223 216
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' );
217 + $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 218
226 219 /**
227 220 * Tracker admin description text.
228 221 *
@@ -236,11 +229,10 @@
236 229
237 230 $message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
238 231
239 232 $options = [
240 - 'title' => esc_html__( 'Want to shape the future of web creation?', 'elementor' ),
233 + 'title' => esc_html__( 'Love using Elementor?', 'elementor' ),
241 234 'description' => $message,
242 - 'dismissible' => false,
243 235 'button' => [
244 236 'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
245 237 'url' => $optin_url,
246 238 'type' => 'cta',
@@ -257,49 +249,8 @@
257 249
258 250 return true;
259 251 }
260 252
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 253 private function notice_rate_us_feedback() {
303 254 $notice_id = 'rate_us_feedback';
304 255
305 256 if ( ! current_user_can( 'manage_options' ) ) {
@@ -316,9 +267,8 @@
316 267
317 268 $dismiss_url = add_query_arg( [
318 269 'action' => 'elementor_set_admin_notice_viewed',
319 270 'notice_id' => esc_attr( $notice_id ),
320 - '_wpnonce' => wp_create_nonce( 'elementor_set_admin_notice_viewed' ),
321 271 ], admin_url( 'admin-post.php' ) );
322 272
323 273 $options = [
324 274 'title' => esc_html__( 'Congrats!', 'elementor' ),
@@ -380,10 +330,8 @@
380 330 'type' => 'cta',
381 331 ],
382 332 ];
383 333
384 - $options = Filtered_Promotions_Manager::get_filtered_promotion_data( $options, 'core/admin/notice_role_manager_promote', 'button', 'url' );
385 -
386 334 $this->print_admin_notice( $options );
387 335
388 336 return true;
389 337 }
@@ -396,10 +344,11 @@
396 344 }
397 345
398 346 $experiments = Plugin::$instance->experiments;
399 347 $is_all_performance_features_active = (
400 - $experiments->is_feature_active( 'e_font_icon_svg' ) &&
401 - $experiments->is_feature_active( 'e_optimized_markup' )
348 + $experiments->is_feature_active( 'additional_custom_breakpoints' ) &&
349 + $experiments->is_feature_active( 'e_optimized_css_loading' ) &&
350 + $experiments->is_feature_active( 'e_optimized_assets_loading' )
402 351 );
403 352
404 353 if ( $is_all_performance_features_active ) {
405 354 return false;
@@ -410,9 +359,9 @@
410 359 '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 360 'id' => $notice_id,
412 361 'button' => [
413 362 'text' => esc_html__( 'Try it out', 'elementor' ),
414 - 'url' => Settings::get_settings_tab_url( 'experiments' ),
363 + 'url' => admin_url( 'admin.php?page=elementor#tab-experiments' ),
415 364 'type' => 'cta',
416 365 ],
417 366 'button_secondary' => [
418 367 'text' => esc_html__( 'Learn more', 'elementor' ),
@@ -426,535 +375,54 @@
426 375
427 376 return true;
428 377 }
429 378
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 - }
379 + private function notice_design_not_appearing() {
380 + $installs_history = get_option( 'elementor_install_history', [] );
381 + $is_first_install = 1 === count( $installs_history );
433 382
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() ) {
383 + if ( $is_first_install || ! current_user_can( 'update_plugins' ) ) {
476 384 return false;
477 385 }
478 386
479 - if ( ! Manager::had_install_prior_to( self::LOCAL_GOOGLE_FONTS_NOTICE_MIN_VERSION ) ) {
480 - return false;
481 - }
387 + $notice_id = 'design_not_appearing';
388 + $notice = User::get_user_notices()[ $notice_id ] ?? [];
389 + $notice_version = $notice['meta']['version'] ?? null;
390 + $is_version_changed = $this->get_elementor_version() !== $notice_version;
482 391
483 - if ( User::is_user_notice_viewed( self::LOCAL_GOOGLE_FONTS_DISABLED_NOTICE_ID ) ) {
484 - return false;
392 + if ( $is_version_changed ) {
393 + User::set_user_notice( $notice_id, false, [ 'version' => $this->get_elementor_version() ] );
485 394 }
486 395
487 - $is_local_gf_enabled = (bool) get_option( 'elementor_local_google_fonts', '0' );
488 -
489 - if ( $is_local_gf_enabled ) {
396 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard', 'update-core', 'plugins' ], true ) ) {
490 397 return false;
491 398 }
492 399
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 400 if ( User::is_user_notice_viewed( $notice_id ) ) {
530 401 return false;
531 402 }
532 403
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 404 $options = [
594 - 'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
595 - 'description' => $description,
405 + 'title' => esc_html__( 'The version was updated successfully!', 'elementor' ),
406 + 'description' => sprintf(
407 + 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' ),
408 + '<a href="https://go.elementor.com/wp-dash-changes-do-not-appear-online/" target="_blank">',
409 + '</a>'
410 + ),
596 411 '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 412 ];
610 413
611 - $this->print_admin_notice( $options );
414 + $excluded_pages = [];
415 + $this->print_admin_notice( $options, $excluded_pages );
612 416
613 417 return true;
614 418 }
615 419
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 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 - $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 - */
420 + // For testing purposes
849 421 public function get_elementor_version() {
850 422 return ELEMENTOR_VERSION;
851 423 }
852 424
853 - private function notice_plugin_image_optimization() {
854 - $notice_id = 'plugin_image_optimization';
855 -
856 - if ( 'upload' !== $this->current_screen_id ) {
857 - return false;
858 - }
859 -
860 - if ( ! current_user_can( 'manage_options' ) ) {
861 - return false;
862 - }
863 -
864 - if ( User::is_user_notice_viewed( $notice_id ) ) {
865 - return false;
866 - }
867 -
868 - $attachments = new \WP_Query( [
869 - 'post_type' => 'attachment',
870 - 'post_status' => 'any',
871 - 'fields' => 'ids',
872 - ] );
873 -
874 - if ( 1 > $attachments->found_posts ) {
875 - return false;
876 - }
877 -
878 - $plugin_slug = 'image-optimization';
879 - $plugin_file_path = 'image-optimization/image-optimization.php';
880 -
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 ) {
886 - return false;
887 - }
888 -
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 - $options = [
936 - 'title' => esc_html__( 'Speed up your website with Image Optimizer', 'elementor' ),
937 - 'description' => $description,
938 - 'id' => $notice_id,
939 - 'type' => 'cta',
940 - 'button' => [
941 - 'text' => $button_text,
942 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
943 - 'type' => 'cta',
944 - 'data' => [
945 - 'campaign' => $campaign_data['campaign'],
946 - 'source' => $campaign_data['source'],
947 - 'medium' => $campaign_data['medium'],
948 - ],
949 - ],
950 - ];
951 -
952 - $this->print_admin_notice( $options );
953 -
954 - return true;
955 - }
956 -
957 425 public function print_admin_notice( array $options, $exclude_pages = self::DEFAULT_EXCLUDED_PAGES ) {
958 426 global $pagenow;
959 427
960 428 if ( in_array( $pagenow, $exclude_pages, true ) ) {
@@ -967,9 +435,9 @@
967 435 'description' => '',
968 436 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
969 437 'type' => '',
970 438 'dismissible' => true,
971 - 'icon' => 'eicon-elementor-circle',
439 + 'icon' => 'eicon-elementor',
972 440 'button' => [],
973 441 'button_secondary' => [],
974 442 ];
975 443
@@ -982,19 +450,12 @@
982 450 if ( $options['type'] ) {
983 451 $notice_classes[] = 'e-notice--' . $options['type'];
984 452 }
985 453
986 - $wrapper_attributes = [
987 - 'role' => 'region',
988 - 'aria-label' => esc_html__( 'Elementor notice', 'elementor' ),
989 - ];
990 -
991 454 if ( $options['dismissible'] ) {
992 455 $label = esc_html__( 'Dismiss this notice.', 'elementor' );
993 456 $notice_classes[] = 'e-notice--dismissible';
994 457 $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 458 }
998 459
999 460 if ( $options['icon'] ) {
1000 461 $notice_classes[] = 'e-notice--extended';
@@ -1000,17 +461,15 @@
1000 461 $notice_classes[] = 'e-notice--extended';
1001 462 $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
1002 463 }
1003 464
1004 - $wrapper_attributes['class'] = $notice_classes;
465 + $wrapper_attributes = [
466 + 'class' => $notice_classes,
467 + ];
1005 468
1006 469 if ( $options['id'] ) {
1007 470 $wrapper_attributes['data-notice_id'] = $options['id'];
1008 471 }
1009 -
1010 - if ( ! empty( $options['source'] ) ) {
1011 - $wrapper_attributes['data-source'] = $options['source'];
1012 - }
1013 472 ?>
1014 473 <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
1015 474 <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
1016 475 <div class="e-notice__aside">
@@ -1027,9 +486,8 @@
1027 486
1028 487 <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
1029 488 <div class="e-notice__actions">
1030 489 <?php
1031 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
1032 490 foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
1033 491 if ( empty( $button_settings['variant'] ) && $index ) {
1034 492 $button_settings['variant'] = 'outline';
1035 493 }
@@ -1037,20 +495,8 @@
1037 495 if ( empty( $button_settings['text'] ) ) {
1038 496 continue;
1039 497 }
1040 498
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 499 $button = new Button( $button_settings );
1054 500 $button->print_button();
1055 501 } ?>
1056 502 </div>
@@ -1082,61 +528,8 @@
1082 528 return;
1083 529 }
1084 530 }
1085 531
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 532 /**
1140 533 * @since 2.9.0
1141 534 * @access public
1142 535 */
@@ -1141,10 +534,8 @@
1141 534 * @access public
1142 535 */
1143 536 public function __construct() {
1144 537 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 538 }
1148 539
1149 540 /**
1150 541 * Get module name.