PluginProbe
Elementor Website Builder – more than just a page builder / 3.6.3
Elementor Website Builder – more than just a page builder v3.6.3
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 +152 -391 4.3.0-beta33.6.3 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,20 @@
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',
34 32 ];
35 33
36 34 private $elementor_pages_count = null;
37 35
@@ -39,8 +37,12 @@
39 37
40 38 private $current_screen_id = null;
41 39
42 40 private function get_notices() {
41 + $notices = [
42 + new Elementor_Dev_Notice(),
43 + ];
44 +
43 45 /**
44 46 * Admin notices.
45 47 *
46 48 * Filters Elementor admin notices.
@@ -45,13 +47,13 @@
45 47 *
46 48 * Filters Elementor admin notices.
47 49 *
48 50 * This hook can be used by external developers to manage existing
49 - * admin notice or to add new notices for Elementor add-ons.
51 + * admin notice or to add new notices for Elementor addons.
50 52 *
51 53 * @param array $notices A list of notice classes.
52 54 */
53 - $notices = apply_filters( 'elementor/core/admin/notices', [] );
55 + $notices = apply_filters( 'elementor/core/admin/notices', $notices );
54 56
55 57 return $notices;
56 58 }
57 59
@@ -91,13 +93,13 @@
91 93 if ( ! current_user_can( 'update_plugins' ) ) {
92 94 return false;
93 95 }
94 96
95 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
97 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
96 98 return false;
97 99 }
98 100
99 - // Check for upgrades.
101 + // Check if have any upgrades.
100 102 $update_plugins = get_site_transient( 'update_plugins' );
101 103
102 104 $has_remote_update_package = ! ( empty( $update_plugins ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ] ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ]->package ) );
103 105
@@ -117,9 +119,9 @@
117 119
118 120 $new_version = $upgrade_notice['version'];
119 121 }
120 122
121 - // Check if upgrade messages should be shown.
123 + // Check if have upgrade notices to show.
122 124 if ( version_compare( ELEMENTOR_VERSION, $upgrade_notice['version'], '>=' ) ) {
123 125 return false;
124 126 }
125 127
@@ -131,16 +133,16 @@
131 133 $message = sprintf(
132 134 /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text. */
133 135 __( 'There is a new version of Elementor Page Builder available. <a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">View version %3$s details</a> or <a href="%4$s" class="update-link" aria-label="%5$s">update now</a>.', 'elementor' ),
134 136 esc_url( $details_url ),
135 - sprintf(
137 + esc_attr( sprintf(
136 138 /* translators: %s: Elementor version. */
137 - esc_attr__( 'View Elementor version %s details', 'elementor' ),
139 + __( 'View Elementor version %s details', 'elementor' ),
138 140 $new_version
139 - ),
141 + ) ),
140 142 $new_version,
141 143 esc_url( $upgrade_url ),
142 - esc_attr__( 'Update Now', 'elementor' )
144 + esc_attr( esc_html__( 'Update Elementor Now', 'elementor' ) )
143 145 );
144 146
145 147 $options = [
146 148 'title' => esc_html__( 'Update Notification', 'elementor' ),
@@ -167,9 +169,9 @@
167 169 if ( ! current_user_can( 'manage_options' ) ) {
168 170 return false;
169 171 }
170 172
171 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
173 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
172 174 return false;
173 175 }
174 176
175 177 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
@@ -213,9 +215,9 @@
213 215 // TODO: Skip for development env.
214 216 $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
215 217 $optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
216 218
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' );
219 + $tracker_description_text = esc_html__( 'Become a super contributor by opting in to share non-sensitive plugin data and to receive periodic email updates from us.', 'elementor' );
218 220
219 221 /**
220 222 * Tracker admin description text.
221 223 *
@@ -229,11 +231,10 @@
229 231
230 232 $message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
231 233
232 234 $options = [
233 - 'title' => esc_html__( 'Want to shape the future of web creation?', 'elementor' ),
235 + 'title' => esc_html__( 'Love using Elementor?', 'elementor' ),
234 236 'description' => $message,
235 - 'dismissible' => false,
236 237 'button' => [
237 238 'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
238 239 'url' => $optin_url,
239 240 'type' => 'cta',
@@ -250,49 +251,8 @@
250 251
251 252 return true;
252 253 }
253 254
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 255 private function notice_rate_us_feedback() {
296 256 $notice_id = 'rate_us_feedback';
297 257
298 258 if ( ! current_user_can( 'manage_options' ) ) {
@@ -309,14 +269,14 @@
309 269
310 270 $dismiss_url = add_query_arg( [
311 271 'action' => 'elementor_set_admin_notice_viewed',
312 272 'notice_id' => esc_attr( $notice_id ),
313 - '_wpnonce' => wp_create_nonce( 'elementor_set_admin_notice_viewed' ),
314 273 ], admin_url( 'admin-post.php' ) );
315 274
316 275 $options = [
317 276 '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' ),
277 + 'description' => esc_html__( 'You created over 10 pages with Elementor. Great job! If you can spare a minute,
278 + please help us by leaving a five star review on WordPress.org.', 'elementor' ),
319 279 'id' => $notice_id,
320 280 'button' => [
321 281 'text' => esc_html__( 'Happy To Help', 'elementor' ),
322 282 'url' => 'https://go.elementor.com/admin-review/',
@@ -336,176 +296,122 @@
336 296
337 297 return true;
338 298 }
339 299
340 - private function notice_role_manager_promote() {
341 - $notice_id = 'role_manager_promote';
300 + private function notice_woocommerce_promote() {
301 + $notice_id = 'woocommerce_promote';
342 302
343 - if ( Utils::has_pro() ) {
303 + if ( Utils::has_pro() || ! function_exists( 'WC' ) ) {
344 304 return false;
345 305 }
346 306
347 - if ( ! current_user_can( 'manage_options' ) ) {
307 + if ( ! current_user_can( 'install_plugins' ) ) {
348 308 return false;
349 309 }
350 310
351 - if ( 'elementor_page_elementor-role-manager' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
311 + if ( ! in_array( $this->current_screen_id, [ 'edit-product', 'woocommerce_page_wc-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
352 312 return false;
353 313 }
354 314
355 - $users = new \WP_User_Query( [
356 - 'fields' => 'ID',
357 - 'number' => 10,
358 - ] );
315 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
316 + return false;
317 + }
359 318
360 - if ( 5 > $users->get_total() ) {
319 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
361 320 return false;
362 321 }
363 322
364 323 $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' ),
324 + 'title' => esc_html__( 'Using WooCommerce?', 'elementor' ),
325 + 'description' => esc_html__( 'With Elementor Pro’s WooCommerce Builder, you’ll be able to design your store without coding!', 'elementor' ),
367 326 'id' => $notice_id,
368 327
369 328 'button' => [
370 329 'text' => esc_html__( 'Learn More', 'elementor' ),
371 - 'url' => 'https://go.elementor.com/plugin-promotion-role-manager/',
330 + 'url' => 'https://go.elementor.com/plugin-promotion-woocommerce/',
372 331 'new_tab' => true,
373 332 'type' => 'cta',
374 333 ],
375 334 ];
376 335
377 - $options = Filtered_Promotions_Manager::get_filtered_promotion_data( $options, 'core/admin/notice_role_manager_promote', 'button', 'url' );
378 -
379 336 $this->print_admin_notice( $options );
380 337
381 338 return true;
382 339 }
383 340
384 - private function get_installed_form_plugin_name() {
385 - static $detected_form_plugin = null;
341 + private function notice_cf7_promote() {
342 + $notice_id = 'cf7_promote';
386 343
387 - if ( null !== $detected_form_plugin ) {
388 - return $detected_form_plugin;
344 + if ( Utils::has_pro() || ! defined( 'WPCF7_VERSION' ) ) {
345 + return false;
389 346 }
390 347
391 - $form_plugins_constants_to_name_mapper = [
392 - 'WPFORMS_VERSION' => 'WPForms',
393 - 'WPCF7_VERSION' => 'Contact Form 7',
394 - ];
348 + if ( ! current_user_can( 'install_plugins' ) ) {
349 + return false;
350 + }
395 351
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 - }
352 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_wpcf7', 'contact_page_wpcf7-integration' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
353 + return false;
401 354 }
402 355
403 - $form_plugins_classes_to_name_mapper = [
404 - '\GFCommon' => 'Gravity Forms',
405 - '\Ninja_Forms' => 'Ninja Forms',
356 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
357 + return false;
358 + }
359 +
360 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
361 + return false;
362 + }
363 +
364 + $options = [
365 + 'title' => esc_html__( 'Using Elementor & Contact Form 7?', 'elementor' ),
366 + 'description' => esc_html__( 'Try out Elementor Pro and design your forms visually with one powerful tool.', 'elementor' ),
367 +
368 + 'id' => $notice_id,
369 + 'button' => [
370 + 'text' => esc_html__( 'Learn More', 'elementor' ),
371 + 'url' => 'https://go.elementor.com/plugin-promotion-contactform7/',
372 + 'new_tab' => true,
373 + 'type' => 'cta',
374 + ],
406 375 ];
407 376
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 - }
377 + $this->print_admin_notice( $options );
414 378
415 - $detected_form_plugin = false;
416 - return $detected_form_plugin;
379 + return true;
417 380 }
418 381
419 - private function notice_ally_pages_promotion() {
420 - global $pagenow;
421 - $notice_id = 'ally_pages_promotion';
382 + private function notice_mc4wp_promote() {
383 + $notice_id = 'mc4wp_promote';
422 384
423 - if ( 'edit.php' !== $pagenow || empty( $_GET['post_type'] ) || 'page' !== $_GET['post_type'] ) {
385 + if ( Utils::has_pro() || ! defined( 'MC4WP_VERSION' ) ) {
424 386 return false;
425 387 }
426 388
427 - if ( ! current_user_can( 'manage_options' ) ) {
389 + if ( ! current_user_can( 'install_plugins' ) ) {
428 390 return false;
429 391 }
430 392
431 - if ( User::is_user_notice_viewed( $notice_id ) ) {
393 + 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 394 return false;
433 395 }
434 396
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 ) {
397 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
443 398 return false;
444 399 }
445 400
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 - }
401 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
402 + return false;
493 403 }
494 404
495 405 $options = [
496 - 'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
497 - 'description' => $description,
406 + 'title' => esc_html__( 'Want to design better MailChimp forms?', 'elementor' ),
407 + 'description' => esc_html__( 'Use Elementor Pro and enjoy unlimited integrations, visual design, templates and more.', 'elementor' ),
408 + 'dismissible' => true,
498 409 'id' => $notice_id,
499 - 'type' => 'cta',
410 +
500 411 '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,
412 + 'text' => esc_html__( 'Learn More', 'elementor' ),
413 + 'url' => 'https://go.elementor.com/plugin-promotion-mc4wp/',
508 414 'new_tab' => true,
509 415 'type' => 'cta',
510 416 ],
511 417 ];
@@ -514,61 +420,54 @@
514 420
515 421 return true;
516 422 }
517 423
518 - private function is_elementor_page(): bool {
519 - return 0 === strpos( $this->current_screen_id, 'elementor_page' );
520 - }
424 + private function notice_popup_maker_promote() {
425 + $notice_id = 'popup_maker_promote';
521 426
522 - private function is_elementor_admin_screen(): bool {
523 - return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library' ], true );
524 - }
427 + if ( Utils::has_pro() || ! class_exists( 'Popup_Maker' ) ) {
428 + return false;
429 + }
525 430
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 - }
431 + if ( ! current_user_can( 'install_plugins' ) ) {
432 + return false;
433 + }
532 434
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 - }
435 + if ( ! in_array( $this->current_screen_id, [ 'edit-popup', 'popup_page_pum-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
436 + return false;
437 + }
536 438
537 - private function get_plugin_button_connect_url( $plugin_settings_page ) {
538 - return self_admin_url( $plugin_settings_page );
539 - }
439 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
440 + return false;
441 + }
540 442
541 - private function get_plugin_cta_data( $plugin_slug, $plugin_file_path ) {
542 - if ( Hints::is_plugin_active( $plugin_slug ) ) {
443 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
543 444 return false;
544 445 }
545 446
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 - }
447 + $options = [
448 + 'title' => esc_html__( 'Using popups on your site?', 'elementor' ),
449 + 'description' => esc_html__( 'Build outstanding popups using Elementor Pro and get more leads, sales and subscribers.', 'elementor' ),
450 + 'dismissible' => true,
451 + 'id' => $notice_id,
553 452
554 - return [
555 - 'url' => $url,
556 - 'text' => $cta_text,
453 + 'button' => [
454 + 'text' => esc_html__( 'Learn More', 'elementor' ),
455 + 'url' => 'https://go.elementor.com/plugin-promotion-popupmaker/',
456 + 'new_tab' => true,
457 + 'type' => 'cta',
458 + ],
557 459 ];
558 - }
559 460
560 - /**
561 - * For testing purposes
562 - */
563 - public function get_elementor_version() {
564 - return ELEMENTOR_VERSION;
461 + $this->print_admin_notice( $options );
462 +
463 + return true;
565 464 }
566 465
567 - private function notice_plugin_image_optimization() {
568 - $notice_id = 'plugin_image_optimization';
466 + private function notice_role_manager_promote() {
467 + $notice_id = 'role_manager_promote';
569 468
570 - if ( 'upload' !== $this->current_screen_id ) {
469 + if ( Utils::has_pro() ) {
571 470 return false;
572 471 }
573 472
574 473 if ( ! current_user_can( 'manage_options' ) ) {
@@ -574,93 +473,31 @@
574 473 if ( ! current_user_can( 'manage_options' ) ) {
575 474 return false;
576 475 }
577 476
578 - if ( User::is_user_notice_viewed( $notice_id ) ) {
477 + if ( 'elementor_page_elementor-role-manager' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
579 478 return false;
580 479 }
581 480
582 - $attachments = new \WP_Query( [
583 - 'post_type' => 'attachment',
584 - 'post_status' => 'any',
585 - 'fields' => 'ids',
481 + $users = new \WP_User_Query( [
482 + 'fields' => 'ID',
483 + 'number' => 10,
586 484 ] );
587 485
588 - if ( 1 > $attachments->found_posts ) {
486 + if ( 5 > $users->get_total() ) {
589 487 return false;
590 488 }
591 489
592 - $plugin_slug = 'image-optimization';
593 - $plugin_file_path = 'image-optimization/image-optimization.php';
594 -
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 );
598 -
599 - if ( $is_active ) {
600 - return false;
601 - }
602 -
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 490 $options = [
650 - 'title' => esc_html__( 'Speed up your website with Image Optimization', 'elementor' ),
651 - 'description' => $description,
491 + 'title' => esc_html__( 'Managing a multi-user site?', 'elementor' ),
492 + 'description' => esc_html__( 'With Elementor Pro, you can control user access and make sure no one messes up your design.', 'elementor' ),
652 493 'id' => $notice_id,
653 - 'type' => 'cta',
494 +
654 495 'button' => [
655 - 'text' => $button_text,
656 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
496 + 'text' => esc_html__( 'Learn More', 'elementor' ),
497 + 'url' => 'https://go.elementor.com/plugin-promotion-role-manager/',
498 + 'new_tab' => true,
657 499 'type' => 'cta',
658 - 'data' => [
659 - 'campaign' => $campaign_data['campaign'],
660 - 'source' => $campaign_data['source'],
661 - 'medium' => $campaign_data['medium'],
662 - ],
663 500 ],
664 501 ];
665 502
666 503 $this->print_admin_notice( $options );
@@ -667,12 +504,12 @@
667 504
668 505 return true;
669 506 }
670 507
671 - public function print_admin_notice( array $options, $exclude_pages = self::DEFAULT_EXCLUDED_PAGES ) {
508 + public function print_admin_notice( array $options ) {
672 509 global $pagenow;
673 510
674 - if ( in_array( $pagenow, $exclude_pages, true ) ) {
511 + if ( in_array( $pagenow, self::EXCLUDE_PAGES ) ) {
675 512 return;
676 513 }
677 514
678 515 $default_options = [
@@ -681,9 +518,9 @@
681 518 'description' => '',
682 519 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
683 520 'type' => '',
684 521 'dismissible' => true,
685 - 'icon' => 'eicon-elementor-circle',
522 + 'icon' => 'eicon-elementor',
686 523 'button' => [],
687 524 'button_secondary' => [],
688 525 ];
689 526
@@ -696,19 +533,12 @@
696 533 if ( $options['type'] ) {
697 534 $notice_classes[] = 'e-notice--' . $options['type'];
698 535 }
699 536
700 - $wrapper_attributes = [
701 - 'role' => 'region',
702 - 'aria-label' => esc_html__( 'Elementor notice', 'elementor' ),
703 - ];
704 -
705 537 if ( $options['dismissible'] ) {
706 - $label = esc_html__( 'Dismiss this notice.', 'elementor' );
538 + $label = esc_html__( 'Dismiss', 'elementor' );
707 539 $notice_classes[] = 'e-notice--dismissible';
708 540 $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 541 }
712 542
713 543 if ( $options['icon'] ) {
714 544 $notice_classes[] = 'e-notice--extended';
@@ -714,17 +544,15 @@
714 544 $notice_classes[] = 'e-notice--extended';
715 545 $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
716 546 }
717 547
718 - $wrapper_attributes['class'] = $notice_classes;
548 + $wrapper_attributes = [
549 + 'class' => $notice_classes,
550 + ];
719 551
720 552 if ( $options['id'] ) {
721 553 $wrapper_attributes['data-notice_id'] = $options['id'];
722 554 }
723 -
724 - if ( ! empty( $options['source'] ) ) {
725 - $wrapper_attributes['data-source'] = $options['source'];
726 - }
727 555 ?>
728 556 <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
729 557 <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
730 558 <div class="e-notice__aside">
@@ -730,49 +558,36 @@
730 558 <div class="e-notice__aside">
731 559 <?php echo $icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
732 560 </div>
733 561 <div class="e-notice__content">
734 - <?php if ( $options['title'] ) { ?>
735 - <h3><?php echo wp_kses_post( $options['title'] ); ?></h3>
736 - <?php } ?>
562 + <?php if ( $options['title'] ) { ?>
563 + <h3><?php echo wp_kses_post( $options['title'] ); ?></h3>
564 + <?php } ?>
737 565
738 - <?php if ( $options['description'] ) { ?>
739 - <p><?php echo wp_kses_post( $options['description'] ); ?></p>
740 - <?php } ?>
566 + <?php if ( $options['description'] ) { ?>
567 + <p><?php echo wp_kses_post( $options['description'] ); ?></p>
568 + <?php } ?>
741 569
742 - <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
743 - <div class="e-notice__actions">
744 - <?php
745 - $one_subscription = Hints::is_plugin_connected_to_one_subscription();
746 - foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
747 - if ( empty( $button_settings['variant'] ) && $index ) {
748 - $button_settings['variant'] = 'outline';
749 - }
570 + <?php if ( ! empty( $options['button']['text'] ) || ! empty( $options['button_secondary']['text'] ) ) { ?>
571 + <div class="e-notice__actions">
572 + <?php
573 + foreach ( [ $options['button'], $options['button_secondary'] ] as $index => $button_settings ) {
574 + if ( empty( $button_settings['variant'] ) && $index ) {
575 + $button_settings['variant'] = 'outline';
576 + }
750 577
751 - if ( empty( $button_settings['text'] ) ) {
752 - continue;
753 - }
578 + if ( empty( $button_settings['text'] ) ) {
579 + continue;
580 + }
754 581
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 - $button = new Button( $button_settings );
768 - $button->print_button();
769 - } ?>
770 - </div>
771 - <?php } ?>
582 + $button = new Button( $button_settings );
583 + $button->print_button();
584 + } ?>
585 + </div>
586 + <?php } ?>
772 587 </div>
773 588 </div>
774 - <?php }
589 + <?php }
775 590
776 591 public function admin_notices() {
777 592 $this->install_time = Plugin::$instance->get_install_time();
778 593 $this->current_screen_id = get_current_screen()->id;
@@ -796,60 +611,8 @@
796 611 return;
797 612 }
798 613 }
799 614
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 615 /**
853 616 * @since 2.9.0
854 617 * @access public
855 618 */
@@ -854,10 +617,8 @@
854 617 * @access public
855 618 */
856 619 public function __construct() {
857 620 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 621 }
861 622
862 623 /**
863 624 * Get module name.