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