PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.2.3
Jetpack – WP Security, Backup, Speed, & Growth v12.2.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-wpcom-admin-menu.php
jetpack / modules / masterbar / admin-menu Last commit date
admin-menu-rtl.css 3 years ago admin-menu-rtl.min.css 3 years ago admin-menu.css 3 years ago admin-menu.js 3 years ago admin-menu.min.css 3 years ago class-admin-menu.php 3 years ago class-atomic-admin-menu.php 3 years ago class-base-admin-menu.php 3 years ago class-dashboard-switcher-tracking.php 3 years ago class-domain-only-admin-menu.php 3 years ago class-jetpack-admin-menu.php 3 years ago class-p2-admin-menu.php 4 years ago class-wpcom-admin-menu.php 3 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-wpcom-admin-menu.php
495 lines
1 <?php
2 /**
3 * WP.com Admin Menu file.
4 *
5 * @package automattic/jetpack
6 */
7
8 namespace Automattic\Jetpack\Dashboard_Customizations;
9
10 use Automattic\Jetpack\Blaze;
11 use Automattic\Jetpack\Status;
12 use JITM;
13
14 require_once __DIR__ . '/class-admin-menu.php';
15
16 /**
17 * Class WPcom_Admin_Menu.
18 */
19 class WPcom_Admin_Menu extends Admin_Menu {
20 /**
21 * Holds the current plan, set by get_current_plan().
22 *
23 * @var array
24 */
25 private $current_plan = array();
26
27 /**
28 * WPcom_Admin_Menu constructor.
29 */
30 protected function __construct() {
31 parent::__construct();
32
33 add_action( 'wp_ajax_sidebar_state', array( $this, 'ajax_sidebar_state' ) );
34 add_action( 'wp_ajax_jitm_dismiss', array( $this, 'wp_ajax_jitm_dismiss' ) );
35 add_action( 'wp_ajax_upsell_nudge_jitm', array( $this, 'wp_ajax_upsell_nudge_jitm' ) );
36 add_action( 'admin_init', array( $this, 'sync_sidebar_collapsed_state' ) );
37 add_action( 'admin_menu', array( $this, 'remove_submenus' ), 140 ); // After hookpress hook at 130.
38 add_filter( 'block_editor_settings_all', array( $this, 'site_editor_dashboard_link' ) );
39 }
40
41 /**
42 * Create the desired menu output.
43 */
44 public function reregister_menu_items() {
45 parent::reregister_menu_items();
46
47 $this->add_my_home_menu();
48 $this->add_inbox_menu();
49 $this->remove_gutenberg_menu();
50
51 // Not needed outside of wp-admin.
52 if ( ! $this->is_api_request ) {
53 $this->add_browse_sites_link();
54 $this->add_site_card_menu();
55 $this->add_new_site_link();
56 }
57
58 $this->add_woocommerce_installation_menu( $this->get_current_plan() );
59
60 ksort( $GLOBALS['menu'] );
61 }
62
63 /**
64 * Get the preferred view for the given screen.
65 *
66 * @param string $screen Screen identifier.
67 * @param bool $fallback_global_preference (Optional) Whether the global preference for all screens should be used
68 * as fallback if there is no specific preference for the given screen.
69 * Default: true.
70 * @return string
71 */
72 public function get_preferred_view( $screen, $fallback_global_preference = true ) {
73 // When no preferred view has been set for Themes, keep the previous behavior that forced the default view
74 // regardless of the global preference.
75 if ( $fallback_global_preference && 'themes.php' === $screen ) {
76 $preferred_view = parent::get_preferred_view( $screen, false );
77 if ( self::UNKNOWN_VIEW === $preferred_view ) {
78 return self::DEFAULT_VIEW;
79 }
80 return $preferred_view;
81 }
82
83 // Plugins on Simple sites are always managed on Calypso.
84 if ( 'plugins.php' === $screen ) {
85 return self::DEFAULT_VIEW;
86 }
87
88 return parent::get_preferred_view( $screen, $fallback_global_preference );
89 }
90
91 /**
92 * Retrieve the number of blogs that the current user has.
93 *
94 * @return int
95 */
96 public function get_current_user_blog_count() {
97 if ( function_exists( '\get_blog_count_for_user' ) ) {
98 return \get_blog_count_for_user( get_current_user_id() );
99 }
100
101 $blogs = get_blogs_of_user( get_current_user_id() );
102 return is_countable( $blogs ) ? count( $blogs ) : 0;
103 }
104
105 /**
106 * Adds the site switcher link if user has more than one site.
107 */
108 public function add_browse_sites_link() {
109 if ( $this->get_current_user_blog_count() < 2 ) {
110 return;
111 }
112
113 // Add the menu item.
114 add_menu_page( __( 'site-switcher', 'jetpack' ), __( 'Browse sites', 'jetpack' ), 'read', 'https://wordpress.com/sites', null, 'dashicons-arrow-left-alt2', 0 );
115 add_filter( 'add_menu_classes', array( $this, 'set_browse_sites_link_class' ) );
116 }
117
118 /**
119 * Adds a custom element class for Site Switcher menu item.
120 *
121 * @param array $menu Associative array of administration menu items.
122 * @return array
123 */
124 public function set_browse_sites_link_class( array $menu ) {
125 foreach ( $menu as $key => $menu_item ) {
126 if ( 'site-switcher' !== $menu_item[3] ) {
127 continue;
128 }
129
130 $menu[ $key ][4] = add_cssclass( 'site-switcher', $menu_item[4] );
131 break;
132 }
133
134 return $menu;
135 }
136
137 /**
138 * Adds a link to the menu to create a new site.
139 */
140 public function add_new_site_link() {
141 if ( $this->get_current_user_blog_count() > 1 ) {
142 return;
143 }
144
145 $this->add_admin_menu_separator();
146 add_menu_page( __( 'Add New Site', 'jetpack' ), __( 'Add New Site', 'jetpack' ), 'read', 'https://wordpress.com/start?ref=calypso-sidebar', null, 'dashicons-plus-alt' );
147 }
148
149 /**
150 * Adds site card component.
151 */
152 public function add_site_card_menu() {
153 $default = plugins_url( 'globe-icon.svg', __FILE__ );
154 $icon = get_site_icon_url( 32, $default );
155 $blog_name = get_option( 'blogname' ) !== '' ? get_option( 'blogname' ) : $this->domain;
156 $status = new Status();
157 $is_private_site = $status->is_private_site();
158 $is_coming_soon = $status->is_coming_soon();
159
160 if ( $default === $icon && blavatar_exists( $this->domain ) ) {
161 $icon = blavatar_url( $this->domain, 'img', 32 );
162 }
163
164 $badge = '';
165 if ( $is_private_site || $is_coming_soon ) {
166 $badge .= sprintf(
167 '<span class="site__badge site__badge-private">%s</span>',
168 $is_coming_soon ? esc_html__( 'Coming Soon', 'jetpack' ) : esc_html__( 'Private', 'jetpack' )
169 );
170 }
171
172 if ( function_exists( 'is_simple_site_redirect' ) && is_simple_site_redirect( $this->domain ) ) {
173 $badge .= '<span class="site__badge site__badge-redirect">' . esc_html__( 'Redirect', 'jetpack' ) . '</span>';
174 }
175
176 if ( ! empty( get_option( 'options' )['is_domain_only'] ) ) {
177 $badge .= '<span class="site__badge site__badge-domain-only">' . esc_html__( 'Domain', 'jetpack' ) . '</span>';
178 }
179
180 $site_card = '
181 <div class="site__info">
182 <div class="site__title">%1$s</div>
183 <div class="site__domain">%2$s</div>
184 %3$s
185 </div>';
186
187 $site_card = sprintf(
188 $site_card,
189 $blog_name,
190 $this->domain,
191 $badge
192 );
193
194 add_menu_page( 'site-card', $site_card, 'read', get_home_url(), null, $icon, 1 );
195 add_filter( 'add_menu_classes', array( $this, 'set_site_card_menu_class' ) );
196 }
197
198 /**
199 * Adds a custom element class and id for Site Card's menu item.
200 *
201 * @param array $menu Associative array of administration menu items.
202 * @return array
203 */
204 public function set_site_card_menu_class( array $menu ) {
205 foreach ( $menu as $key => $menu_item ) {
206 if ( 'site-card' !== $menu_item[3] ) {
207 continue;
208 }
209
210 $classes = ' toplevel_page_site-card';
211 if ( blavatar_exists( $this->domain ) ) {
212 $classes .= ' has-site-icon';
213 }
214
215 $menu[ $key ][4] = $menu_item[4] . $classes;
216 $menu[ $key ][5] = 'toplevel_page_site_card';
217 break;
218 }
219
220 return $menu;
221 }
222
223 /**
224 * Returns the first available upsell nudge.
225 *
226 * @return array
227 */
228 public function get_upsell_nudge() {
229 require_lib( 'jetpack-jitm/jitm-engine' );
230 $jitm_engine = new JITM\Engine();
231
232 $message_path = 'calypso:sites:sidebar_notice';
233 $current_user = wp_get_current_user();
234 $user_id = $current_user->ID;
235 $user_roles = implode( ',', $current_user->roles );
236 $query_string = array(
237 'message_path' => $message_path,
238 );
239
240 // Get the top message only.
241 $message = $jitm_engine->get_top_messages( $message_path, $user_id, $user_roles, $query_string );
242
243 if ( isset( $message[0] ) ) {
244 $message = $message[0];
245 return array(
246 'content' => $message->content['message'],
247 'cta' => $message->CTA['message'], // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
248 'link' => $message->CTA['link'], // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
249 'tracks_impression_event_name' => $message->tracks['display']['name'],
250 'tracks_impression_cta_name' => $message->tracks['display']['props']['cta_name'],
251 'tracks_click_event_name' => $message->tracks['click']['name'],
252 'tracks_click_cta_name' => $message->tracks['click']['props']['cta_name'],
253 'dismissible' => $message->is_dismissible,
254 'feature_class' => $message->feature_class,
255 'id' => $message->id,
256 );
257 }
258 }
259
260 /**
261 * Adds Stats menu.
262 */
263 public function add_stats_menu() {
264 $menu_title = __( 'Stats', 'jetpack' );
265
266 if ( ! $this->is_api_request ) {
267 $menu_title .= sprintf(
268 '<img class="sidebar-unified__sparkline" width="80" height="20" src="%1$s" alt="%2$s">',
269 esc_url( site_url( 'wp-includes/charts/admin-bar-hours-scale-2x.php?masterbar=1&s=' . get_current_blog_id() ) ),
270 esc_attr__( 'Hourly views', 'jetpack' )
271 );
272 }
273
274 add_menu_page( __( 'Stats', 'jetpack' ), $menu_title, 'edit_posts', 'https://wordpress.com/stats/day/' . $this->domain, null, 'dashicons-chart-bar', 3 );
275 }
276
277 /**
278 * Gets the current plan and stores it in $this->current_plan so the database is only called once per request.
279 *
280 * @return array
281 */
282 private function get_current_plan() {
283 if ( empty( $this->current_plan ) && class_exists( 'WPCOM_Store_API' ) ) {
284 $this->current_plan = \WPCOM_Store_API::get_current_plan( get_current_blog_id() );
285 }
286 return $this->current_plan;
287 }
288
289 /**
290 * Adds Upgrades menu.
291 *
292 * @param string $plan The current WPCOM plan of the blog.
293 */
294 public function add_upgrades_menu( $plan = null ) {
295 $current_plan = $this->get_current_plan();
296 if ( ! empty( $current_plan['product_name_short'] ) ) {
297 $plan = $current_plan['product_name_short'];
298 }
299
300 parent::add_upgrades_menu( $plan );
301
302 $last_upgrade_submenu_position = $this->get_submenu_item_count( 'paid-upgrades.php' );
303
304 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 );
305
306 /** This filter is already documented in modules/masterbar/admin-menu/class-atomic-admin-menu.php */
307 if ( apply_filters( 'jetpack_show_wpcom_upgrades_email_menu', false ) ) {
308 add_submenu_page( 'paid-upgrades.php', __( 'Emails', 'jetpack' ), __( 'Emails', 'jetpack' ), 'manage_options', 'https://wordpress.com/email/' . $this->domain, null, $last_upgrade_submenu_position );
309 }
310
311 if ( defined( 'WPCOM_ENABLE_ADD_ONS_MENU_ITEM' ) && WPCOM_ENABLE_ADD_ONS_MENU_ITEM ) {
312 add_submenu_page( 'paid-upgrades.php', __( 'Add-Ons', 'jetpack' ), __( 'Add-Ons', 'jetpack' ), 'manage_options', 'https://wordpress.com/add-ons/' . $this->domain, null, 1 );
313 }
314 }
315
316 /**
317 * Adds Appearance menu.
318 */
319 public function add_appearance_menu() {
320 $customize_url = parent::add_appearance_menu();
321
322 $this->hide_submenu_page( 'themes.php', 'theme-editor.php' );
323
324 $user_can_customize = current_user_can( 'customize' );
325
326 if ( $user_can_customize ) {
327 $customize_custom_css_url = add_query_arg( array( 'autofocus' => array( 'section' => 'jetpack_custom_css' ) ), $customize_url );
328 add_submenu_page( 'themes.php', esc_attr__( 'Additional CSS', 'jetpack' ), __( 'Additional CSS', 'jetpack' ), 'customize', esc_url( $customize_custom_css_url ), null, 20 );
329 }
330 }
331
332 /**
333 * Adds Users menu.
334 */
335 public function add_users_menu() {
336 $submenus_to_update = array(
337 'grofiles-editor' => 'https://wordpress.com/me',
338 'grofiles-user-settings' => 'https://wordpress.com/me/account',
339 );
340
341 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'users.php' ) ) {
342 $submenus_to_update['users.php'] = 'https://wordpress.com/people/team/' . $this->domain;
343 }
344
345 $slug = current_user_can( 'list_users' ) ? 'users.php' : 'profile.php';
346 $this->update_submenus( $slug, $submenus_to_update );
347 add_submenu_page( 'users.php', esc_attr__( 'Add New', 'jetpack' ), __( 'Add New', 'jetpack' ), 'promote_users', 'https://wordpress.com/people/new/' . $this->domain, null, 1 );
348 }
349
350 /**
351 * Adds Settings menu.
352 */
353 public function add_options_menu() {
354 parent::add_options_menu();
355
356 if ( Blaze::should_initialize() ) {
357 add_submenu_page( 'tools.php', esc_attr__( 'Advertising', 'jetpack' ), __( 'Advertising', 'jetpack' ), 'manage_options', 'https://wordpress.com/advertising/' . $this->domain, null, 1 );
358 }
359 add_submenu_page( 'options-general.php', esc_attr__( 'Hosting Configuration', 'jetpack' ), __( 'Hosting Configuration', 'jetpack' ), 'manage_options', 'https://wordpress.com/hosting-config/' . $this->domain, null, 10 );
360 }
361
362 /**
363 * Also remove the Gutenberg plugin menu.
364 */
365 public function remove_gutenberg_menu() {
366 // Always remove the Gutenberg menu.
367 remove_menu_page( 'gutenberg' );
368 }
369
370 /**
371 * Whether to use wp-admin pages rather than Calypso.
372 *
373 * @return bool
374 */
375 public function should_link_to_wp_admin() {
376 $result = false; // Calypso.
377
378 $user_attribute = get_user_attribute( get_current_user_id(), 'calypso_preferences' );
379 if ( ! empty( $user_attribute['linkDestination'] ) ) {
380 $result = $user_attribute['linkDestination'];
381 }
382
383 return $result;
384 }
385
386 /**
387 * Adds Plugins menu.
388 */
389 public function add_plugins_menu() {
390 // TODO: Remove wpcom_menu (/wp-content/admin-plugins/wpcom-misc.php).
391 $count = '';
392 if ( ! is_multisite() && current_user_can( 'update_plugins' ) ) {
393 $update_data = wp_get_update_data();
394 $count = sprintf(
395 '<span class="update-plugins count-%s"><span class="plugin-count">%s</span></span>',
396 $update_data['counts']['plugins'],
397 number_format_i18n( $update_data['counts']['plugins'] )
398 );
399 }
400 /* translators: %s: Number of pending plugin updates. */
401 add_menu_page( esc_attr__( 'Plugins', 'jetpack' ), sprintf( __( 'Plugins %s', 'jetpack' ), $count ), 'activate_plugins', 'plugins.php', null, 'dashicons-admin-plugins', 65 );
402
403 parent::add_plugins_menu();
404 }
405
406 /**
407 * Saves the sidebar state ( expanded / collapsed ) via an ajax request.
408 */
409 public function ajax_sidebar_state() {
410 $expanded = isset( $_REQUEST['expanded'] ) ? filter_var( wp_unslash( $_REQUEST['expanded'] ), FILTER_VALIDATE_BOOLEAN ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
411 $user_id = get_current_user_id();
412 $preferences = get_user_attribute( $user_id, 'calypso_preferences' );
413 if ( empty( $preferences ) ) {
414 $preferences = array();
415 }
416
417 $value = array_merge( (array) $preferences, array( 'sidebarCollapsed' => ! $expanded ) );
418 $value = array_filter(
419 $value,
420 function ( $preference ) {
421 return null !== $preference;
422 }
423 );
424
425 update_user_attribute( $user_id, 'calypso_preferences', $value );
426
427 die();
428 }
429
430 /**
431 * Handle ajax requests to dismiss a just-in-time-message
432 */
433 public function wp_ajax_jitm_dismiss() {
434 check_ajax_referer( 'jitm_dismiss' );
435 require_lib( 'jetpack-jitm/jitm-engine' );
436 if ( isset( $_REQUEST['id'] ) && isset( $_REQUEST['feature_class'] ) ) {
437 JITM\Engine::dismiss( sanitize_text_field( wp_unslash( $_REQUEST['id'] ) ), sanitize_text_field( wp_unslash( $_REQUEST['feature_class'] ) ) );
438 }
439 wp_die();
440 }
441
442 /**
443 * Syncs the sidebar collapsed state from Calypso Preferences.
444 */
445 public function sync_sidebar_collapsed_state() {
446 $calypso_preferences = get_user_attribute( get_current_user_id(), 'calypso_preferences' );
447
448 $sidebar_collapsed = isset( $calypso_preferences['sidebarCollapsed'] ) ? $calypso_preferences['sidebarCollapsed'] : false;
449
450 // Read the current stored setting and convert it to boolean in order to be able to compare the values later.
451 $current_sidebar_collapsed_setting = ( 'f' === get_user_setting( 'mfold' ) ) ? true : false;
452
453 // Only set the setting if the value differs, as `set_user_setting` always updates at least the timestamp
454 // which leads to unnecessary user meta cache purging on all wp-admin screen requests.
455 if ( $current_sidebar_collapsed_setting !== $sidebar_collapsed ) {
456 set_user_setting( 'mfold', $sidebar_collapsed ? 'f' : 'o' );
457 }
458 }
459
460 /**
461 * Removes unwanted submenu items.
462 *
463 * These submenus are added across wp-content and should be removed together with these function calls.
464 */
465 public function remove_submenus() {
466 global $_registered_pages;
467
468 remove_submenu_page( 'index.php', 'akismet-stats' );
469 remove_submenu_page( 'index.php', 'my-comments' );
470 remove_submenu_page( 'index.php', 'stats' );
471 remove_submenu_page( 'index.php', 'subscriptions' );
472
473 /* @see https://github.com/Automattic/wp-calypso/issues/49210 */
474 remove_submenu_page( 'index.php', 'my-blogs' );
475 $_registered_pages['admin_page_my-blogs'] = true; // phpcs:ignore
476
477 remove_submenu_page( 'paid-upgrades.php', 'premium-themes' );
478 remove_submenu_page( 'paid-upgrades.php', 'domains' );
479 remove_submenu_page( 'paid-upgrades.php', 'my-upgrades' );
480 remove_submenu_page( 'paid-upgrades.php', 'billing-history' );
481
482 remove_submenu_page( 'themes.php', 'customize.php?autofocus[panel]=amp_panel&return=' . rawurlencode( admin_url() ) );
483
484 remove_submenu_page( 'users.php', 'wpcom-invite-users' ); // Wpcom_Invite_Users::action_admin_menu.
485
486 remove_submenu_page( 'options-general.php', 'adcontrol' );
487
488 // Remove menu item but continue allowing access.
489 foreach ( array( 'openidserver', 'webhooks' ) as $page_slug ) {
490 remove_submenu_page( 'options-general.php', $page_slug );
491 $_registered_pages[ 'admin_page_' . $page_slug ] = true; // phpcs:ignore
492 }
493 }
494 }
495