PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.7.3
Jetpack – WP Security, Backup, Speed, & Growth v12.7.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / masterbar / admin-menu / class-atomic-admin-menu.php
jetpack / modules / masterbar / admin-menu Last commit date
admin-menu-rtl.css 2 years ago admin-menu-rtl.min.css 2 years ago admin-menu.css 2 years ago admin-menu.js 3 years ago admin-menu.min.css 2 years ago class-admin-menu.php 2 years ago class-atomic-admin-menu.php 2 years ago class-base-admin-menu.php 3 years ago class-dashboard-switcher-tracking.php 3 years ago class-domain-only-admin-menu.php 2 years ago class-jetpack-admin-menu.php 2 years ago class-p2-admin-menu.php 4 years ago class-wpcom-admin-menu.php 2 years ago class-wpcom-email-subscription-checker.php 3 years ago dashicon-set.php 4 years ago globe-icon.svg 3 years ago load.php 3 years ago menu-mappings.php 3 years ago
class-atomic-admin-menu.php
448 lines
1 <?php
2 /**
3 * Atomic Admin Menu file.
4 *
5 * @package automattic/jetpack
6 */
7
8 namespace Automattic\Jetpack\Dashboard_Customizations;
9
10 use Automattic\Jetpack\Connection\Client;
11 use Automattic\Jetpack\Current_Plan as Jetpack_Plan;
12 use Automattic\Jetpack\Status;
13
14 require_once __DIR__ . '/class-admin-menu.php';
15
16 /**
17 * Class Atomic_Admin_Menu.
18 */
19 class Atomic_Admin_Menu extends Admin_Menu {
20
21 /**
22 * Atomic_Admin_Menu constructor.
23 */
24 protected function __construct() {
25 parent::__construct();
26
27 add_action( 'wp_enqueue_scripts', array( $this, 'dequeue_scripts' ), 20 );
28 add_action( 'admin_enqueue_scripts', array( $this, 'dequeue_scripts' ), 20 );
29 add_action( 'wp_ajax_sidebar_state', array( $this, 'ajax_sidebar_state' ) );
30 add_action( 'wp_ajax_jitm_dismiss', array( $this, 'wp_ajax_jitm_dismiss' ) );
31 add_action( 'wp_ajax_upsell_nudge_jitm', array( $this, 'wp_ajax_upsell_nudge_jitm' ) );
32
33 if ( ! $this->is_api_request ) {
34 add_filter( 'submenu_file', array( $this, 'override_the_theme_installer' ), 10, 2 );
35 }
36
37 add_action(
38 'admin_menu',
39 function () {
40 remove_action( 'admin_menu', 'gutenberg_menu', 9 );
41 },
42 0
43 );
44 }
45
46 /**
47 * Dequeues unnecessary scripts.
48 */
49 public function dequeue_scripts() {
50 wp_dequeue_script( 'a8c_wpcom_masterbar_overrides' ); // Initially loaded in modules/masterbar/masterbar/class-masterbar.php.
51 }
52
53 /**
54 * Determines whether the current locale is right-to-left (RTL).
55 *
56 * Performs the check against the current locale set on the WordPress.com's account settings.
57 * See `Masterbar::__construct` in `modules/masterbar/masterbar/class-masterbar.php`.
58 */
59 public function is_rtl() {
60 return get_user_option( 'jetpack_wpcom_is_rtl' );
61 }
62
63 /**
64 * Create the desired menu output.
65 */
66 public function reregister_menu_items() {
67 parent::reregister_menu_items();
68
69 $this->add_my_home_menu();
70 $this->remove_gutenberg_menu();
71
72 if ( ! get_option( 'wpcom_is_staging_site' ) ) {
73 $this->add_my_mailboxes_menu();
74 }
75
76 // Not needed outside of wp-admin.
77 if ( ! $this->is_api_request ) {
78 $this->add_browse_sites_link();
79 $this->add_site_card_menu();
80 $this->add_new_site_link();
81 }
82
83 $this->add_woocommerce_installation_menu();
84 ksort( $GLOBALS['menu'] );
85 }
86
87 /**
88 * Get the preferred view for the given screen.
89 *
90 * @param string $screen Screen identifier.
91 * @param bool $fallback_global_preference (Optional) Whether the global preference for all screens should be used
92 * as fallback if there is no specific preference for the given screen.
93 * Default: true.
94 * @return string
95 */
96 public function get_preferred_view( $screen, $fallback_global_preference = true ) {
97 // Export on Atomic sites are always managed on WP Admin.
98 if ( in_array( $screen, array( 'export.php' ), true ) ) {
99 return self::CLASSIC_VIEW;
100 }
101
102 /**
103 * When Jetpack SSO is disabled, we need to force Calypso because it might create confusion to be redirected to WP-Admin.
104 * Furthermore, because we don't display the quick switcher, users having an WP-Admin interface by default won't be able to go back to the Calyso version.
105 */
106 if ( ! \Jetpack::is_module_active( 'sso' ) ) {
107 return self::DEFAULT_VIEW;
108 }
109
110 return parent::get_preferred_view( $screen, $fallback_global_preference );
111 }
112
113 /**
114 * Adds Users menu.
115 */
116 public function add_users_menu() {
117 add_submenu_page( 'users.php', esc_attr__( 'Subscribers', 'jetpack' ), __( 'Subscribers', 'jetpack' ), 'list_users', 'https://wordpress.com/subscribers/' . $this->domain, null, 3 );
118
119 return parent::add_users_menu();
120 }
121
122 /**
123 * Adds Plugins menu.
124 */
125 public function add_plugins_menu() {
126 global $submenu;
127
128 // Calypso plugins screens link.
129 $plugins_slug = 'https://wordpress.com/plugins/' . $this->domain;
130
131 // Link to the Marketplace on sites that can't manage plugins.
132 if (
133 function_exists( 'wpcom_site_has_feature' ) &&
134 ! wpcom_site_has_feature( \WPCOM_Features::MANAGE_PLUGINS )
135 ) {
136 add_menu_page( __( 'Plugins', 'jetpack' ), __( 'Plugins', 'jetpack' ), 'manage_options', $plugins_slug, null, 'dashicons-admin-plugins', '65' );
137 return;
138 }
139
140 if ( ! isset( $submenu['plugins.php'] ) ) {
141 return;
142 }
143
144 $plugins_submenu = $submenu['plugins.php'];
145
146 // Move "Add New" plugin submenu to the top position.
147 foreach ( $plugins_submenu as $submenu_key => $submenu_keys ) {
148 if ( 'plugin-install.php' === $submenu_keys[2] ) {
149 // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
150 $submenu['plugins.php'] = array( $submenu_key => $plugins_submenu[ $submenu_key ] ) + $plugins_submenu;
151 }
152 }
153
154 $submenus_to_update = array( 'plugin-install.php' => $plugins_slug );
155
156 $this->update_submenus( 'plugins.php', $submenus_to_update );
157 }
158
159 /**
160 * Adds the site switcher link if user has more than one site.
161 */
162 public function add_browse_sites_link() {
163 $site_count = get_user_option( 'wpcom_site_count' );
164 if ( ! $site_count || $site_count < 2 ) {
165 return;
166 }
167
168 // Add the menu item.
169 add_menu_page( __( 'site-switcher', 'jetpack' ), __( 'Browse sites', 'jetpack' ), 'read', 'https://wordpress.com/sites', null, 'dashicons-arrow-left-alt2', 0 );
170 add_filter( 'add_menu_classes', array( $this, 'set_browse_sites_link_class' ) );
171 }
172
173 /**
174 * Adds a custom element class for Site Switcher menu item.
175 *
176 * @param array $menu Associative array of administration menu items.
177 *
178 * @return array
179 */
180 public function set_browse_sites_link_class( array $menu ) {
181 foreach ( $menu as $key => $menu_item ) {
182 if ( 'site-switcher' !== $menu_item[3] ) {
183 continue;
184 }
185
186 $menu[ $key ][4] = add_cssclass( 'site-switcher', $menu_item[4] );
187 break;
188 }
189
190 return $menu;
191 }
192
193 /**
194 * Adds a link to the menu to create a new site.
195 */
196 public function add_new_site_link() {
197 $site_count = get_user_option( 'wpcom_site_count' );
198 if ( $site_count && $site_count > 1 ) {
199 return;
200 }
201
202 add_menu_page( __( 'Add New Site', 'jetpack' ), __( 'Add New Site', 'jetpack' ), 'read', 'https://wordpress.com/start?ref=calypso-sidebar', null, 'dashicons-plus-alt' );
203 }
204
205 /**
206 * Adds site card component.
207 */
208 public function add_site_card_menu() {
209 $default = plugins_url( 'globe-icon.svg', __FILE__ );
210 $icon = get_site_icon_url( 32, $default );
211 $blog_name = get_option( 'blogname' ) !== '' ? get_option( 'blogname' ) : $this->domain;
212 $is_coming_soon = ( new Status() )->is_coming_soon();
213
214 $badge = '';
215
216 if ( get_option( 'wpcom_is_staging_site' ) ) {
217 $badge .= '<span class="site__badge site__badge-staging">' . esc_html__( 'Staging', 'jetpack' ) . '</span>';
218 }
219
220 if ( ( function_exists( 'site_is_private' ) && site_is_private() ) || $is_coming_soon ) {
221 $badge .= sprintf(
222 '<span class="site__badge site__badge-private">%s</span>',
223 $is_coming_soon ? esc_html__( 'Coming Soon', 'jetpack' ) : esc_html__( 'Private', 'jetpack' )
224 );
225 }
226
227 $site_card = '
228 <div class="site__info">
229 <div class="site__title">%1$s</div>
230 <div class="site__domain">%2$s</div>
231 %3$s
232 </div>';
233
234 $site_card = sprintf(
235 $site_card,
236 $blog_name,
237 $this->domain,
238 $badge
239 );
240
241 add_menu_page( 'site-card', $site_card, 'read', get_home_url(), null, $icon, 1 );
242 add_filter( 'add_menu_classes', array( $this, 'set_site_card_menu_class' ) );
243 }
244
245 /**
246 * Adds a custom element class and id for Site Card's menu item.
247 *
248 * @param array $menu Associative array of administration menu items.
249 *
250 * @return array
251 */
252 public function set_site_card_menu_class( array $menu ) {
253 foreach ( $menu as $key => $menu_item ) {
254 if ( 'site-card' !== $menu_item[3] ) {
255 continue;
256 }
257
258 $classes = ' toplevel_page_site-card';
259
260 // webclip.png is the default on WoA sites. Anything other than that means we have a custom site icon.
261 if ( has_site_icon() && 'https://s0.wp.com/i/webclip.png' !== get_site_icon_url( 512 ) ) {
262 $classes .= ' has-site-icon';
263 }
264
265 $menu[ $key ][4] = $menu_item[4] . $classes;
266 $menu[ $key ][5] = 'toplevel_page_site_card';
267 break;
268 }
269
270 return $menu;
271 }
272
273 /**
274 * Returns the first available upsell nudge.
275 *
276 * @return array
277 */
278 public function get_upsell_nudge() {
279 $jitm = \Automattic\Jetpack\JITMS\JITM::get_instance();
280 $message_path = 'calypso:sites:sidebar_notice';
281 $message = $jitm->get_messages( $message_path, wp_json_encode( array( 'message_path' => $message_path ) ), false );
282
283 if ( isset( $message[0] ) ) {
284 $message = $message[0];
285 return array(
286 'content' => $message->content->message,
287 'cta' => $message->CTA->message, // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
288 'link' => $message->CTA->link, // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
289 'tracks_impression_event_name' => $message->tracks->display->name,
290 'tracks_impression_cta_name' => $message->tracks->display->props->cta_name,
291 'tracks_click_event_name' => $message->tracks->click->name,
292 'tracks_click_cta_name' => $message->tracks->click->props->cta_name,
293 'dismissible' => $message->is_dismissible,
294 'feature_class' => $message->feature_class,
295 'id' => $message->id,
296 );
297 }
298 }
299
300 /**
301 * Adds Stats menu.
302 */
303 public function add_stats_menu() {
304 $menu_title = __( 'Stats', 'jetpack' );
305
306 if (
307 ! $this->is_api_request &&
308 \Jetpack::is_module_active( 'stats' ) &&
309 function_exists( 'stats_get_image_chart_src' )
310 ) {
311 $img_src = esc_attr(
312 stats_get_image_chart_src( 'admin-bar-hours-scale-2x', array( 'masterbar' => '' ) )
313 );
314 $alt = esc_attr__( 'Hourly views', 'jetpack' );
315
316 $menu_title .= "<img class='sidebar-unified__sparkline' src='$img_src' width='80' height='20' alt='$alt'>";
317 }
318
319 add_menu_page( __( 'Stats', 'jetpack' ), $menu_title, 'view_stats', 'https://wordpress.com/stats/day/' . $this->domain, null, 'dashicons-chart-bar', 3 );
320 }
321
322 /**
323 * Adds Upgrades menu.
324 *
325 * @param string $plan The current WPCOM plan of the blog.
326 */
327 public function add_upgrades_menu( $plan = null ) {
328
329 if ( get_option( 'wpcom_is_staging_site' ) ) {
330 return;
331 }
332 $products = Jetpack_Plan::get();
333 if ( array_key_exists( 'product_name_short', $products ) ) {
334 $plan = $products['product_name_short'];
335 }
336 parent::add_upgrades_menu( $plan );
337
338 $last_upgrade_submenu_position = $this->get_submenu_item_count( 'paid-upgrades.php' );
339
340 add_submenu_page( 'paid-upgrades.php', __( 'Domains', 'jetpack' ), __( 'Domains', 'jetpack' ), 'manage_options', 'https://wordpress.com/domains/manage/' . $this->domain, null, $last_upgrade_submenu_position - 1 );
341
342 /**
343 * Whether to show the WordPress.com Emails submenu under the main Upgrades menu.
344 *
345 * @use add_filter( 'jetpack_show_wpcom_upgrades_email_menu', '__return_true' );
346 * @module masterbar
347 *
348 * @since 9.7.0
349 *
350 * @param bool $show_wpcom_upgrades_email_menu Load the WordPress.com Emails submenu item. Default to false.
351 */
352 if ( apply_filters( 'jetpack_show_wpcom_upgrades_email_menu', false ) ) {
353 add_submenu_page( 'paid-upgrades.php', __( 'Emails', 'jetpack' ), __( 'Emails', 'jetpack' ), 'manage_options', 'https://wordpress.com/email/' . $this->domain, null, $last_upgrade_submenu_position );
354 }
355 }
356
357 /**
358 * Adds Settings menu.
359 */
360 public function add_options_menu() {
361 parent::add_options_menu();
362
363 if ( Jetpack_Plan::supports( 'security-settings' ) ) {
364 add_submenu_page(
365 'options-general.php',
366 esc_attr__( 'Security', 'jetpack' ),
367 __( 'Security', 'jetpack' ),
368 'manage_options',
369 'https://wordpress.com/settings/security/' . $this->domain,
370 null,
371 2
372 );
373 }
374
375 add_submenu_page( 'options-general.php', esc_attr__( 'Hosting Configuration', 'jetpack' ), __( 'Hosting Configuration', 'jetpack' ), 'manage_options', 'https://wordpress.com/hosting-config/' . $this->domain, null, 11 );
376
377 // Page Optimize is active by default on all Atomic sites and registers a Settings > Performance submenu which
378 // would conflict with our own Settings > Performance that links to Calypso, so we hide it it since the Calypso
379 // performance settings already have a link to Page Optimize settings page.
380 $this->hide_submenu_page( 'options-general.php', 'page-optimize' );
381 }
382
383 /**
384 * Adds Tools menu entries.
385 */
386 public function add_tools_menu() {
387 parent::add_tools_menu();
388
389 /**
390 * Adds the WordPress.com Site Monitoring submenu under the main Tools menu.
391 */
392 add_submenu_page( 'tools.php', esc_attr__( 'Site Monitoring', 'jetpack' ), __( 'Site Monitoring', 'jetpack' ), 'manage_options', 'https://wordpress.com/site-monitoring/' . $this->domain, null, 7 );
393 }
394
395 /**
396 * Override the global submenu_file for theme-install.php page so the WP Admin menu item gets highlighted correctly.
397 *
398 * @param string $submenu_file The current pages $submenu_file global variable value.
399 * @return string | null
400 */
401 public function override_the_theme_installer( $submenu_file ) {
402 global $pagenow;
403
404 if ( 'themes.php' === $submenu_file && 'theme-install.php' === $pagenow ) {
405 return null;
406 }
407 return $submenu_file;
408 }
409
410 /**
411 * Also remove the Gutenberg plugin menu.
412 */
413 public function remove_gutenberg_menu() {
414 // Always remove the Gutenberg menu.
415 remove_menu_page( 'gutenberg' );
416 }
417
418 /**
419 * Saves the sidebar state ( expanded / collapsed ) via an ajax request.
420 */
421 public function ajax_sidebar_state() {
422 $expanded = isset( $_REQUEST['expanded'] ) ? filter_var( wp_unslash( $_REQUEST['expanded'] ), FILTER_VALIDATE_BOOLEAN ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
423 Client::wpcom_json_api_request_as_user(
424 '/me/preferences',
425 '2',
426 array(
427 'method' => 'POST',
428 ),
429 (object) array( 'calypso_preferences' => (object) array( 'sidebarCollapsed' => ! $expanded ) ),
430 'wpcom'
431 );
432
433 wp_die();
434 }
435
436 /**
437 * Handle ajax requests to dismiss a just-in-time-message
438 */
439 public function wp_ajax_jitm_dismiss() {
440 check_ajax_referer( 'jitm_dismiss' );
441 $jitm = \Automattic\Jetpack\JITMS\JITM::get_instance();
442 if ( isset( $_REQUEST['id'] ) && isset( $_REQUEST['feature_class'] ) ) {
443 $jitm->dismiss( sanitize_text_field( wp_unslash( $_REQUEST['id'] ) ), sanitize_text_field( wp_unslash( $_REQUEST['feature_class'] ) ) );
444 }
445 wp_die();
446 }
447 }
448