PluginProbe
Elementor Website Builder – more than just a page builder / 3.0.6
Elementor Website Builder – more than just a page builder v3.0.6
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 +258 -563 4.3.0-beta23.0.6 View file →
@@ -1,17 +1,13 @@
1 1 <?php
2 2 namespace Elementor\Core\Admin;
3 3
4 4 use Elementor\Api;
5 -use Elementor\Core\Admin\UI\Components\Button;
6 5 use Elementor\Core\Base\Module;
7 -use Elementor\Core\Utils\Hints;
8 -use Elementor\Core\Utils\Promotions\Filtered_Promotions_Manager;
9 6 use Elementor\Plugin;
10 7 use Elementor\Tracker;
11 8 use Elementor\User;
12 9 use Elementor\Utils;
13 -use Elementor\Core\Admin\Notices\Base_Notice;
14 10
15 11 if ( ! defined( 'ABSPATH' ) ) {
16 12 exit; // Exit if accessed directly.
17 13 }
@@ -17,21 +13,18 @@
17 13 }
18 14
19 15 class Admin_Notices extends Module {
20 16
21 - const DEFAULT_EXCLUDED_PAGES = [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ];
22 -
23 - const EXIT_EARLY_FOR_BACKWARD_COMPATIBILITY = false;
24 -
25 - private $plain_notices = [
17 + private $notices = [
26 18 'api_notice',
27 19 'api_upgrade_plugin',
28 20 'tracker',
29 - 'tracker_last_update',
30 21 'rate_us_feedback',
22 + 'woocommerce_promote',
23 + 'cf7_promote',
24 + 'mc4wp_promote',
25 + 'popup_maker_promote',
31 26 'role_manager_promote',
32 - 'plugin_image_optimization',
33 - 'ally_pages_promotion',
34 27 ];
35 28
36 29 private $elementor_pages_count = null;
37 30
@@ -38,24 +31,8 @@
38 31 private $install_time = null;
39 32
40 33 private $current_screen_id = null;
41 34
42 - 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', [] );
54 -
55 - return $notices;
56 - }
57 -
58 35 private function get_install_time() {
59 36 if ( null === $this->install_time ) {
60 37 $this->install_time = Plugin::$instance->get_install_time();
61 38 }
@@ -65,9 +42,8 @@
65 42
66 43 private function get_elementor_pages_count() {
67 44 if ( null === $this->elementor_pages_count ) {
68 45 $elementor_pages = new \WP_Query( [
69 - 'no_found_rows' => true,
70 46 'post_type' => 'any',
71 47 'post_status' => 'publish',
72 48 'fields' => 'ids',
73 49 'update_post_meta_cache' => false,
@@ -91,13 +67,13 @@
91 67 if ( ! current_user_can( 'update_plugins' ) ) {
92 68 return false;
93 69 }
94 70
95 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
71 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
96 72 return false;
97 73 }
98 74
99 - // Check for upgrades.
75 + // Check if have any upgrades.
100 76 $update_plugins = get_site_transient( 'update_plugins' );
101 77
102 78 $has_remote_update_package = ! ( empty( $update_plugins ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ] ) || empty( $update_plugins->response[ ELEMENTOR_PLUGIN_BASE ]->package ) );
103 79
@@ -117,9 +93,9 @@
117 93
118 94 $new_version = $upgrade_notice['version'];
119 95 }
120 96
121 - // Check if upgrade messages should be shown.
97 + // Check if have upgrade notices to show.
122 98 if ( version_compare( ELEMENTOR_VERSION, $upgrade_notice['version'], '>=' ) ) {
123 99 return false;
124 100 }
125 101
@@ -126,36 +102,46 @@
126 102 $notice_id = 'upgrade_notice_' . $upgrade_notice['version'];
127 103 if ( User::is_user_notice_viewed( $notice_id ) ) {
128 104 return false;
129 105 }
106 + ?>
107 + <div class="notice updated is-dismissible elementor-message elementor-message-dismissed" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
108 + <div class="elementor-message-inner">
109 + <div class="elementor-message-icon">
110 + <div class="e-logo-wrapper">
111 + <i class="eicon-elementor" aria-hidden="true"></i>
112 + </div>
113 + </div>
114 + <div class="elementor-message-content">
115 + <strong><?php echo __( 'Update Notification', 'elementor' ); ?></strong>
116 + <p>
117 + <?php
118 + printf(
119 + /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text */
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' ),
121 + esc_url( $details_url ),
122 + esc_attr( sprintf(
123 + /* translators: %s: Elementor version */
124 + __( 'View Elementor version %s details', 'elementor' ),
125 + $new_version
126 + ) ),
127 + $new_version,
128 + esc_url( $upgrade_url ),
129 + esc_attr( __( 'Update Elementor Now', 'elementor' ) )
130 + );
131 + ?>
132 + </p>
133 + </div>
134 + <div class="elementor-message-action">
135 + <a class="button elementor-button" href="<?php echo $upgrade_url; ?>">
136 + <i class="dashicons dashicons-update" aria-hidden="true"></i>
137 + <?php echo __( 'Update Now', 'elementor' ); ?>
138 + </a>
139 + </div>
140 + </div>
141 + </div>
142 + <?php
130 143
131 - $message = sprintf(
132 - /* translators: 1: Details URL, 2: Accessibility text, 3: Version number, 4: Update URL, 5: Accessibility text. */
133 - __( 'There is a new version of Elementor Page Builder available. <a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">View version %3$s details</a> or <a href="%4$s" class="update-link" aria-label="%5$s">update now</a>.', 'elementor' ),
134 - esc_url( $details_url ),
135 - sprintf(
136 - /* translators: %s: Elementor version. */
137 - esc_attr__( 'View Elementor version %s details', 'elementor' ),
138 - $new_version
139 - ),
140 - $new_version,
141 - esc_url( $upgrade_url ),
142 - esc_attr__( 'Update Now', 'elementor' )
143 - );
144 -
145 - $options = [
146 - 'title' => esc_html__( 'Update Notification', 'elementor' ),
147 - 'description' => $message,
148 - 'button' => [
149 - 'icon_classes' => 'dashicons dashicons-update',
150 - 'text' => esc_html__( 'Update Now', 'elementor' ),
151 - 'url' => $upgrade_url,
152 - ],
153 - 'id' => $notice_id,
154 - ];
155 -
156 - $this->print_admin_notice( $options );
157 -
158 144 return true;
159 145 }
160 146
161 147 private function notice_api_notice() {
@@ -167,9 +153,9 @@
167 153 if ( ! current_user_can( 'manage_options' ) ) {
168 154 return false;
169 155 }
170 156
171 - if ( ! $this->is_elementor_admin_screen_with_system_info() ) {
157 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library', 'elementor_page_elementor-system-info', 'dashboard' ], true ) ) {
172 158 return false;
173 159 }
174 160
175 161 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
@@ -175,17 +161,14 @@
175 161 $notice_id = 'admin_notice_api_' . $admin_notice['notice_id'];
176 162 if ( User::is_user_notice_viewed( $notice_id ) ) {
177 163 return false;
178 164 }
165 + ?>
166 + <div class="notice is-dismissible updated elementor-message-dismissed elementor-message-announcement" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
167 + <p><?php echo $admin_notice['notice_text']; ?></p>
168 + </div>
169 + <?php
179 170
180 - $options = [
181 - 'title' => esc_html__( 'Update Notification', 'elementor' ),
182 - 'description' => $admin_notice['notice_text'],
183 - 'id' => $notice_id,
184 - ];
185 -
186 - $this->print_admin_notice( $options );
187 -
188 171 return true;
189 172 }
190 173
191 174 private function notice_tracker() {
@@ -213,9 +196,9 @@
213 196 // TODO: Skip for development env.
214 197 $optin_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_into' ), 'opt_into' );
215 198 $optout_url = wp_nonce_url( add_query_arg( 'elementor_tracker', 'opt_out' ), 'opt_out' );
216 199
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' );
200 + $tracker_description_text = __( 'Love using Elementor? Become a super contributor by opting in to share non-sensitive plugin data and to receive periodic email updates from us.', 'elementor' );
218 201
219 202 /**
220 203 * Tracker admin description text.
221 204 *
@@ -225,74 +208,29 @@
225 208 *
226 209 * @param string $tracker_description_text Description text displayed in admin notice.
227 210 */
228 211 $tracker_description_text = apply_filters( 'elementor/tracker/admin_description_text', $tracker_description_text );
212 + ?>
213 + <div class="notice updated elementor-message">
214 + <div class="elementor-message-inner">
215 + <div class="elementor-message-icon">
216 + <div class="e-logo-wrapper">
217 + <i class="eicon-elementor" aria-hidden="true"></i>
218 + </div>
219 + </div>
220 + <div class="elementor-message-content">
221 + <p><?php echo esc_html( $tracker_description_text ); ?> <a href="https://go.elementor.com/usage-data-tracking/" target="_blank"><?php echo __( 'Learn more.', 'elementor' ); ?></a></p>
222 + <p class="elementor-message-actions">
223 + <a href="<?php echo $optin_url; ?>" class="button button-primary"><?php echo __( 'Sure! I\'d love to help', 'elementor' ); ?></a>&nbsp;<a href="<?php echo $optout_url; ?>" class="button-secondary"><?php echo __( 'No thanks', 'elementor' ); ?></a>
224 + </p>
225 + </div>
226 + </div>
227 + </div>
228 + <?php
229 229
230 - $message = esc_html( $tracker_description_text ) . ' <a href="https://go.elementor.com/usage-data-tracking/" target="_blank">' . esc_html__( 'Learn more.', 'elementor' ) . '</a>';
231 -
232 - $options = [
233 - 'title' => esc_html__( 'Want to shape the future of web creation?', 'elementor' ),
234 - 'description' => $message,
235 - 'dismissible' => false,
236 - 'button' => [
237 - 'text' => esc_html__( 'Sure! I\'d love to help', 'elementor' ),
238 - 'url' => $optin_url,
239 - 'type' => 'cta',
240 - ],
241 - 'button_secondary' => [
242 - 'text' => esc_html__( 'No thanks', 'elementor' ),
243 - 'url' => $optout_url,
244 - 'variant' => 'outline',
245 - 'type' => 'cta',
246 - ],
247 - ];
248 -
249 - $this->print_admin_notice( $options );
250 -
251 230 return true;
252 231 }
253 232
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 233 private function notice_rate_us_feedback() {
296 234 $notice_id = 'rate_us_feedback';
297 235
298 236 if ( ! current_user_can( 'manage_options' ) ) {
@@ -309,266 +247,212 @@
309 247
310 248 $dismiss_url = add_query_arg( [
311 249 'action' => 'elementor_set_admin_notice_viewed',
312 250 'notice_id' => esc_attr( $notice_id ),
313 - '_wpnonce' => wp_create_nonce( 'elementor_set_admin_notice_viewed' ),
314 251 ], admin_url( 'admin-post.php' ) );
315 252
316 - $options = [
317 - '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' ),
319 - 'id' => $notice_id,
320 - 'button' => [
321 - 'text' => esc_html__( 'Happy To Help', 'elementor' ),
322 - 'url' => 'https://go.elementor.com/admin-review/',
323 - 'new_tab' => true,
324 - 'type' => 'cta',
325 - ],
326 - 'button_secondary' => [
327 - 'text' => esc_html__( 'Hide Notification', 'elementor' ),
328 - 'classes' => [ 'e-notice-dismiss' ],
329 - 'url' => esc_url_raw( $dismiss_url ),
330 - 'new_tab' => true,
331 - 'type' => 'cta',
332 - ],
333 - ];
253 + ?>
254 + <div class="notice updated is-dismissible elementor-message elementor-message-dismissed" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
255 + <div class="elementor-message-inner">
256 + <div class="elementor-message-icon">
257 + <div class="e-logo-wrapper">
258 + <i class="eicon-elementor" aria-hidden="true"></i>
259 + </div>
260 + </div>
261 + <div class="elementor-message-content">
262 + <p><strong><?php echo __( 'Congrats!', 'elementor' ); ?></strong> <?php _e( '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' ); ?></p>
263 + <p class="elementor-message-actions">
264 + <a href="https://go.elementor.com/admin-review/" target="_blank" class="button button-primary"><?php _e( 'Happy To Help', 'elementor' ); ?></a>
265 + <a href="<?php echo esc_url_raw( $dismiss_url ); ?>" class="button elementor-button-notice-dismiss"><?php _e( 'Hide Notification', 'elementor' ); ?></a>
266 + </p>
267 + </div>
268 + </div>
269 + </div>
270 + <?php
334 271
335 - $this->print_admin_notice( $options );
336 -
337 272 return true;
338 273 }
339 274
340 - private function notice_role_manager_promote() {
341 - $notice_id = 'role_manager_promote';
275 + private function notice_woocommerce_promote() {
276 + $notice_id = 'woocommerce_promote';
342 277
343 - if ( Utils::has_pro() ) {
278 + if ( Utils::has_pro() || ! function_exists( 'WC' ) ) {
344 279 return false;
345 280 }
346 281
347 - if ( ! current_user_can( 'manage_options' ) ) {
282 + if ( ! current_user_can( 'install_plugins' ) ) {
348 283 return false;
349 284 }
350 285
351 - if ( 'elementor_page_elementor-role-manager' !== $this->current_screen_id || User::is_user_notice_viewed( $notice_id ) ) {
286 + if ( ! in_array( $this->current_screen_id, [ 'edit-product', 'woocommerce_page_wc-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
352 287 return false;
353 288 }
354 289
355 - $users = new \WP_User_Query( [
356 - 'fields' => 'ID',
357 - 'number' => 10,
358 - ] );
290 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
291 + return false;
292 + }
359 293
360 - if ( 5 > $users->get_total() ) {
294 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
361 295 return false;
362 296 }
363 297
364 - $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' ),
367 - 'id' => $notice_id,
298 + ?>
299 + <div class="notice updated is-dismissible elementor-message elementor-message-dismissed" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
300 + <div class="elementor-message-inner">
301 + <div class="elementor-message-icon">
302 + <div class="e-logo-wrapper">
303 + <i class="eicon-elementor" aria-hidden="true"></i>
304 + </div>
305 + </div>
306 + <div class="elementor-message-content">
307 + <p><?php _e( 'Using WooCommerce? With Elementor Pro’s WooCommerce Builder, you’ll be able to design your store without coding!', 'elementor' ); ?></p>
308 + <p class="elementor-message-actions">
309 + <a href="https://go.elementor.com/plugin-promotion-woocommerce/" target="_blank" class="button button-secondary"><?php _e( 'Learn More', 'elementor' ); ?></a>
310 + </p>
311 + </div>
312 + </div>
313 + </div>
314 + <?php
368 315
369 - 'button' => [
370 - 'text' => esc_html__( 'Learn More', 'elementor' ),
371 - 'url' => 'https://go.elementor.com/plugin-promotion-role-manager/',
372 - 'new_tab' => true,
373 - 'type' => 'cta',
374 - ],
375 - ];
376 -
377 - $options = Filtered_Promotions_Manager::get_filtered_promotion_data( $options, 'core/admin/notice_role_manager_promote', 'button', 'url' );
378 -
379 - $this->print_admin_notice( $options );
380 -
381 316 return true;
382 317 }
383 318
384 - private function get_installed_form_plugin_name() {
385 - static $detected_form_plugin = null;
319 + private function notice_cf7_promote() {
320 + $notice_id = 'cf7_promote';
386 321
387 - if ( null !== $detected_form_plugin ) {
388 - return $detected_form_plugin;
322 + if ( Utils::has_pro() || ! defined( 'WPCF7_VERSION' ) ) {
323 + return false;
389 324 }
390 325
391 - $form_plugins_constants_to_name_mapper = [
392 - 'WPFORMS_VERSION' => 'WPForms',
393 - 'WPCF7_VERSION' => 'Contact Form 7',
394 - ];
326 + if ( ! current_user_can( 'install_plugins' ) ) {
327 + return false;
328 + }
395 329
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 - }
330 + if ( ! in_array( $this->current_screen_id, [ 'toplevel_page_wpcf7', 'contact_page_wpcf7-integration' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
331 + return false;
401 332 }
402 333
403 - $form_plugins_classes_to_name_mapper = [
404 - '\GFCommon' => 'Gravity Forms',
405 - '\Ninja_Forms' => 'Ninja Forms',
406 - ];
334 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
335 + return false;
336 + }
407 337
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 - }
338 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
339 + return false;
413 340 }
414 341
415 - $detected_form_plugin = false;
416 - return $detected_form_plugin;
342 + ?>
343 + <div class="notice updated is-dismissible elementor-message elementor-message-dismissed" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
344 + <div class="elementor-message-inner">
345 + <div class="elementor-message-icon">
346 + <div class="e-logo-wrapper">
347 + <i class="eicon-elementor" aria-hidden="true"></i>
348 + </div>
349 + </div>
350 + <div class="elementor-message-content">
351 + <p><?php _e( 'Using Elementor & Contact Form 7? Try out Elementor Pro and design your forms visually with one powerful tool.', 'elementor' ); ?></p>
352 + <p class="elementor-message-actions">
353 + <a href="https://go.elementor.com/plugin-promotion-contactform7/" target="_blank" class="button button-secondary"><?php _e( 'Learn More', 'elementor' ); ?></a>
354 + </p>
355 + </div>
356 + </div>
357 + </div>
358 + <?php
359 +
360 + return true;
417 361 }
418 362
419 - private function notice_ally_pages_promotion() {
420 - global $pagenow;
421 - $notice_id = 'ally_pages_promotion';
363 + private function notice_mc4wp_promote() {
364 + $notice_id = 'mc4wp_promote';
422 365
423 - if ( 'edit.php' !== $pagenow || empty( $_GET['post_type'] ) || 'page' !== $_GET['post_type'] ) {
366 + if ( Utils::has_pro() || ! defined( 'MC4WP_VERSION' ) ) {
424 367 return false;
425 368 }
426 369
427 - if ( ! current_user_can( 'manage_options' ) ) {
370 + if ( ! current_user_can( 'install_plugins' ) ) {
428 371 return false;
429 372 }
430 373
431 - if ( User::is_user_notice_viewed( $notice_id ) ) {
374 + 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 375 return false;
433 376 }
434 377
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 ) {
378 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
443 379 return false;
444 380 }
445 381
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 - }
382 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
383 + return false;
493 384 }
494 385
495 - $options = [
496 - 'title' => esc_html__( 'Make sure your site has an accessibility statement page', 'elementor' ),
497 - 'description' => $description,
498 - 'id' => $notice_id,
499 - 'type' => 'cta',
500 - '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,
508 - 'new_tab' => true,
509 - 'type' => 'cta',
510 - ],
511 - ];
386 + ?>
387 + <div class="notice updated is-dismissible elementor-message elementor-message-dismissed" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
388 + <div class="elementor-message-inner">
389 + <div class="elementor-message-icon">
390 + <div class="e-logo-wrapper">
391 + <i class="eicon-elementor" aria-hidden="true"></i>
392 + </div>
393 + </div>
394 + <div class="elementor-message-content">
395 + <p><?php _e( 'Want to design better MailChimp forms? Use Elementor Pro and enjoy unlimited integrations, visual design, templates and more.', 'elementor' ); ?></p>
396 + <p class="elementor-message-actions">
397 + <a href="https://go.elementor.com/plugin-promotion-mc4wp/" target="_blank" class="button button-secondary"><?php _e( 'Learn More', 'elementor' ); ?></a>
398 + </p>
399 + </div>
400 + </div>
401 + </div>
402 + <?php
512 403
513 - $this->print_admin_notice( $options );
514 -
515 404 return true;
516 405 }
517 406
518 - private function is_elementor_page(): bool {
519 - return 0 === strpos( $this->current_screen_id, 'elementor_page' );
520 - }
407 + private function notice_popup_maker_promote() {
408 + $notice_id = 'popup_maker_promote';
521 409
522 - private function is_elementor_admin_screen(): bool {
523 - return in_array( $this->current_screen_id, [ 'toplevel_page_elementor', 'edit-elementor_library' ], true );
524 - }
410 + if ( Utils::has_pro() || ! class_exists( 'Popup_Maker' ) ) {
411 + return false;
412 + }
525 413
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 - }
414 + if ( ! current_user_can( 'install_plugins' ) ) {
415 + return false;
416 + }
532 417
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 - }
418 + if ( ! in_array( $this->current_screen_id, [ 'edit-popup', 'popup_page_pum-settings' ], true ) || User::is_user_notice_viewed( $notice_id ) ) {
419 + return false;
420 + }
536 421
537 - private function get_plugin_button_connect_url( $plugin_settings_page ) {
538 - return self_admin_url( $plugin_settings_page );
539 - }
540 -
541 - private function get_plugin_cta_data( $plugin_slug, $plugin_file_path ) {
542 - if ( Hints::is_plugin_active( $plugin_slug ) ) {
422 + if ( strtotime( '2019-08-01' ) > $this->get_install_time() ) {
543 423 return false;
544 424 }
545 425
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' );
426 + if ( strtotime( '+24 hours', $this->get_install_time() ) > time() ) {
427 + return false;
552 428 }
553 429
554 - return [
555 - 'url' => $url,
556 - 'text' => $cta_text,
557 - ];
558 - }
430 + ?>
431 + <div class="notice updated is-dismissible elementor-message elementor-message-dismissed" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
432 + <div class="elementor-message-inner">
433 + <div class="elementor-message-icon">
434 + <div class="e-logo-wrapper">
435 + <i class="eicon-elementor" aria-hidden="true"></i>
436 + </div>
437 + </div>
438 + <div class="elementor-message-content">
439 + <p><?php _e( 'Using popups on your site? Build outstanding popups using Elementor Pro and get more leads, sales and subscribers.', 'elementor' ); ?></p>
440 + <p class="elementor-message-actions">
441 + <a href="https://go.elementor.com/plugin-promotion-popupmaker/" target="_blank" class="button button-secondary"><?php _e( 'Learn More', 'elementor' ); ?></a>
442 + </p>
443 + </div>
444 + </div>
445 + </div>
446 + <?php
559 447
560 - /**
561 - * For testing purposes
562 - */
563 - public function get_elementor_version() {
564 - return ELEMENTOR_VERSION;
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,282 +458,95 @@
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';
475 + ?>
476 + <div class="notice updated is-dismissible elementor-message elementor-message-dismissed" data-notice_id="<?php echo esc_attr( $notice_id ); ?>">
477 + <div class="elementor-message-inner">
478 + <div class="elementor-message-icon">
479 + <div class="e-logo-wrapper">
480 + <i class="eicon-elementor" aria-hidden="true"></i>
481 + </div>
482 + </div>
483 + <div class="elementor-message-content">
484 + <p><?php _e( 'Managing a multi-user site? With Elementor Pro, you can control user access and make sure no one messes up your design.', 'elementor' ); ?></p>
485 + <p class="elementor-message-actions">
486 + <a href="https://go.elementor.com/promotion-role-manager/" target="_blank" class="button button-secondary"><?php _e( 'Learn More', 'elementor' ); ?></a>
487 + </p>
488 + </div>
489 + </div>
490 + </div>
491 + <?php
594 492
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 - $options = [
650 - 'title' => esc_html__( 'Speed up your website with Image Optimization', 'elementor' ),
651 - 'description' => $description,
652 - 'id' => $notice_id,
653 - 'type' => 'cta',
654 - 'button' => [
655 - 'text' => $button_text,
656 - 'url' => self::add_plg_campaign_data( $button_url, $campaign_data ),
657 - 'type' => 'cta',
658 - 'data' => [
659 - 'campaign' => $campaign_data['campaign'],
660 - 'source' => $campaign_data['source'],
661 - 'medium' => $campaign_data['medium'],
662 - ],
663 - ],
664 - ];
665 -
666 - $this->print_admin_notice( $options );
667 -
668 493 return true;
669 494 }
670 495
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 -
496 + /*
497 + * @TODO: Rewrite this method markup and use it for every admin notice
498 + */
499 + public function print_admin_notice( array $options ) {
678 500 $default_options = [
679 - 'id' => null,
680 501 'title' => '',
681 502 'description' => '',
682 - 'classes' => [ 'notice', 'e-notice' ], // We include WP's default notice class so it will be properly handled by WP's js handler
683 - 'type' => '',
684 - 'dismissible' => true,
685 - 'icon' => 'eicon-elementor-circle',
686 - 'button' => [],
687 - 'button_secondary' => [],
503 + 'button' => [
504 + 'text' => '',
505 + 'url' => '',
506 + 'class' => 'elementor-button',
507 + ],
688 508 ];
689 509
690 510 $options = array_replace_recursive( $default_options, $options );
691 -
692 - $notice_classes = $options['classes'];
693 - $dismiss_button = '';
694 - $icon = '';
695 -
696 - if ( $options['type'] ) {
697 - $notice_classes[] = 'e-notice--' . $options['type'];
698 - }
699 -
700 - $wrapper_attributes = [
701 - 'role' => 'region',
702 - 'aria-label' => esc_html__( 'Elementor notice', 'elementor' ),
703 - ];
704 -
705 - if ( $options['dismissible'] ) {
706 - $label = esc_html__( 'Dismiss this notice.', 'elementor' );
707 - $notice_classes[] = 'e-notice--dismissible';
708 - $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 - }
712 -
713 - if ( $options['icon'] ) {
714 - $notice_classes[] = 'e-notice--extended';
715 - $icon = '<div class="e-notice__icon-wrapper"><i class="' . esc_attr( $options['icon'] ) . '" aria-hidden="true"></i></div>';
716 - }
717 -
718 - $wrapper_attributes['class'] = $notice_classes;
719 -
720 - if ( $options['id'] ) {
721 - $wrapper_attributes['data-notice_id'] = $options['id'];
722 - }
723 -
724 - if ( ! empty( $options['source'] ) ) {
725 - $wrapper_attributes['data-source'] = $options['source'];
726 - }
727 511 ?>
728 - <div <?php Utils::print_html_attributes( $wrapper_attributes ); ?>>
729 - <?php echo $dismiss_button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
730 - <div class="e-notice__aside">
731 - <?php echo $icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
732 - </div>
733 - <div class="e-notice__content">
734 - <?php if ( $options['title'] ) { ?>
735 - <h3><?php echo wp_kses_post( $options['title'] ); ?></h3>
736 - <?php } ?>
737 -
738 - <?php if ( $options['description'] ) { ?>
739 - <p><?php echo wp_kses_post( $options['description'] ); ?></p>
740 - <?php } ?>
741 -
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 - }
750 -
751 - if ( empty( $button_settings['text'] ) ) {
752 - continue;
753 - }
754 -
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 - } ?>
512 + <div class="notice elementor-message">
513 + <div class="elementor-message-inner">
514 + <div class="elementor-message-icon">
515 + <div class="e-logo-wrapper">
516 + <i class="eicon-elementor" aria-hidden="true"></i>
770 517 </div>
518 + </div>
519 + <div class="elementor-message-content">
520 + <?php if ( $options['title'] ) { ?>
521 + <strong><?php echo $options['title']; ?></strong>
522 + <?php } ?>
523 + <?php if ( $options['description'] ) { ?>
524 + <p><?php echo $options['description']; ?></p>
525 + <?php } ?>
526 + </div>
527 + <?php if ( $options['button']['text'] ) { ?>
528 + <div class="elementor-message-action">
529 + <a class="<?php echo $options['button']['class']; ?>" href="<?php echo esc_url( $options['button']['url'] ); ?>"><?php echo $options['button']['text']; ?></a>
530 + </div>
771 531 <?php } ?>
772 532 </div>
773 533 </div>
774 - <?php }
534 + <?php
535 + }
775 536
776 537 public function admin_notices() {
777 538 $this->install_time = Plugin::$instance->get_install_time();
778 539 $this->current_screen_id = get_current_screen()->id;
779 540
780 - foreach ( $this->plain_notices as $notice ) {
541 + foreach ( $this->notices as $notice ) {
781 542 $method_callback = "notice_{$notice}";
782 543 if ( $this->$method_callback() ) {
783 544 return;
784 545 }
785 546 }
786 -
787 - /** @var Base_Notice $notice_instance */
788 - foreach ( $this->get_notices() as $notice_instance ) {
789 - if ( ! $notice_instance->should_print() ) {
790 - continue;
791 - }
792 -
793 - $this->print_admin_notice( $notice_instance->get_config() );
794 -
795 - // It exits the method to make sure it prints only one notice.
796 - return;
797 - }
798 547 }
799 548
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 549 /**
853 550 * @since 2.9.0
854 551 * @access public
855 552 */
@@ -854,10 +551,8 @@
854 551 * @access public
855 552 */
856 553 public function __construct() {
857 554 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 555 }
861 556
862 557 /**
863 558 * Get module name.