PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.0.3
Jetpack – WP Security, Backup, Speed, & Growth v12.0.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-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-admin-menu.php
533 lines
1 <?php
2 /**
3 * Admin Menu file.
4 *
5 * @package automattic/jetpack
6 */
7
8 namespace Automattic\Jetpack\Dashboard_Customizations;
9
10 use Automattic\Jetpack\Redirect;
11
12 require_once __DIR__ . '/class-base-admin-menu.php';
13
14 /**
15 * Class Admin_Menu.
16 */
17 class Admin_Menu extends Base_Admin_Menu {
18
19 /**
20 * Create the desired menu output.
21 */
22 public function reregister_menu_items() {
23 // Remove separators.
24 remove_menu_page( 'separator1' );
25
26 $this->add_stats_menu();
27 $this->add_upgrades_menu();
28 $this->add_posts_menu();
29 $this->add_media_menu();
30 $this->add_page_menu();
31 $this->add_testimonials_menu();
32 $this->add_portfolio_menu();
33 $this->add_comments_menu();
34 $this->add_appearance_menu();
35 $this->add_plugins_menu();
36 $this->add_users_menu();
37 $this->add_tools_menu();
38 $this->add_options_menu();
39 $this->add_jetpack_menu();
40 $this->add_gutenberg_menus();
41
42 // Remove Links Manager menu since its usage is discouraged. https://github.com/Automattic/wp-calypso/issues/51188.
43 // @see https://core.trac.wordpress.org/ticket/21307#comment:73.
44 if ( $this->should_disable_links_manager() ) {
45 remove_menu_page( 'link-manager.php' );
46 }
47
48 ksort( $GLOBALS['menu'] );
49 }
50
51 /**
52 * Get the preferred view for the given screen.
53 *
54 * @param string $screen Screen identifier.
55 * @param bool $fallback_global_preference (Optional) Whether the global preference for all screens should be used
56 * as fallback if there is no specific preference for the given screen.
57 * Default: true.
58 * @return string
59 */
60 public function get_preferred_view( $screen, $fallback_global_preference = true ) {
61 // When no preferred view has been set for "Users > All Users" or "Settings > General", keep the previous
62 // behavior that forced the default view regardless of the global preference.
63 if (
64 $fallback_global_preference &&
65 in_array( $screen, array( 'users.php', 'options-general.php' ), true )
66 ) {
67 $preferred_view = parent::get_preferred_view( $screen, false );
68 if ( self::UNKNOWN_VIEW === $preferred_view ) {
69 return self::DEFAULT_VIEW;
70 }
71 return $preferred_view;
72 }
73
74 return parent::get_preferred_view( $screen, $fallback_global_preference );
75 }
76
77 /**
78 * Point the Site Editor's `< Dashboard` link to wpcom home.
79 *
80 * Although this isn't strictly an admin menu item, it belongs here because it's part of
81 * changing wp-admin links to their wp.com equivalents.
82 *
83 * @param array $settings Editor settings.
84 * @return array Updated Editor settings.
85 */
86 public function site_editor_dashboard_link( $settings ) {
87 $settings['__experimentalDashboardLink'] = 'https://wordpress.com/home/' . $this->domain;
88 return $settings;
89 }
90
91 /**
92 * Check if Links Manager is being used.
93 */
94 public function should_disable_links_manager() {
95 // The max ID number of the auto-generated links.
96 // See /wp-content/mu-plugins/wpcom-wp-install-defaults.php in WP.com.
97 $max_default_id = 10;
98
99 // We are only checking the latest entry link_id so are limiting the query to 1.
100 $link_manager_links = get_bookmarks(
101 array(
102 'orderby' => 'link_id',
103 'order' => 'DESC',
104 'limit' => 1,
105 'hide_invisible' => 0,
106 )
107 );
108
109 // Ordered links by ID descending, check if the first ID is more than $max_default_id.
110 if ( count( $link_manager_links ) > 0 && $link_manager_links[0]->link_id > $max_default_id ) {
111 return false;
112 }
113
114 return true;
115 }
116
117 /**
118 * Adds My Home menu.
119 */
120 public function add_my_home_menu() {
121 $this->update_menu( 'index.php', 'https://wordpress.com/home/' . $this->domain, __( 'My Home', 'jetpack' ), 'edit_posts', 'dashicons-admin-home' );
122 }
123
124 /**
125 * Adds Inbox menu.
126 */
127 public function add_inbox_menu() {
128 add_menu_page( __( 'Inbox', 'jetpack' ), __( 'Inbox', 'jetpack' ), 'manage_options', 'https://wordpress.com/inbox/' . $this->domain, null, 'dashicons-email', '4.64424' );
129 }
130
131 /**
132 * Adds Stats menu.
133 */
134 public function add_stats_menu() {
135 add_menu_page( __( 'Stats', 'jetpack' ), __( 'Stats', 'jetpack' ), 'view_stats', 'https://wordpress.com/stats/day/' . $this->domain, null, 'dashicons-chart-bar', 3 );
136 }
137
138 /**
139 * Adds Upgrades menu.
140 *
141 * @param string $plan The current WPCOM plan of the blog.
142 */
143 public function add_upgrades_menu( $plan = null ) {
144 global $menu;
145
146 $menu_exists = false;
147 foreach ( $menu as $item ) {
148 if ( 'paid-upgrades.php' === $item[2] ) {
149 $menu_exists = true;
150 break;
151 }
152 }
153
154 if ( ! $menu_exists ) {
155 if ( $plan ) {
156 // Add display:none as a default for cases when CSS is not loaded.
157 $site_upgrades = '%1$s<span class="inline-text" style="display:none">%2$s</span>';
158 $site_upgrades = sprintf(
159 $site_upgrades,
160 __( 'Upgrades', 'jetpack' ),
161 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
162 __( $plan, 'jetpack' )
163 );
164 } else {
165 $site_upgrades = __( 'Upgrades', 'jetpack' );
166 }
167
168 add_menu_page( __( 'Upgrades', 'jetpack' ), $site_upgrades, 'manage_options', 'paid-upgrades.php', null, 'dashicons-cart', 4 );
169 }
170
171 add_submenu_page( 'paid-upgrades.php', __( 'Plans', 'jetpack' ), __( 'Plans', 'jetpack' ), 'manage_options', 'https://wordpress.com/plans/' . $this->domain, null, 1 );
172 add_submenu_page( 'paid-upgrades.php', __( 'Purchases', 'jetpack' ), __( 'Purchases', 'jetpack' ), 'manage_options', 'https://wordpress.com/purchases/subscriptions/' . $this->domain, null, 2 );
173
174 if ( ! $menu_exists ) {
175 // Remove the submenu auto-created by Core.
176 $this->hide_submenu_page( 'paid-upgrades.php', 'paid-upgrades.php' );
177 }
178 }
179
180 /**
181 * Adds Posts menu.
182 */
183 public function add_posts_menu() {
184 $submenus_to_update = array();
185
186 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'edit.php' ) ) {
187 $submenus_to_update['edit.php'] = 'https://wordpress.com/posts/' . $this->domain;
188 $submenus_to_update['post-new.php'] = 'https://wordpress.com/post/' . $this->domain;
189 }
190
191 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'edit-tags.php?taxonomy=category' ) ) {
192 $submenus_to_update['edit-tags.php?taxonomy=category'] = 'https://wordpress.com/settings/taxonomies/category/' . $this->domain;
193 }
194
195 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'edit-tags.php?taxonomy=post_tag' ) ) {
196 $submenus_to_update['edit-tags.php?taxonomy=post_tag'] = 'https://wordpress.com/settings/taxonomies/post_tag/' . $this->domain;
197 }
198
199 $this->update_submenus( 'edit.php', $submenus_to_update );
200 }
201
202 /**
203 * Adds Media menu.
204 */
205 public function add_media_menu() {
206 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'upload.php' ) ) {
207 return;
208 }
209
210 $this->hide_submenu_page( 'upload.php', 'media-new.php' );
211
212 $this->update_menu( 'upload.php', 'https://wordpress.com/media/' . $this->domain );
213 }
214
215 /**
216 * Adds Page menu.
217 */
218 public function add_page_menu() {
219 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'edit.php?post_type=page' ) ) {
220 return;
221 }
222
223 $submenus_to_update = array(
224 'edit.php?post_type=page' => 'https://wordpress.com/pages/' . $this->domain,
225 'post-new.php?post_type=page' => 'https://wordpress.com/page/' . $this->domain,
226 );
227 $this->update_submenus( 'edit.php?post_type=page', $submenus_to_update );
228 }
229
230 /**
231 * Adds Testimonials menu.
232 */
233 public function add_testimonials_menu() {
234 $this->add_custom_post_type_menu( 'jetpack-testimonial' );
235 }
236
237 /**
238 * Adds Portfolio menu.
239 */
240 public function add_portfolio_menu() {
241 $this->add_custom_post_type_menu( 'jetpack-portfolio' );
242 }
243
244 /**
245 * Adds a custom post type menu.
246 *
247 * @param string $post_type Custom post type.
248 */
249 public function add_custom_post_type_menu( $post_type ) {
250 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'edit.php?post_type=' . $post_type ) ) {
251 return;
252 }
253
254 $submenus_to_update = array(
255 'edit.php?post_type=' . $post_type => 'https://wordpress.com/types/' . $post_type . '/' . $this->domain,
256 'post-new.php?post_type=' . $post_type => 'https://wordpress.com/edit/' . $post_type . '/' . $this->domain,
257 );
258 $this->update_submenus( 'edit.php?post_type=' . $post_type, $submenus_to_update );
259 }
260
261 /**
262 * Adds Comments menu.
263 */
264 public function add_comments_menu() {
265 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'edit-comments.php' ) ) {
266 return;
267 }
268
269 $this->update_menu( 'edit-comments.php', 'https://wordpress.com/comments/all/' . $this->domain );
270 }
271
272 /**
273 * Adds Appearance menu.
274 *
275 * @return string The Customizer URL.
276 */
277 public function add_appearance_menu() {
278 $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
279 $default_customize_slug = add_query_arg( 'return', rawurlencode( remove_query_arg( wp_removable_query_args(), $request_uri ) ), 'customize.php' );
280 $default_customize_header_slug_1 = add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $default_customize_slug );
281 // TODO: Remove WPCom_Theme_Customizer::modify_header_menu_links() and WPcom_Custom_Header::modify_admin_menu_links().
282 $default_customize_header_slug_2 = admin_url( 'themes.php?page=custom-header' );
283 $default_customize_background_slug_1 = add_query_arg( array( 'autofocus' => array( 'control' => 'background_image' ) ), $default_customize_slug );
284 // TODO: Remove Colors_Manager::modify_header_menu_links() and Colors_Manager_Common::modify_header_menu_links().
285 $default_customize_background_slug_2 = add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), admin_url( 'customize.php' ) );
286
287 if ( $this->is_api_request ) {
288 // In case this is an api request we will have to add the 'return' querystring via JS.
289 $customize_url = 'customize.php';
290 } else {
291 $customize_url = $default_customize_slug;
292 }
293
294 $submenus_to_update = array(
295 $default_customize_slug => $customize_url,
296 $default_customize_header_slug_1 => add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url ),
297 $default_customize_header_slug_2 => add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url ),
298 $default_customize_background_slug_1 => add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), $customize_url ),
299 $default_customize_background_slug_2 => add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), $customize_url ),
300 );
301
302 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'themes.php' ) ) {
303 $submenus_to_update['themes.php'] = 'https://wordpress.com/themes/' . $this->domain;
304 }
305
306 $this->update_submenus( 'themes.php', $submenus_to_update );
307
308 $this->hide_submenu_page( 'themes.php', 'custom-header' );
309 $this->hide_submenu_page( 'themes.php', 'custom-background' );
310
311 return $customize_url;
312 }
313
314 /**
315 * Adds Plugins menu.
316 */
317 public function add_plugins_menu() {
318 $this->hide_submenu_page( 'plugins.php', 'plugin-install.php' );
319 $this->hide_submenu_page( 'plugins.php', 'plugin-editor.php' );
320
321 $this->update_menu( 'plugins.php', 'https://wordpress.com/plugins/' . $this->domain );
322 }
323
324 /**
325 * Adds Users menu.
326 */
327 public function add_users_menu() {
328 $submenus_to_update = array(
329 'profile.php' => 'https://wordpress.com/me',
330 );
331
332 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'users.php' ) ) {
333 $submenus_to_update['users.php'] = 'https://wordpress.com/people/team/' . $this->domain;
334 $submenus_to_update['user-new.php'] = 'https://wordpress.com/people/new/' . $this->domain;
335 }
336
337 $slug = current_user_can( 'list_users' ) ? 'users.php' : 'profile.php';
338 $this->update_submenus( $slug, $submenus_to_update );
339 add_submenu_page( $slug, esc_attr__( 'Account Settings', 'jetpack' ), __( 'Account Settings', 'jetpack' ), 'read', 'https://wordpress.com/me/account' );
340 }
341
342 /**
343 * Adds Tools menu.
344 */
345 public function add_tools_menu() {
346 $submenus_to_update = array();
347 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'import.php' ) ) {
348 $submenus_to_update['import.php'] = 'https://wordpress.com/import/' . $this->domain;
349 }
350 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'export.php' ) ) {
351 $submenus_to_update['export.php'] = 'https://wordpress.com/export/' . $this->domain;
352 }
353 $this->update_submenus( 'tools.php', $submenus_to_update );
354
355 $this->hide_submenu_page( 'tools.php', 'tools.php' );
356 $this->hide_submenu_page( 'tools.php', 'delete-blog' );
357
358 add_submenu_page( 'tools.php', esc_attr__( 'Marketing', 'jetpack' ), __( 'Marketing', 'jetpack' ), 'publish_posts', 'https://wordpress.com/marketing/tools/' . $this->domain, null, 0 );
359 add_submenu_page( 'tools.php', esc_attr__( 'Earn', 'jetpack' ), __( 'Earn', 'jetpack' ), 'manage_options', 'https://wordpress.com/earn/' . $this->domain, null, 1 );
360 }
361
362 /**
363 * Adds Settings menu.
364 */
365 public function add_options_menu() {
366 $submenus_to_update = array();
367
368 $this->hide_submenu_page( 'options-general.php', 'sharing' );
369
370 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'options-general.php' ) ) {
371 $submenus_to_update['options-general.php'] = 'https://wordpress.com/settings/general/' . $this->domain;
372 }
373
374 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'options-writing.php' ) ) {
375 $submenus_to_update['options-writing.php'] = 'https://wordpress.com/settings/writing/' . $this->domain;
376 }
377
378 if (
379 /**
380 * Filter to enable the modernized Reading Settings in Calypso UI.
381 *
382 * @since 11.8
383 * @module masterbar
384 *
385 * @param bool false Should the modernized Reading Settings be enabled? Default to false.
386 */
387 apply_filters( 'calypso_use_modernized_reading_settings', false )
388 && self::DEFAULT_VIEW === $this->get_preferred_view( 'options-reading.php' )
389 ) {
390 $submenus_to_update['options-reading.php'] = 'https://wordpress.com/settings/reading/' . $this->domain;
391 }
392
393 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'options-discussion.php' ) ) {
394 $submenus_to_update['options-discussion.php'] = 'https://wordpress.com/settings/discussion/' . $this->domain;
395 }
396
397 $this->update_submenus( 'options-general.php', $submenus_to_update );
398
399 add_submenu_page( 'options-general.php', esc_attr__( 'Performance', 'jetpack' ), __( 'Performance', 'jetpack' ), 'manage_options', 'https://wordpress.com/settings/performance/' . $this->domain, null, 1 );
400 }
401
402 /**
403 * Adds Jetpack menu.
404 */
405 public function add_jetpack_menu() {
406 $this->add_admin_menu_separator( 50, 'manage_options' );
407
408 // TODO: Replace with proper SVG data url.
409 $icon = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 40 40' %3E%3Cpath fill='%23a0a5aa' d='M20 0c11.046 0 20 8.954 20 20s-8.954 20-20 20S0 31.046 0 20 8.954 0 20 0zm11 17H21v19l10-19zM19 4L9 23h10V4z'/%3E%3C/svg%3E";
410
411 $is_menu_updated = $this->update_menu( 'jetpack', null, null, null, $icon, 51 );
412 if ( ! $is_menu_updated ) {
413 add_menu_page( esc_attr__( 'Jetpack', 'jetpack' ), __( 'Jetpack', 'jetpack' ), 'manage_options', 'jetpack', null, $icon, 51 );
414 }
415
416 add_submenu_page( 'jetpack', esc_attr__( 'Activity Log', 'jetpack' ), __( 'Activity Log', 'jetpack' ), 'manage_options', 'https://wordpress.com/activity-log/' . $this->domain, null, 2 );
417 add_submenu_page( 'jetpack', esc_attr__( 'Backup', 'jetpack' ), __( 'Backup', 'jetpack' ), 'manage_options', 'https://wordpress.com/backup/' . $this->domain, null, 3 );
418
419 $this->hide_submenu_page( 'jetpack', 'jetpack#/settings' );
420 $this->hide_submenu_page( 'jetpack', 'stats' );
421 $this->hide_submenu_page( 'jetpack', esc_url( Redirect::get_url( 'calypso-backups' ) ) );
422 $this->hide_submenu_page( 'jetpack', esc_url( Redirect::get_url( 'calypso-scanner' ) ) );
423
424 if ( ! $is_menu_updated ) {
425 // Remove the submenu auto-created by Core just to be sure that there no issues on non-admin roles.
426 remove_submenu_page( 'jetpack', 'jetpack' );
427 }
428 }
429
430 /**
431 * Update Site Editor menu item's link and position.
432 */
433 public function add_gutenberg_menus() {
434 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'site-editor.php' ) ) {
435 return;
436 }
437
438 $this->update_menu( 'gutenberg-edit-site', 'https://wordpress.com/site-editor/' . $this->domain, null, null, null, 59 );
439
440 // Gutenberg 11.9 moves the Site Editor to an Appearance submenu as Editor.
441 $submenus_to_update = array(
442 // Keep the old rule in order to Calypsoify the route for GB < 13.7.
443 'gutenberg-edit-site' => 'https://wordpress.com/site-editor/' . $this->domain,
444 // New route: Gutenberg 13.7 changes the site editor menu item slug and url.
445 'site-editor.php' => 'https://wordpress.com/site-editor/' . $this->domain,
446 );
447 $this->update_submenus( 'themes.php', $submenus_to_update );
448 }
449
450 /**
451 * Add the calypso /woocommerce-installation/ menu item.
452 *
453 * @param array $current_plan The site's plan if they have one. This is passed from WPcom_Admin_Menu to prevent
454 * redundant database queries.
455 */
456 public function add_woocommerce_installation_menu( $current_plan = null ) {
457 /**
458 * Whether to show the WordPress.com WooCommerce Installation menu.
459 *
460 * @use add_filter( 'jetpack_show_wpcom_woocommerce_installation_menu', '__return_true' );
461 * @module masterbar
462 * @since 10.3.0
463 * @param bool $jetpack_show_wpcom_woocommerce_installation_menu Load the WordPress.com WooCommerce Installation menu item. Default to false.
464 * @param array $current_plan Data about the current site's plan.
465 */
466 if ( apply_filters( 'jetpack_show_wpcom_woocommerce_installation_menu', false, $current_plan ) ) {
467 $this->add_admin_menu_separator( 54, 'activate_plugins' );
468
469 $icon_url = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGZpbGw9IiNhMmFhYjIiIGQ9Ik02MTIuMTkyIDQyNi4zMzZjMC02Ljg5Ni0zLjEzNi01MS42LTI4LTUxLjYtMzcuMzYgMC00Ni43MDQgNzIuMjU2LTQ2LjcwNCA4Mi42MjQgMCAzLjQwOCAzLjE1MiA1OC40OTYgMjguMDMyIDU4LjQ5NiAzNC4xOTItLjAzMiA0Ni42NzItNzIuMjg4IDQ2LjY3Mi04OS41MnptMjAyLjE5MiAwYzAtNi44OTYtMy4xNTItNTEuNi0yOC4wMzItNTEuNi0zNy4yOCAwLTQ2LjYwOCA3Mi4yNTYtNDYuNjA4IDgyLjYyNCAwIDMuNDA4IDMuMDcyIDU4LjQ5NiAyNy45NTIgNTguNDk2IDM0LjE5Mi0uMDMyIDQ2LjY4OC03Mi4yODggNDYuNjg4LTg5LjUyek0xNDEuMjk2Ljc2OGMtNjguMjI0IDAtMTIzLjUwNCA1NS40ODgtMTIzLjUwNCAxMjMuOTJ2NjUwLjcyYzAgNjguNDMyIDU1LjI5NiAxMjMuOTIgMTIzLjUwNCAxMjMuOTJoMzM5LjgwOGwxMjMuNTA0IDEyMy45MzZWODk5LjMyOGgyNzguMDQ4YzY4LjIyNCAwIDEyMy41Mi01NS40NzIgMTIzLjUyLTEyMy45MnYtNjUwLjcyYzAtNjguNDMyLTU1LjI5Ni0xMjMuOTItMTIzLjUyLTEyMy45MmgtNzQxLjM2em01MjYuODY0IDQyMi4xNmMwIDU1LjA4OC0zMS4wODggMTU0Ljg4LTEwMi42NCAxNTQuODgtNi4yMDggMC0xOC40OTYtMy42MTYtMjUuNDI0LTYuMDE2LTMyLjUxMi0xMS4xNjgtNTAuMTkyLTQ5LjY5Ni01Mi4zNTItNjYuMjU2IDAgMC0zLjA3Mi0xNy43OTItMy4wNzItNDAuNzUyIDAtMjIuOTkyIDMuMDcyLTQ1LjMyOCAzLjA3Mi00NS4zMjggMTUuNTUyLTc1LjcyOCA0My41NTItMTA2LjczNiA5Ni40NDgtMTA2LjczNiA1OS4wNzItLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4ek00ODYuNDk2IDMwMi40YzAgMy4zOTItNDMuNTUyIDE0MS4xNjgtNDMuNTUyIDIxMy40MjR2NzUuNzEyYy0yLjU5MiAxMi4wOC00LjE2IDI0LjE0NC0yMS44MjQgMjQuMTQ0LTQ2LjYwOCAwLTg4Ljg4LTE1MS40NzItOTIuMDE2LTE2MS44NC02LjIwOCA2Ljg5Ni02Mi4yNCAxNjEuODQtOTYuNDQ4IDE2MS44NC0yNC44NjQgMC00My41NTItMTEzLjY0OC00Ni42MDgtMTIzLjkzNkMxNzYuNzA0IDQzNi42NzIgMTYwIDMzNC4yMjQgMTYwIDMyNy4zMjhjMC0yMC42NzIgMS4xNTItMzguNzM2IDI2LjA0OC0zOC43MzYgNi4yMDggMCAyMS42IDYuMDY0IDIzLjcxMiAxNy4xNjggMTEuNjQ4IDYyLjAzMiAxNi42ODggMTIwLjUxMiAyOS4xNjggMTg1Ljk2OCAxLjg1NiAyLjkyOCAxLjUwNCA3LjAwOCA0LjU2IDEwLjQzMiAzLjE1Mi0xMC4yODggNjYuOTI4LTE2OC43ODQgOTQuOTYtMTY4Ljc4NCAyMi41NDQgMCAzMC40IDQ0LjU5MiAzMy41MzYgNjEuODI0IDYuMjA4IDIwLjY1NiAxMy4wODggNTUuMjE2IDIyLjQxNiA4Mi43NTIgMC0xMy43NzYgMTIuNDgtMjAzLjEyIDY1LjM5Mi0yMDMuMTIgMTguNTkyLjAzMiAyNi43MDQgNi45MjggMjYuNzA0IDI3LjU2OHpNODcwLjMyIDQyMi45MjhjMCA1NS4wODgtMzEuMDg4IDE1NC44OC0xMDIuNjQgMTU0Ljg4LTYuMTkyIDAtMTguNDQ4LTMuNjE2LTI1LjQyNC02LjAxNi0zMi40MzItMTEuMTY4LTUwLjE3Ni00OS42OTYtNTIuMjg4LTY2LjI1NiAwIDAtMy44ODgtMTcuOTItMy44ODgtNDAuODk2czMuODg4LTQ1LjE4NCAzLjg4OC00NS4xODRjMTUuNTUyLTc1LjcyOCA0My40ODgtMTA2LjczNiA5Ni4zODQtMTA2LjczNiA1OS4xMDQtLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4eiIvPjwvc3ZnPg==';
470 $menu_url = 'https://wordpress.com/woocommerce-installation/' . $this->domain;
471
472 // Only show the menu if the user has the capability to activate_plugins.
473 add_menu_page( esc_attr__( 'WooCommerce', 'jetpack' ), esc_attr__( 'WooCommerce', 'jetpack' ), 'activate_plugins', $menu_url, null, $icon_url, 55 );
474 }
475 }
476
477 /**
478 * AJAX handler for retrieving the upsell nudge.
479 */
480 public function wp_ajax_upsell_nudge_jitm() {
481 check_ajax_referer( 'upsell_nudge_jitm' );
482
483 $nudge = $this->get_upsell_nudge();
484 if ( ! $nudge ) {
485 wp_die();
486 }
487
488 $link = $nudge['link'];
489 if ( substr( $link, 0, 1 ) === '/' ) {
490 $link = 'https://wordpress.com' . $link;
491 }
492 ?>
493 <li class="wp-not-current-submenu menu-top menu-icon-generic toplevel_page_site-notices" id="toplevel_page_site-notices">
494 <a href="<?php echo esc_url( $link ); ?>" class="wp-not-current-submenu menu-top menu-icon-generic toplevel_page_site-notices">
495 <div class="wp-menu-arrow">
496 <div></div>
497 </div>
498 <div class="wp-menu-image dashicons-before dashicons-admin-generic" aria-hidden="true"><br></div>
499 <div class="wp-menu-name">
500 <div class="upsell_banner">
501 <div class="banner__info">
502 <div class="banner__title">
503 <?php echo wp_kses( $nudge['content'], array() ); ?>
504 </div>
505 </div>
506 <div class="banner__action">
507 <button type="button" class="button">
508 <?php echo wp_kses( $nudge['cta'], array() ); ?>
509 </button>
510 </div>
511 <?php if ( $nudge['dismissible'] ) : ?>
512 <svg xmlns="http://www.w3.org/2000/svg" data-feature_class="<?php echo esc_attr( $nudge['feature_class'] ); ?>" data-feature_id="<?php echo esc_attr( $nudge['id'] ); ?>" viewBox="0 0 24 24" class="gridicon gridicons-cross dismissible-card__close-icon" height="24" width="24"><g><path d="M18.36 19.78L12 13.41l-6.36 6.37-1.42-1.42L10.59 12 4.22 5.64l1.42-1.42L12 10.59l6.36-6.36 1.41 1.41L13.41 12l6.36 6.36z"></path></g></svg>
513 <?php endif; ?>
514 </div>
515 </div>
516 </a>
517 </li>
518 <?php
519 wp_die();
520 }
521
522 /**
523 * Returns the first available upsell nudge.
524 * Needs to be implemented separately for each child menu class.
525 * Empty by default.
526 *
527 * @return array
528 */
529 public function get_upsell_nudge() {
530 return array();
531 }
532 }
533