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