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