PluginProbe
Elementor Website Builder – more than just a page builder / 3.11.2
Elementor Website Builder – more than just a page builder v3.11.2
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 +162 -359 4.3.0-beta33.11.2 View file →
@@ -3,15 +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\Utils\Hints;
8 -use Elementor\Core\Utils\Promotions\Filtered_Promotions_Manager;
9 7 use Elementor\Plugin;
10 8 use Elementor\Tracker;
11 9 use Elementor\User;
12 10 use Elementor\Utils;
13 11 use Elementor\Core\Admin\Notices\Base_Notice;
12 +use Elementor\Core\Admin\Notices\Elementor_Dev_Notice;
14 13
15 14 if ( ! defined( 'ABSPATH' ) ) {
16 15 exit; // Exit if accessed directly.
17 16 }
@@ -17,21 +16,21 @@
17 16 }
18 17
19 18 class Admin_Notices extends Module {
20 19
21 - const DEFAULT_EXCLUDED_PAGES = [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ];
20 + const EXCLUDE_PAGES = [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ];
22 21
23 - const EXIT_EARLY_FOR_BACKWARD_COMPATIBILITY = false;
24 -
25 22 private $plain_notices = [
26 23 'api_notice',
27 24 'api_upgrade_plugin',
28 25 'tracker',
29 - 'tracker_last_update',
30 26 'rate_us_feedback',
27 + 'woocommerce_promote',
28 + 'cf7_promote',
29 + 'mc4wp_promote',
30 + 'popup_maker_promote',
31 31 'role_manager_promote',
32 - 'plugin_image_optimization',
33 - 'ally_pages_promotion',
32 + 'experiment_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.
@@ -45,13 +48,13 @@
45 48 *
46 49 * Filters Elementor admin notices.
47 50 *
48 51 * This hook can be used by external developers to manage existing
49 - * admin notice or to add new notices for Elementor add-ons.
52 + * admin notice or to add new notices for Elementor addons.
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,14 +270,14 @@
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' ),
318 - 'description' => esc_html__( 'You created over 10 pages with Elementor. Great job! If you can spare a minute, please help us by leaving a five star review on WordPress.org.', 'elementor' ),
278 + 'description' => esc_html__( 'You created over 10 pages with Elementor. Great job! If you can spare a minute,
279 + please help us by leaving a five star review on WordPress.org.', 'elementor' ),
319 280 'id' => $notice_id,
320 281 'button' => [
321 282 'text' => esc_html__( 'Happy To Help', 'elementor' ),
322 283 'url' => 'https://go.elementor.com/admin-review/',
@@ -336,176 +297,122 @@
336 297
337 298 return true;
338 299 }
339 300
340 - private function notice_role_manager_promote() {
341 - $notice_id = 'role_manager_promote';
301 + private function notice_woocommerce_promote() {
302 + $notice_id = 'woocommerce_promote';
342 303
343 - if ( Utils::has_pro() ) {
304 + if ( Utils::has_pro() || ! function_exists( 'WC' ) ) {
344 305 return false;
345 306 }
346 307
347 - if ( ! current_user_can( 'manage_options' ) ) {
308 + if ( ! current_user_can( 'install_plugins' ) ) {
348 309 return false;
349 310 }
350 311
351 - if ( 'elementor_page_elementor-role-manager' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
312 + if ( ! in_array( $this->current_screen_id, [ 'edit-product', 'woocommerce_page_wc-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
352 313 return false;
353 314 }
354 315
355 - $users = new \WP_User_Query( [
356 - 'fields' => 'ID',
357 - 'number' => 10,
358 - ] );
316 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
317 + return false;
318 + }
359 319
360 - if ( 5 > $users->get_total() ) {
320 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
361 321 return false;
362 322 }
363 323
364 324 $options = [
365 - 'title' => esc_html__( 'Managing a multi-user site?', 'elementor' ),
366 - 'description' => esc_html__( 'With Elementor Pro, you can control user access and make sure no one messes up your design.', 'elementor' ),
325 + 'title' => esc_html__( 'Using WooCommerce?', 'elementor' ),
326 + 'description' => esc_html__( 'With Elementor Pro’s WooCommerce Builder, you’ll be able to design your store without coding!', 'elementor' ),
367 327 'id' => $notice_id,
368 328
369 329 'button' => [
370 330 'text' => esc_html__( 'Learn More', 'elementor' ),
371 - 'url' => 'https://go.elementor.com/plugin-promotion-role-manager/',
331 + 'url' => 'https://go.elementor.com/plugin-promotion-woocommerce/',
372 332 'new_tab' => true,
373 333 'type' => 'cta',
374 334 ],
375 335 ];
376 336
377 - $options = Filtered_Promotions_Manager::get_filtered_promotion_data( $options, 'core/admin/notice_role_manager_promote', 'button', 'url' );
378 -
379 337 $this->print_admin_notice( $options );
380 338
381 339 return true;
382 340 }
383 341
384 - private function get_installed_form_plugin_name() {
385 - static $detected_form_plugin = null;
342 + private function notice_cf7_promote() {
343 + $notice_id = 'cf7_promote';
386 344
387 - if ( null !== $detected_form_plugin ) {
388 - return $detected_form_plugin;
345 + if ( Utils::has_pro() || ! defined( 'WPCF7_VERSION' ) ) {
346 + return false;
389 347 }
390 348
391 - $form_plugins_constants_to_name_mapper = [
392 - 'WPFORMS_VERSION' => 'WPForms',
393 - 'WPCF7_VERSION' => 'Contact Form 7',
394 - ];
349 + if ( ! current_user_can( 'install_plugins' ) ) {
350 + return false;
351 + }
395 352
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 - }
353 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_wpcf7', 'contact_page_wpcf7-integration' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
354 + return false;
401 355 }
402 356
403 - $form_plugins_classes_to_name_mapper = [
404 - '\GFCommon' => 'Gravity Forms',
405 - '\Ninja_Forms' => 'Ninja Forms',
357 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
358 + return false;
359 + }
360 +
361 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
362 + return false;
363 + }
364 +
365 + $options = [
366 + 'title' => esc_html__( 'Using Elementor & Contact Form 7?', 'elementor' ),
367 + 'description' => esc_html__( 'Try out Elementor Pro and design your forms visually with one powerful tool.', 'elementor' ),
368 +
369 + 'id' => $notice_id,
370 + 'button' => [
371 + 'text' => esc_html__( 'Learn More', 'elementor' ),
372 + 'url' => 'https://go.elementor.com/plugin-promotion-contactform7/',
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 notice_mc4wp_promote() {
384 + $notice_id = 'mc4wp_promote';
422 385
423 - if ( 'edit.php' !== $pagenow || empty( $_GET['post_type'] ) || 'page' !== $_GET['post_type'] ) {
386 + if ( Utils::has_pro() || ! defined( 'MC4WP_VERSION' ) ) {
424 387 return false;
425 388 }
426 389
427 - if ( ! current_user_can( 'manage_options' ) ) {
390 + if ( ! current_user_can( 'install_plugins' ) ) {
428 391 return false;
429 392 }
430 393
431 - if ( User::is_user_notice_viewed( $notice_id ) ) {
394 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_mailchimp-for-wp', 'mc4wp_page_mailchimp-for-wp-forms', 'mc4wp_page_mailchimp-for-wp-integrations', 'mc4wp_page_mailchimp-for-wp-other', 'mc4wp_page_mailchimp-for-wp-extensions' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
432 395 return false;
433 396 }
434 397
435 - $plugin_slug = 'pojo-accessibility';
436 - $plugin_file_path = 'pojo-accessibility/pojo-accessibility.php';
437 -
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 ) {
398 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
443 399 return false;
444 400 }
445 401
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 - }
402 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
403 + return false;
493 404 }
494 405
495 406 $options = [
496 - 'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
497 - 'description' => $description,
407 + 'title' => esc_html__( 'Want to design better MailChimp forms?', 'elementor' ),
408 + 'description' => esc_html__( 'Use Elementor Pro and enjoy unlimited integrations, visual design, templates and more.', 'elementor' ),
409 + 'dismissible' => true,
498 410 'id' => $notice_id,
499 - 'type' => 'cta',
411 +
500 412 'button' => [
501 - 'text' => $button_text,
502 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
503 - 'type' => 'cta',
504 - ],
505 - 'button_secondary' => [
506 - 'text' => esc_html__( 'Learn more', 'elementor' ),
507 - 'url' => $learn_more_url,
413 + 'text' => esc_html__( 'Learn More', 'elementor' ),
414 + 'url' => 'https://go.elementor.com/plugin-promotion-mc4wp/',
508 415 'new_tab' => true,
509 416 'type' => 'cta',
510 417 ],
511 418 ];
@@ -514,61 +421,54 @@
514 421
515 422 return true;
516 423 }
517 424
518 - private function is_elementor_page(): bool {
519 - return 0 === strpos( $this->current_screen_id, 'elementor_page' );
520 - }
425 + private function notice_popup_maker_promote() {
426 + $notice_id = 'popup_maker_promote';
521 427
522 - private function is_elementor_admin_screen(): bool {
523 - return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library' ], true );
524 - }
428 + if ( Utils::has_pro() || ! class_exists( 'Popup_Maker' ) ) {
429 + return false;
430 + }
525 431
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 - }
432 + if ( ! current_user_can( 'install_plugins' ) ) {
433 + return false;
434 + }
532 435
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 );
535 - }
436 + if ( ! in_array( $this->current_screen_id, [ 'edit-popup', 'popup_page_pum-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
437 + return false;
438 + }
536 439
537 - private function get_plugin_button_connect_url( $plugin_settings_page ) {
538 - return self_admin_url( $plugin_settings_page );
539 - }
440 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
441 + return false;
442 + }
540 443
541 - private function get_plugin_cta_data( $plugin_slug, $plugin_file_path ) {
542 - if ( Hints::is_plugin_active( $plugin_slug ) ) {
444 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
543 445 return false;
544 446 }
545 447
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' );
549 - } else {
550 - $url = $this->get_plugin_button_install_url( $plugin_slug );
551 - $cta_text = esc_html__( 'Install now', 'elementor' );
552 - }
448 + $options = [
449 + 'title' => esc_html__( 'Using popups on your site?', 'elementor' ),
450 + 'description' => esc_html__( 'Build outstanding popups using Elementor Pro and get more leads, sales and subscribers.', 'elementor' ),
451 + 'dismissible' => true,
452 + 'id' => $notice_id,
553 453
554 - return [
555 - 'url' => $url,
556 - 'text' => $cta_text,
454 + 'button' => [
455 + 'text' => esc_html__( 'Learn More', 'elementor' ),
456 + 'url' => 'https://go.elementor.com/plugin-promotion-popupmaker/',
457 + 'new_tab' => true,
458 + 'type' => 'cta',
459 + ],
557 460 ];
558 - }
559 461
560 - /**
561 - * For testing purposes
562 - */
563 - public function get_elementor_version() {
564 - return ELEMENTOR_VERSION;
462 + $this->print_admin_notice( $options );
463 +
464 + return true;
565 465 }
566 466
567 - private function notice_plugin_image_optimization() {
568 - $notice_id = 'plugin_image_optimization';
467 + private function notice_role_manager_promote() {
468 + $notice_id = 'role_manager_promote';
569 469
570 - if ( 'upload' !== $this->current_screen_id ) {
470 + if ( Utils::has_pro() ) {
571 471 return false;
572 472 }
573 473
574 474 if ( ! current_user_can( 'manage_options' ) ) {
@@ -574,94 +474,73 @@
574 474 if ( ! current_user_can( 'manage_options' ) ) {
575 475 return false;
576 476 }
577 477
578 - if ( User::is_user_notice_viewed( $notice_id ) ) {
478 + if ( 'elementor_page_elementor-role-manager' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
579 479 return false;
580 480 }
581 481
582 - $attachments = new \WP_Query( [
583 - 'post_type' => 'attachment',
584 - 'post_status' => 'any',
585 - 'fields' => 'ids',
482 + $users = new \WP_User_Query( [
483 + 'fields' => 'ID',
484 + 'number' => 10,
586 485 ] );
587 486
588 - if ( 1 > $attachments->found_posts ) {
487 + if ( 5 > $users->get_total() ) {
589 488 return false;
590 489 }
591 490
592 - $plugin_slug = 'image-optimization';
593 - $plugin_file_path = 'image-optimization/image-optimization.php';
491 + $options = [
492 + 'title' => esc_html__( 'Managing a multi-user site?', 'elementor' ),
493 + 'description' => esc_html__( 'With Elementor Pro, you can control user access and make sure no one messes up your design.', 'elementor' ),
494 + 'id' => $notice_id,
594 495
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 );
496 + 'button' => [
497 + 'text' => esc_html__( 'Learn More', 'elementor' ),
498 + 'url' => 'https://go.elementor.com/plugin-promotion-role-manager/',
499 + 'new_tab' => true,
500 + 'type' => 'cta',
501 + ],
502 + ];
598 503
599 - if ( $is_active ) {
504 + $this->print_admin_notice( $options );
505 +
506 + return true;
507 + }
508 +
509 + private function notice_experiment_promotion() {
510 + $notice_id = 'experiment_promotion';
511 +
512 + if ( ! current_user_can( 'manage_options' ) || User::is_user_notice_viewed( $notice_id ) ) {
600 513 return false;
601 514 }
602 515
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' );
516 + $experiments = Plugin::$instance->experiments;
517 + $is_all_performance_features_active = (
518 + $experiments->is_feature_active( 'e_dom_optimization' ) &&
519 + $experiments->is_feature_active( 'additional_custom_breakpoints' ) &&
520 + $experiments->is_feature_active( 'e_optimized_css_loading' ) &&
521 + $experiments->is_feature_active( 'e_optimized_assets_loading' )
522 + );
627 523
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 - }
524 + if ( $is_all_performance_features_active ) {
525 + return false;
647 526 }
648 527
649 528 $options = [
650 - 'title' => esc_html__( 'Speed up your website with Image Optimization', 'elementor' ),
651 - 'description' => $description,
529 + 'title' => esc_html__( 'Improve your site’s performance score.', 'elementor' ),
530 + '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' ),
652 531 'id' => $notice_id,
653 - 'type' => 'cta',
654 532 'button' => [
655 - 'text' => $button_text,
656 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
533 + 'text' => esc_html__( 'Try it out', 'elementor' ),
534 + 'url' => admin_url( 'admin.php?page=elementor#tab-experiments' ),
657 535 'type' => 'cta',
658 - 'data' => [
659 - 'campaign' => $campaign_data['campaign'],
660 - 'source' => $campaign_data['source'],
661 - 'medium' => $campaign_data['medium'],
662 - ],
663 536 ],
537 + 'button_secondary' => [
538 + 'text' => esc_html__( 'Learn more', 'elementor' ),
539 + 'url' => 'https://go.elementor.com/wp-dash-experiment-promotion/',
540 + 'new_tab' => true,
541 + 'type' => 'cta',
542 + ],
664 543 ];
665 544
666 545 $this->print_admin_notice( $options );
667 546
@@ -667,12 +546,12 @@
667 546
668 547 return true;
669 548 }
670 549
671 - public function print_admin_notice( array $options, $exclude_pages = self::DEFAULT_EXCLUDED_PAGES ) {
550 + public function print_admin_notice( array $options ) {
672 551 global $pagenow;
673 552
674 - if ( in_array( $pagenow, $exclude_pages, true ) ) {
553 + if ( in_array( $pagenow, self::EXCLUDE_PAGES ) ) {
675 554 return;
676 555 }
677 556
678 557 $default_options = [
@@ -681,9 +560,9 @@
681 560 'description' => '',
682 561 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
683 562 'type' => '',
684 563 'dismissible' => true,
685 - 'icon' => 'eicon-elementor-circle',
564 + 'icon' => 'eicon-elementor',
686 565 'button' => [],
687 566 'button_secondary' => [],
688 567 ];
689 568
@@ -696,19 +575,12 @@
696 575 if ( $options['type'] ) {
697 576 $notice_classes[] = 'e-notice--' . $options['type'];
698 577 }
699 578
700 - $wrapper_attributes = [
701 - 'role' => 'region',
702 - 'aria-label' => esc_html__( 'Elementor notice', 'elementor' ),
703 - ];
704 -
705 579 if ( $options['dismissible'] ) {
706 - $label = esc_html__( 'Dismiss this notice.', 'elementor' );
580 + $label = esc_html__( 'Dismiss', 'elementor' );
707 581 $notice_classes[] = 'e-notice--dismissible';
708 582 $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 583 }
712 584
713 585 if ( $options['icon'] ) {
714 586 $notice_classes[] = 'e-notice--extended';
@@ -714,17 +586,15 @@
714 586 $notice_classes[] = 'e-notice--extended';
715 587 $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
716 588 }
717 589
718 - $wrapper_attributes['class'] = $notice_classes;
590 + $wrapper_attributes = [
591 + 'class' => $notice_classes,
592 + ];
719 593
720 594 if ( $options['id'] ) {
721 595 $wrapper_attributes['data-notice_id'] = $options['id'];
722 596 }
723 -
724 - if ( ! empty( $options['source'] ) ) {
725 - $wrapper_attributes['data-source'] = $options['source'];
726 - }
727 597 ?>
728 598 <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
729 599 <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
730 600 <div class="e-notice__aside">
@@ -741,9 +611,8 @@
741 611
742 612 <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
743 613 <div class="e-notice__actions">
744 614 <?php
745 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
746 615 foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
747 616 if ( empty( $button_settings['variant'] ) && $index ) {
748 617 $button_settings['variant'] = 'outline';
749 618 }
@@ -751,20 +620,8 @@
751 620 if ( empty( $button_settings['text'] ) ) {
752 621 continue;
753 622 }
754 623
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 624 $button = new Button( $button_settings );
768 625 $button->print_button();
769 626 } ?>
770 627 </div>
@@ -796,60 +653,8 @@
796 653 return;
797 654 }
798 655 }
799 656
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 657 /**
853 658 * @since 2.9.0
854 659 * @access public
855 660 */
@@ -854,10 +659,8 @@
854 659 * @access public
855 660 */
856 661 public function __construct() {
857 662 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 663 }
861 664
862 665 /**
863 666 * Get module name.