PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.0.2
Jetpack – WP Security, Backup, Speed, & Growth v13.0.2
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-nav-unification-rtl.css 2 years ago admin-menu-nav-unification-rtl.min.css 2 years ago admin-menu-nav-unification.css 2 years ago admin-menu-nav-unification.min.css 2 years ago admin-menu-rtl.css 2 years ago admin-menu-rtl.min.css 2 years ago admin-menu.css 2 years ago admin-menu.js 2 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 2 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 2 years ago menu-mappings.php 3 years ago
class-atomic-admin-menu.php
527 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 // Add notices to the settings pages when there is a Calypso page available.
46 if ( get_option( 'wpcom_admin_interface' ) === 'wp-admin' ) {
47 add_action( 'current_screen', array( $this, 'add_settings_page_notice' ) );
48 }
49 }
50
51 /**
52 * Dequeues unnecessary scripts.
53 */
54 public function dequeue_scripts() {
55 wp_dequeue_script( 'a8c_wpcom_masterbar_overrides' ); // Initially loaded in modules/masterbar/masterbar/class-masterbar.php.
56 }
57
58 /**
59 * Determines whether the current locale is right-to-left (RTL).
60 *
61 * Performs the check against the current locale set on the WordPress.com's account settings.
62 * See `Masterbar::__construct` in `modules/masterbar/masterbar/class-masterbar.php`.
63 */
64 public function is_rtl() {
65 return get_user_option( 'jetpack_wpcom_is_rtl' );
66 }
67
68 /**
69 * Create the desired menu output.
70 */
71 public function reregister_menu_items() {
72 parent::reregister_menu_items();
73
74 $this->add_my_home_menu();
75 $this->remove_gutenberg_menu();
76
77 if ( ! get_option( 'wpcom_is_staging_site' ) ) {
78 $this->add_my_mailboxes_menu();
79 }
80
81 // Not needed outside of wp-admin.
82 if ( ! $this->is_api_request ) {
83 $this->add_browse_sites_link();
84 $this->add_site_card_menu();
85 $this->add_new_site_link();
86 }
87
88 $this->add_woocommerce_installation_menu();
89 ksort( $GLOBALS['menu'] );
90 }
91
92 /**
93 * Get the preferred view for the given screen.
94 *
95 * @param string $screen Screen identifier.
96 * @param bool $fallback_global_preference (Optional) Whether the global preference for all screens should be used
97 * as fallback if there is no specific preference for the given screen.
98 * Default: true.
99 * @return string
100 */
101 public function get_preferred_view( $screen, $fallback_global_preference = true ) {
102
103 // Export on Atomic sites are always managed on WP Admin.
104 if ( in_array( $screen, array( 'export.php' ), true ) ) {
105 return self::CLASSIC_VIEW;
106 }
107
108 /**
109 * When Jetpack SSO is disabled, we need to force Calypso because it might create confusion to be redirected to WP-Admin.
110 * 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.
111 */
112 if ( ! \Jetpack::is_module_active( 'sso' ) ) {
113 return self::DEFAULT_VIEW;
114 }
115
116 return parent::get_preferred_view( $screen, $fallback_global_preference );
117 }
118
119 /**
120 * Adds Users menu.
121 */
122 public function add_users_menu() {
123 $slug = current_user_can( 'list_users' ) ? 'users.php' : 'profile.php';
124 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'users.php' ) ) {
125 $submenus_to_update = array(
126 'users.php' => 'https://wordpress.com/people/team/' . $this->domain,
127 );
128 $this->update_submenus( $slug, $submenus_to_update );
129 }
130
131 add_submenu_page( 'users.php', esc_attr__( 'Subscribers', 'jetpack' ), __( 'Subscribers', 'jetpack' ), 'list_users', 'https://wordpress.com/subscribers/' . $this->domain, null );
132
133 remove_submenu_page( 'users.php', 'profile.php' );
134 add_submenu_page( 'users.php', esc_attr__( 'My Profile', 'jetpack' ), __( 'My Profile', 'jetpack' ), 'read', 'https://wordpress.com/me/', null );
135
136 // Users who can't 'list_users' will see "Profile" menu & "Profile > Account Settings" as submenu.
137 add_submenu_page( $slug, esc_attr__( 'Account Settings', 'jetpack' ), __( 'Account Settings', 'jetpack' ), 'read', 'https://wordpress.com/me/account' );
138 }
139
140 /**
141 * Adds Plugins menu.
142 */
143 public function add_plugins_menu() {
144
145 global $submenu;
146
147 // Calypso plugins screens link.
148 $plugins_slug = 'https://wordpress.com/plugins/' . $this->domain;
149
150 // Link to the Marketplace from Plugins > Add New on Atomic sites where the wpcom_admin_interface option is set to wp-admin.
151 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'plugins.php' ) ) {
152 $submenus_to_update = array( 'plugin-install.php' => $plugins_slug );
153 $this->update_submenus( 'plugins.php', $submenus_to_update );
154 return;
155 }
156
157 // Link to the Marketplace on sites that can't manage plugins.
158 if (
159 function_exists( 'wpcom_site_has_feature' ) &&
160 ! wpcom_site_has_feature( \WPCOM_Features::MANAGE_PLUGINS )
161 ) {
162 add_menu_page( __( 'Plugins', 'jetpack' ), __( 'Plugins', 'jetpack' ), 'manage_options', $plugins_slug, null, 'dashicons-admin-plugins', '65' );
163 return;
164 }
165
166 if ( ! isset( $submenu['plugins.php'] ) ) {
167 return;
168 }
169
170 $plugins_submenu = $submenu['plugins.php'];
171
172 // Move "Add New" plugin submenu to the top position.
173 foreach ( $plugins_submenu as $submenu_key => $submenu_keys ) {
174 if ( 'plugin-install.php' === $submenu_keys[2] ) {
175 // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
176 $submenu['plugins.php'] = array( $submenu_key => $plugins_submenu[ $submenu_key ] ) + $plugins_submenu;
177 }
178 }
179
180 $submenus_to_update = array( 'plugin-install.php' => $plugins_slug );
181
182 $this->update_submenus( 'plugins.php', $submenus_to_update );
183 }
184
185 /**
186 * Adds the site switcher link if user has more than one site.
187 */
188 public function add_browse_sites_link() {
189 $site_count = get_user_option( 'wpcom_site_count' );
190 if ( ! $site_count || $site_count < 2 ) {
191 return;
192 }
193
194 // Unnecessary because "My Sites" always links to the Sites page.
195 if ( 'wp-admin' === get_option( 'wpcom_admin_interface' ) ) {
196 return;
197 }
198
199 // Add the menu item.
200 add_menu_page( __( 'site-switcher', 'jetpack' ), __( 'Browse sites', 'jetpack' ), 'read', 'https://wordpress.com/sites', null, 'dashicons-arrow-left-alt2', 0 );
201 add_filter( 'add_menu_classes', array( $this, 'set_browse_sites_link_class' ) );
202 }
203
204 /**
205 * Adds a custom element class for Site Switcher menu item.
206 *
207 * @param array $menu Associative array of administration menu items.
208 *
209 * @return array
210 */
211 public function set_browse_sites_link_class( array $menu ) {
212 foreach ( $menu as $key => $menu_item ) {
213 if ( 'site-switcher' !== $menu_item[3] ) {
214 continue;
215 }
216
217 $menu[ $key ][4] = add_cssclass( 'site-switcher', $menu_item[4] );
218 break;
219 }
220
221 return $menu;
222 }
223
224 /**
225 * Adds a link to the menu to create a new site.
226 */
227 public function add_new_site_link() {
228 $site_count = get_user_option( 'wpcom_site_count' );
229 if ( $site_count && $site_count > 1 ) {
230 return;
231 }
232
233 add_menu_page( __( 'Add New Site', 'jetpack' ), __( 'Add New Site', 'jetpack' ), 'read', 'https://wordpress.com/start?ref=calypso-sidebar', null, 'dashicons-plus-alt' );
234 }
235
236 /**
237 * Adds site card component.
238 */
239 public function add_site_card_menu() {
240 $default = plugins_url( 'globe-icon.svg', __FILE__ );
241 $icon = get_site_icon_url( 32, $default );
242 $blog_name = get_option( 'blogname' ) !== '' ? get_option( 'blogname' ) : $this->domain;
243 $is_coming_soon = ( new Status() )->is_coming_soon();
244
245 $badge = '';
246
247 if ( get_option( 'wpcom_is_staging_site' ) ) {
248 $badge .= '<span class="site__badge site__badge-staging">' . esc_html__( 'Staging', 'jetpack' ) . '</span>';
249 }
250
251 if ( ( function_exists( 'site_is_private' ) && site_is_private() ) || $is_coming_soon ) {
252 $badge .= sprintf(
253 '<span class="site__badge site__badge-private">%s</span>',
254 $is_coming_soon ? esc_html__( 'Coming Soon', 'jetpack' ) : esc_html__( 'Private', 'jetpack' )
255 );
256 }
257
258 $site_card = '
259 <div class="site__info">
260 <div class="site__title">%1$s</div>
261 <div class="site__domain">%2$s</div>
262 %3$s
263 </div>';
264
265 $site_card = sprintf(
266 $site_card,
267 $blog_name,
268 $this->domain,
269 $badge
270 );
271
272 add_menu_page( 'site-card', $site_card, 'read', get_home_url(), null, $icon, 1 );
273 add_filter( 'add_menu_classes', array( $this, 'set_site_card_menu_class' ) );
274 }
275
276 /**
277 * Adds a custom element class and id for Site Card's menu item.
278 *
279 * @param array $menu Associative array of administration menu items.
280 *
281 * @return array
282 */
283 public function set_site_card_menu_class( array $menu ) {
284 foreach ( $menu as $key => $menu_item ) {
285 if ( 'site-card' !== $menu_item[3] ) {
286 continue;
287 }
288
289 $classes = ' toplevel_page_site-card';
290
291 // webclip.png is the default on WoA sites. Anything other than that means we have a custom site icon.
292 if ( has_site_icon() && 'https://s0.wp.com/i/webclip.png' !== get_site_icon_url( 512 ) ) {
293 $classes .= ' has-site-icon';
294 }
295
296 $menu[ $key ][4] = $menu_item[4] . $classes;
297 $menu[ $key ][5] = 'toplevel_page_site_card';
298 break;
299 }
300
301 return $menu;
302 }
303
304 /**
305 * Returns the first available upsell nudge.
306 *
307 * @return array
308 */
309 public function get_upsell_nudge() {
310 $jitm = \Automattic\Jetpack\JITMS\JITM::get_instance();
311 $message_path = 'calypso:sites:sidebar_notice';
312 $message = $jitm->get_messages( $message_path, wp_json_encode( array( 'message_path' => $message_path ) ), false );
313
314 if ( isset( $message[0] ) ) {
315 $message = $message[0];
316 return array(
317 'content' => $message->content->message,
318 'cta' => $message->CTA->message, // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
319 'link' => $message->CTA->link, // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
320 'tracks_impression_event_name' => $message->tracks->display->name,
321 'tracks_impression_cta_name' => $message->tracks->display->props->cta_name,
322 'tracks_click_event_name' => $message->tracks->click->name,
323 'tracks_click_cta_name' => $message->tracks->click->props->cta_name,
324 'dismissible' => $message->is_dismissible,
325 'feature_class' => $message->feature_class,
326 'id' => $message->id,
327 );
328 }
329 }
330
331 /**
332 * Adds Stats menu.
333 */
334 public function add_stats_menu() {
335 $menu_title = __( 'Stats', 'jetpack' );
336 if (
337 ! $this->is_api_request &&
338 \Jetpack::is_module_active( 'stats' ) &&
339 function_exists( 'stats_get_image_chart_src' )
340 ) {
341 $img_src = esc_attr(
342 stats_get_image_chart_src( 'admin-bar-hours-scale-2x', array( 'masterbar' => '' ) )
343 );
344 $alt = esc_attr__( 'Hourly views', 'jetpack' );
345
346 $menu_title .= "<img class='sidebar-unified__sparkline' src='$img_src' width='80' height='20' alt='$alt'>";
347 }
348
349 add_menu_page( __( 'Stats', 'jetpack' ), $menu_title, 'view_stats', 'https://wordpress.com/stats/day/' . $this->domain, null, 'dashicons-chart-bar', 3 );
350 }
351
352 /**
353 * Adds Upgrades menu.
354 *
355 * @param string $plan The current WPCOM plan of the blog.
356 */
357 public function add_upgrades_menu( $plan = null ) {
358
359 if ( get_option( 'wpcom_is_staging_site' ) ) {
360 return;
361 }
362 $products = Jetpack_Plan::get();
363 if ( array_key_exists( 'product_name_short', $products ) ) {
364 $plan = $products['product_name_short'];
365 }
366 parent::add_upgrades_menu( $plan );
367
368 $last_upgrade_submenu_position = $this->get_submenu_item_count( 'paid-upgrades.php' );
369
370 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 );
371
372 /**
373 * Whether to show the WordPress.com Emails submenu under the main Upgrades menu.
374 *
375 * @use add_filter( 'jetpack_show_wpcom_upgrades_email_menu', '__return_true' );
376 * @module masterbar
377 *
378 * @since 9.7.0
379 *
380 * @param bool $show_wpcom_upgrades_email_menu Load the WordPress.com Emails submenu item. Default to false.
381 */
382 if ( apply_filters( 'jetpack_show_wpcom_upgrades_email_menu', false ) ) {
383 add_submenu_page( 'paid-upgrades.php', __( 'Emails', 'jetpack' ), __( 'Emails', 'jetpack' ), 'manage_options', 'https://wordpress.com/email/' . $this->domain, null, $last_upgrade_submenu_position );
384 }
385 }
386
387 /**
388 * Adds Settings menu.
389 */
390 public function add_options_menu() {
391 parent::add_options_menu();
392
393 if ( Jetpack_Plan::supports( 'security-settings' ) ) {
394 add_submenu_page(
395 'options-general.php',
396 esc_attr__( 'Security', 'jetpack' ),
397 __( 'Security', 'jetpack' ),
398 'manage_options',
399 'https://wordpress.com/settings/security/' . $this->domain,
400 null,
401 2
402 );
403 }
404
405 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 );
406
407 // Page Optimize is active by default on all Atomic sites and registers a Settings > Performance submenu which
408 // would conflict with our own Settings > Performance that links to Calypso, so we hide it it since the Calypso
409 // performance settings already have a link to Page Optimize settings page.
410 $this->hide_submenu_page( 'options-general.php', 'page-optimize' );
411 }
412
413 /**
414 * Adds Tools menu entries.
415 */
416 public function add_tools_menu() {
417 parent::add_tools_menu();
418
419 /**
420 * Adds the WordPress.com Site Monitoring submenu under the main Tools menu.
421 */
422 add_submenu_page( 'tools.php', esc_attr__( 'Site Monitoring', 'jetpack' ), __( 'Site Monitoring', 'jetpack' ), 'manage_options', 'https://wordpress.com/site-monitoring/' . $this->domain, null, 7 );
423 }
424
425 /**
426 * Override the global submenu_file for theme-install.php page so the WP Admin menu item gets highlighted correctly.
427 *
428 * @param string $submenu_file The current pages $submenu_file global variable value.
429 * @return string | null
430 */
431 public function override_the_theme_installer( $submenu_file ) {
432 global $pagenow;
433
434 if ( 'themes.php' === $submenu_file && 'theme-install.php' === $pagenow ) {
435 return null;
436 }
437 return $submenu_file;
438 }
439
440 /**
441 * Also remove the Gutenberg plugin menu.
442 */
443 public function remove_gutenberg_menu() {
444 // Always remove the Gutenberg menu.
445 remove_menu_page( 'gutenberg' );
446 }
447
448 /**
449 * Saves the sidebar state ( expanded / collapsed ) via an ajax request.
450 */
451 public function ajax_sidebar_state() {
452 $expanded = isset( $_REQUEST['expanded'] ) ? filter_var( wp_unslash( $_REQUEST['expanded'] ), FILTER_VALIDATE_BOOLEAN ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
453 Client::wpcom_json_api_request_as_user(
454 '/me/preferences',
455 '2',
456 array(
457 'method' => 'POST',
458 ),
459 (object) array( 'calypso_preferences' => (object) array( 'sidebarCollapsed' => ! $expanded ) ),
460 'wpcom'
461 );
462
463 wp_die();
464 }
465
466 /**
467 * Handle ajax requests to dismiss a just-in-time-message
468 */
469 public function wp_ajax_jitm_dismiss() {
470 check_ajax_referer( 'jitm_dismiss' );
471 $jitm = \Automattic\Jetpack\JITMS\JITM::get_instance();
472 if ( isset( $_REQUEST['id'] ) && isset( $_REQUEST['feature_class'] ) ) {
473 $jitm->dismiss( sanitize_text_field( wp_unslash( $_REQUEST['id'] ) ), sanitize_text_field( wp_unslash( $_REQUEST['feature_class'] ) ) );
474 }
475 wp_die();
476 }
477
478 /**
479 * Adds a notice above each settings page while using the Classic view to indicate
480 * that the Default view offers more features. Links to the default view.
481 *
482 * @return void
483 */
484 public function add_settings_page_notice() {
485 if ( ! is_admin() ) {
486 return;
487 }
488
489 $current_screen = get_current_screen();
490
491 if ( ! $current_screen instanceof \WP_Screen ) {
492 return;
493 }
494
495 // Show the notice for the following screens and map them to the Calypso page.
496 $screen_map = array(
497 'options-general' => 'general',
498 'options-writing' => 'writing',
499 'options-reading' => 'reading',
500 'options-discussion' => 'discussion',
501 );
502
503 $mapped_screen = isset( $screen_map[ $current_screen->id ] )
504 ? $screen_map[ $current_screen->id ]
505 : false;
506
507 if ( ! $mapped_screen ) {
508 return;
509 }
510
511 $switch_url = sprintf( 'https://wordpress.com/settings/%s/%s', $mapped_screen, $this->domain );
512
513 // Close over the $switch_url variable.
514 $admin_notices = function () use ( $switch_url ) {
515 // translators: %s is a link to the Calypso settings page.
516 $notice = __( 'You are currently using the Classic view, which doesn\'t offer the same set of features as the Default view. To access additional settings and features, <a href="%s">switch to the Default view</a>. ', 'jetpack' );
517 ?>
518 <div class="notice notice-warning">
519 <p><?php echo wp_kses( sprintf( $notice, esc_url( $switch_url ) ), array( 'a' => array( 'href' => array() ) ) ); ?></p>
520 </div>
521 <?php
522 };
523
524 add_action( 'admin_notices', $admin_notices );
525 }
526 }
527