PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.6.4
Jetpack – WP Security, Backup, Speed, & Growth v12.6.4
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 2 years ago admin-menu-rtl.min.css 2 years ago admin-menu.css 2 years ago admin-menu.js 3 years ago admin-menu.min.css 2 years ago class-admin-menu.php 2 years ago class-atomic-admin-menu.php 2 years ago class-base-admin-menu.php 3 years ago class-dashboard-switcher-tracking.php 3 years ago class-domain-only-admin-menu.php 2 years ago class-jetpack-admin-menu.php 2 years ago class-p2-admin-menu.php 4 years ago class-wpcom-admin-menu.php 2 years ago class-wpcom-email-subscription-checker.php 3 years ago dashicon-set.php 4 years ago globe-icon.svg 3 years ago load.php 3 years ago menu-mappings.php 3 years ago
class-admin-menu.php
488 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\Assets\Logo;
11 use Automattic\Jetpack\Redirect;
12
13 require_once __DIR__ . '/class-base-admin-menu.php';
14
15 /**
16 * Class Admin_Menu.
17 */
18 class Admin_Menu extends Base_Admin_Menu {
19
20 /**
21 * Create the desired menu output.
22 */
23 public function reregister_menu_items() {
24 // Remove separators.
25 remove_menu_page( 'separator1' );
26
27 $this->add_stats_menu();
28 $this->add_upgrades_menu();
29 $this->add_posts_menu();
30 $this->add_media_menu();
31 $this->add_page_menu();
32 $this->add_testimonials_menu();
33 $this->add_portfolio_menu();
34 $this->add_comments_menu();
35 $this->add_appearance_menu();
36 $this->add_plugins_menu();
37 $this->add_users_menu();
38 $this->add_tools_menu();
39 $this->add_options_menu();
40 $this->add_jetpack_menu();
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 * Check if Links Manager is being used.
79 */
80 public function should_disable_links_manager() {
81 // The max ID number of the auto-generated links.
82 // See /wp-content/mu-plugins/wpcom-wp-install-defaults.php in WP.com.
83 $max_default_id = 10;
84
85 // We are only checking the latest entry link_id so are limiting the query to 1.
86 $link_manager_links = get_bookmarks(
87 array(
88 'orderby' => 'link_id',
89 'order' => 'DESC',
90 'limit' => 1,
91 'hide_invisible' => 0,
92 )
93 );
94
95 // Ordered links by ID descending, check if the first ID is more than $max_default_id.
96 if ( is_countable( $link_manager_links ) && count( $link_manager_links ) > 0 && $link_manager_links[0]->link_id > $max_default_id ) {
97 return false;
98 }
99
100 return true;
101 }
102
103 /**
104 * Adds My Home menu.
105 */
106 public function add_my_home_menu() {
107 $this->update_menu( 'index.php', 'https://wordpress.com/home/' . $this->domain, __( 'My Home', 'jetpack' ), 'edit_posts', 'dashicons-admin-home' );
108 }
109
110 /**
111 * Adds Inbox menu.
112 */
113 public function add_my_mailboxes_menu() {
114 add_menu_page( __( 'My Mailboxes', 'jetpack' ), __( 'My Mailboxes', 'jetpack' ), 'manage_options', 'https://wordpress.com/mailboxes/' . $this->domain, null, 'dashicons-email', '4.64424' );
115 }
116
117 /**
118 * Adds Stats menu.
119 */
120 public function add_stats_menu() {
121 add_menu_page( __( 'Stats', 'jetpack' ), __( 'Stats', 'jetpack' ), 'view_stats', 'https://wordpress.com/stats/day/' . $this->domain, null, 'dashicons-chart-bar', 3 );
122 }
123
124 /**
125 * Adds Upgrades menu.
126 *
127 * @param string $plan The current WPCOM plan of the blog.
128 */
129 public function add_upgrades_menu( $plan = null ) {
130 global $menu;
131
132 $menu_exists = false;
133 foreach ( $menu as $item ) {
134 if ( 'paid-upgrades.php' === $item[2] ) {
135 $menu_exists = true;
136 break;
137 }
138 }
139
140 if ( ! $menu_exists ) {
141 if ( $plan ) {
142 // Add display:none as a default for cases when CSS is not loaded.
143 $site_upgrades = '%1$s<span class="inline-text" style="display:none">%2$s</span>';
144 $site_upgrades = sprintf(
145 $site_upgrades,
146 __( 'Upgrades', 'jetpack' ),
147 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
148 __( $plan, 'jetpack' )
149 );
150 } else {
151 $site_upgrades = __( 'Upgrades', 'jetpack' );
152 }
153
154 add_menu_page( __( 'Upgrades', 'jetpack' ), $site_upgrades, 'manage_options', 'paid-upgrades.php', null, 'dashicons-cart', 4 );
155 }
156
157 add_submenu_page( 'paid-upgrades.php', __( 'Plans', 'jetpack' ), __( 'Plans', 'jetpack' ), 'manage_options', 'https://wordpress.com/plans/' . $this->domain, null, 1 );
158 add_submenu_page( 'paid-upgrades.php', __( 'Purchases', 'jetpack' ), __( 'Purchases', 'jetpack' ), 'manage_options', 'https://wordpress.com/purchases/subscriptions/' . $this->domain, null, 2 );
159
160 if ( ! $menu_exists ) {
161 // Remove the submenu auto-created by Core.
162 $this->hide_submenu_page( 'paid-upgrades.php', 'paid-upgrades.php' );
163 }
164 }
165
166 /**
167 * Adds Posts menu.
168 */
169 public function add_posts_menu() {
170 $submenus_to_update = array();
171
172 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'edit.php' ) ) {
173 $submenus_to_update['edit.php'] = 'https://wordpress.com/posts/' . $this->domain;
174 $submenus_to_update['post-new.php'] = 'https://wordpress.com/post/' . $this->domain;
175 $this->update_submenus( 'edit.php', $submenus_to_update );
176 }
177
178 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'edit-tags.php?taxonomy=category' ) ) {
179 $this->update_submenus( 'edit.php', array( 'edit-tags.php?taxonomy=category' => 'https://wordpress.com/settings/taxonomies/category/' . $this->domain ) );
180 }
181
182 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'edit-tags.php?taxonomy=post_tag' ) ) {
183 $this->update_submenus( 'edit.php', array( 'edit-tags.php?taxonomy=post_tag' => 'https://wordpress.com/settings/taxonomies/post_tag/' . $this->domain ) );
184 }
185 }
186
187 /**
188 * Adds Media menu.
189 */
190 public function add_media_menu() {
191 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'upload.php' ) ) {
192 return;
193 }
194
195 $this->hide_submenu_page( 'upload.php', 'media-new.php' );
196
197 $this->update_menu( 'upload.php', 'https://wordpress.com/media/' . $this->domain );
198 }
199
200 /**
201 * Adds Page menu.
202 */
203 public function add_page_menu() {
204 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'edit.php?post_type=page' ) ) {
205 return;
206 }
207
208 $submenus_to_update = array(
209 'edit.php?post_type=page' => 'https://wordpress.com/pages/' . $this->domain,
210 'post-new.php?post_type=page' => 'https://wordpress.com/page/' . $this->domain,
211 );
212 $this->update_submenus( 'edit.php?post_type=page', $submenus_to_update );
213 }
214
215 /**
216 * Adds Testimonials menu.
217 */
218 public function add_testimonials_menu() {
219 $this->add_custom_post_type_menu( 'jetpack-testimonial' );
220 }
221
222 /**
223 * Adds Portfolio menu.
224 */
225 public function add_portfolio_menu() {
226 $this->add_custom_post_type_menu( 'jetpack-portfolio' );
227 }
228
229 /**
230 * Adds a custom post type menu.
231 *
232 * @param string $post_type Custom post type.
233 */
234 public function add_custom_post_type_menu( $post_type ) {
235 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'edit.php?post_type=' . $post_type ) ) {
236 return;
237 }
238
239 $submenus_to_update = array(
240 'edit.php?post_type=' . $post_type => 'https://wordpress.com/types/' . $post_type . '/' . $this->domain,
241 'post-new.php?post_type=' . $post_type => 'https://wordpress.com/edit/' . $post_type . '/' . $this->domain,
242 );
243 $this->update_submenus( 'edit.php?post_type=' . $post_type, $submenus_to_update );
244 }
245
246 /**
247 * Adds Comments menu.
248 */
249 public function add_comments_menu() {
250 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'edit-comments.php' ) ) {
251 return;
252 }
253
254 $this->update_menu( 'edit-comments.php', 'https://wordpress.com/comments/all/' . $this->domain );
255 }
256
257 /**
258 * Adds Appearance menu.
259 *
260 * @return string The Customizer URL.
261 */
262 public function add_appearance_menu() {
263 $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
264 $default_customize_slug = add_query_arg( 'return', rawurlencode( remove_query_arg( wp_removable_query_args(), $request_uri ) ), 'customize.php' );
265 $default_customize_header_slug_1 = add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $default_customize_slug );
266 // TODO: Remove WPCom_Theme_Customizer::modify_header_menu_links() and WPcom_Custom_Header::modify_admin_menu_links().
267 $default_customize_header_slug_2 = admin_url( 'themes.php?page=custom-header' );
268 $default_customize_background_slug_1 = add_query_arg( array( 'autofocus' => array( 'control' => 'background_image' ) ), $default_customize_slug );
269 // TODO: Remove Colors_Manager::modify_header_menu_links() and Colors_Manager_Common::modify_header_menu_links().
270 $default_customize_background_slug_2 = add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), admin_url( 'customize.php' ) );
271
272 if ( $this->is_api_request ) {
273 // In case this is an api request we will have to add the 'return' querystring via JS.
274 $customize_url = 'customize.php';
275 } else {
276 $customize_url = $default_customize_slug;
277 }
278
279 $submenus_to_update = array(
280 $default_customize_slug => $customize_url,
281 $default_customize_header_slug_1 => add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url ),
282 $default_customize_header_slug_2 => add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url ),
283 $default_customize_background_slug_1 => add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), $customize_url ),
284 $default_customize_background_slug_2 => add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), $customize_url ),
285 );
286
287 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'themes.php' ) ) {
288 $submenus_to_update['themes.php'] = 'https://wordpress.com/themes/' . $this->domain;
289 }
290
291 $this->update_submenus( 'themes.php', $submenus_to_update );
292
293 $this->hide_submenu_page( 'themes.php', 'custom-header' );
294 $this->hide_submenu_page( 'themes.php', 'custom-background' );
295
296 return $customize_url;
297 }
298
299 /**
300 * Adds Plugins menu.
301 */
302 public function add_plugins_menu() {
303 $this->hide_submenu_page( 'plugins.php', 'plugin-install.php' );
304 $this->hide_submenu_page( 'plugins.php', 'plugin-editor.php' );
305
306 $this->update_menu( 'plugins.php', 'https://wordpress.com/plugins/' . $this->domain );
307 }
308
309 /**
310 * Adds Users menu.
311 */
312 public function add_users_menu() {
313 $submenus_to_update = array(
314 'profile.php' => 'https://wordpress.com/me',
315 );
316
317 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'users.php' ) ) {
318 $submenus_to_update['users.php'] = 'https://wordpress.com/people/team/' . $this->domain;
319 $submenus_to_update['user-new.php'] = 'https://wordpress.com/people/new/' . $this->domain;
320 }
321
322 $slug = current_user_can( 'list_users' ) ? 'users.php' : 'profile.php';
323 $this->update_submenus( $slug, $submenus_to_update );
324 add_submenu_page( $slug, esc_attr__( 'Account Settings', 'jetpack' ), __( 'Account Settings', 'jetpack' ), 'read', 'https://wordpress.com/me/account' );
325 }
326
327 /**
328 * Adds Tools menu.
329 */
330 public function add_tools_menu() {
331 $submenus_to_update = array();
332 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'import.php' ) ) {
333 $submenus_to_update['import.php'] = 'https://wordpress.com/import/' . $this->domain;
334 }
335 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'export.php' ) ) {
336 $submenus_to_update['export.php'] = 'https://wordpress.com/export/' . $this->domain;
337 }
338 $this->update_submenus( 'tools.php', $submenus_to_update );
339
340 $this->hide_submenu_page( 'tools.php', 'tools.php' );
341 $this->hide_submenu_page( 'tools.php', 'delete-blog' );
342
343 add_submenu_page( 'tools.php', esc_attr__( 'Marketing', 'jetpack' ), __( 'Marketing', 'jetpack' ), 'publish_posts', 'https://wordpress.com/marketing/tools/' . $this->domain, null, 0 );
344 add_submenu_page( 'tools.php', esc_attr__( 'Earn', 'jetpack' ), __( 'Earn', 'jetpack' ), 'manage_options', 'https://wordpress.com/earn/' . $this->domain, null, 1 );
345 }
346
347 /**
348 * Adds Settings menu.
349 */
350 public function add_options_menu() {
351 $submenus_to_update = array();
352
353 $this->hide_submenu_page( 'options-general.php', 'sharing' );
354
355 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'options-general.php' ) ) {
356 $submenus_to_update['options-general.php'] = 'https://wordpress.com/settings/general/' . $this->domain;
357 }
358
359 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'options-writing.php' ) ) {
360 $submenus_to_update['options-writing.php'] = 'https://wordpress.com/settings/writing/' . $this->domain;
361 }
362
363 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'options-reading.php' )
364 ) {
365 $submenus_to_update['options-reading.php'] = 'https://wordpress.com/settings/reading/' . $this->domain;
366 }
367
368 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'options-discussion.php' ) ) {
369 $submenus_to_update['options-discussion.php'] = 'https://wordpress.com/settings/discussion/' . $this->domain;
370 }
371
372 $this->update_submenus( 'options-general.php', $submenus_to_update );
373
374 add_submenu_page( 'options-general.php', esc_attr__( 'Newsletter', 'jetpack' ), __( 'Newsletter', 'jetpack' ), 'manage_options', 'https://wordpress.com/settings/newsletter/' . $this->domain, null, 7 );
375 add_submenu_page( 'options-general.php', esc_attr__( 'Podcasting', 'jetpack' ), __( 'Podcasting', 'jetpack' ), 'manage_options', 'https://wordpress.com/settings/podcasting/' . $this->domain, null, 8 );
376 add_submenu_page( 'options-general.php', esc_attr__( 'Performance', 'jetpack' ), __( 'Performance', 'jetpack' ), 'manage_options', 'https://wordpress.com/settings/performance/' . $this->domain, null, 9 );
377 }
378
379 /**
380 * Adds Jetpack menu.
381 */
382 public function add_jetpack_menu() {
383 $this->add_admin_menu_separator( 50, 'manage_options' );
384
385 $icon = ( new Logo() )->get_base64_logo();
386 $is_menu_updated = $this->update_menu( 'jetpack', null, null, null, $icon, 51 );
387 if ( ! $is_menu_updated ) {
388 add_menu_page( esc_attr__( 'Jetpack', 'jetpack' ), __( 'Jetpack', 'jetpack' ), 'manage_options', 'jetpack', null, $icon, 51 );
389 }
390
391 add_submenu_page( 'jetpack', esc_attr__( 'Activity Log', 'jetpack' ), __( 'Activity Log', 'jetpack' ), 'manage_options', 'https://wordpress.com/activity-log/' . $this->domain, null, 2 );
392 add_submenu_page( 'jetpack', esc_attr__( 'Backup', 'jetpack' ), __( 'Backup', 'jetpack' ), 'manage_options', 'https://wordpress.com/backup/' . $this->domain, null, 3 );
393
394 $this->hide_submenu_page( 'jetpack', 'jetpack#/settings' );
395 $this->hide_submenu_page( 'jetpack', 'stats' );
396 $this->hide_submenu_page( 'jetpack', esc_url( Redirect::get_url( 'calypso-backups' ) ) );
397 $this->hide_submenu_page( 'jetpack', esc_url( Redirect::get_url( 'calypso-scanner' ) ) );
398
399 if ( ! $is_menu_updated ) {
400 // Remove the submenu auto-created by Core just to be sure that there no issues on non-admin roles.
401 remove_submenu_page( 'jetpack', 'jetpack' );
402 }
403 }
404
405 /**
406 * Add the calypso /woocommerce-installation/ menu item.
407 *
408 * @param array $current_plan The site's plan if they have one. This is passed from WPcom_Admin_Menu to prevent
409 * redundant database queries.
410 */
411 public function add_woocommerce_installation_menu( $current_plan = null ) {
412 /**
413 * Whether to show the WordPress.com WooCommerce Installation menu.
414 *
415 * @use add_filter( 'jetpack_show_wpcom_woocommerce_installation_menu', '__return_true' );
416 * @module masterbar
417 * @since 10.3.0
418 * @param bool $jetpack_show_wpcom_woocommerce_installation_menu Load the WordPress.com WooCommerce Installation menu item. Default to false.
419 * @param array $current_plan Data about the current site's plan.
420 */
421 if ( apply_filters( 'jetpack_show_wpcom_woocommerce_installation_menu', false, $current_plan ) ) {
422 $this->add_admin_menu_separator( 54, 'activate_plugins' );
423
424 $icon_url = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGZpbGw9IiNhMmFhYjIiIGQ9Ik02MTIuMTkyIDQyNi4zMzZjMC02Ljg5Ni0zLjEzNi01MS42LTI4LTUxLjYtMzcuMzYgMC00Ni43MDQgNzIuMjU2LTQ2LjcwNCA4Mi42MjQgMCAzLjQwOCAzLjE1MiA1OC40OTYgMjguMDMyIDU4LjQ5NiAzNC4xOTItLjAzMiA0Ni42NzItNzIuMjg4IDQ2LjY3Mi04OS41MnptMjAyLjE5MiAwYzAtNi44OTYtMy4xNTItNTEuNi0yOC4wMzItNTEuNi0zNy4yOCAwLTQ2LjYwOCA3Mi4yNTYtNDYuNjA4IDgyLjYyNCAwIDMuNDA4IDMuMDcyIDU4LjQ5NiAyNy45NTIgNTguNDk2IDM0LjE5Mi0uMDMyIDQ2LjY4OC03Mi4yODggNDYuNjg4LTg5LjUyek0xNDEuMjk2Ljc2OGMtNjguMjI0IDAtMTIzLjUwNCA1NS40ODgtMTIzLjUwNCAxMjMuOTJ2NjUwLjcyYzAgNjguNDMyIDU1LjI5NiAxMjMuOTIgMTIzLjUwNCAxMjMuOTJoMzM5LjgwOGwxMjMuNTA0IDEyMy45MzZWODk5LjMyOGgyNzguMDQ4YzY4LjIyNCAwIDEyMy41Mi01NS40NzIgMTIzLjUyLTEyMy45MnYtNjUwLjcyYzAtNjguNDMyLTU1LjI5Ni0xMjMuOTItMTIzLjUyLTEyMy45MmgtNzQxLjM2em01MjYuODY0IDQyMi4xNmMwIDU1LjA4OC0zMS4wODggMTU0Ljg4LTEwMi42NCAxNTQuODgtNi4yMDggMC0xOC40OTYtMy42MTYtMjUuNDI0LTYuMDE2LTMyLjUxMi0xMS4xNjgtNTAuMTkyLTQ5LjY5Ni01Mi4zNTItNjYuMjU2IDAgMC0zLjA3Mi0xNy43OTItMy4wNzItNDAuNzUyIDAtMjIuOTkyIDMuMDcyLTQ1LjMyOCAzLjA3Mi00NS4zMjggMTUuNTUyLTc1LjcyOCA0My41NTItMTA2LjczNiA5Ni40NDgtMTA2LjczNiA1OS4wNzItLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4ek00ODYuNDk2IDMwMi40YzAgMy4zOTItNDMuNTUyIDE0MS4xNjgtNDMuNTUyIDIxMy40MjR2NzUuNzEyYy0yLjU5MiAxMi4wOC00LjE2IDI0LjE0NC0yMS44MjQgMjQuMTQ0LTQ2LjYwOCAwLTg4Ljg4LTE1MS40NzItOTIuMDE2LTE2MS44NC02LjIwOCA2Ljg5Ni02Mi4yNCAxNjEuODQtOTYuNDQ4IDE2MS44NC0yNC44NjQgMC00My41NTItMTEzLjY0OC00Ni42MDgtMTIzLjkzNkMxNzYuNzA0IDQzNi42NzIgMTYwIDMzNC4yMjQgMTYwIDMyNy4zMjhjMC0yMC42NzIgMS4xNTItMzguNzM2IDI2LjA0OC0zOC43MzYgNi4yMDggMCAyMS42IDYuMDY0IDIzLjcxMiAxNy4xNjggMTEuNjQ4IDYyLjAzMiAxNi42ODggMTIwLjUxMiAyOS4xNjggMTg1Ljk2OCAxLjg1NiAyLjkyOCAxLjUwNCA3LjAwOCA0LjU2IDEwLjQzMiAzLjE1Mi0xMC4yODggNjYuOTI4LTE2OC43ODQgOTQuOTYtMTY4Ljc4NCAyMi41NDQgMCAzMC40IDQ0LjU5MiAzMy41MzYgNjEuODI0IDYuMjA4IDIwLjY1NiAxMy4wODggNTUuMjE2IDIyLjQxNiA4Mi43NTIgMC0xMy43NzYgMTIuNDgtMjAzLjEyIDY1LjM5Mi0yMDMuMTIgMTguNTkyLjAzMiAyNi43MDQgNi45MjggMjYuNzA0IDI3LjU2OHpNODcwLjMyIDQyMi45MjhjMCA1NS4wODgtMzEuMDg4IDE1NC44OC0xMDIuNjQgMTU0Ljg4LTYuMTkyIDAtMTguNDQ4LTMuNjE2LTI1LjQyNC02LjAxNi0zMi40MzItMTEuMTY4LTUwLjE3Ni00OS42OTYtNTIuMjg4LTY2LjI1NiAwIDAtMy44ODgtMTcuOTItMy44ODgtNDAuODk2czMuODg4LTQ1LjE4NCAzLjg4OC00NS4xODRjMTUuNTUyLTc1LjcyOCA0My40ODgtMTA2LjczNiA5Ni4zODQtMTA2LjczNiA1OS4xMDQtLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4eiIvPjwvc3ZnPg==';
425 $menu_url = 'https://wordpress.com/woocommerce-installation/' . $this->domain;
426
427 // Only show the menu if the user has the capability to activate_plugins.
428 add_menu_page( esc_attr__( 'WooCommerce', 'jetpack' ), esc_attr__( 'WooCommerce', 'jetpack' ), 'activate_plugins', $menu_url, null, $icon_url, 55 );
429 }
430 }
431
432 /**
433 * AJAX handler for retrieving the upsell nudge.
434 */
435 public function wp_ajax_upsell_nudge_jitm() {
436 check_ajax_referer( 'upsell_nudge_jitm' );
437
438 $nudge = $this->get_upsell_nudge();
439 if ( ! $nudge ) {
440 wp_die();
441 }
442
443 $link = $nudge['link'];
444 if ( substr( $link, 0, 1 ) === '/' ) {
445 $link = 'https://wordpress.com' . $link;
446 }
447 ?>
448 <li class="wp-not-current-submenu menu-top menu-icon-generic toplevel_page_site-notices" id="toplevel_page_site-notices">
449 <a href="<?php echo esc_url( $link ); ?>" class="wp-not-current-submenu menu-top menu-icon-generic toplevel_page_site-notices">
450 <div class="wp-menu-arrow">
451 <div></div>
452 </div>
453 <div class="wp-menu-image dashicons-before dashicons-admin-generic" aria-hidden="true"><br></div>
454 <div class="wp-menu-name">
455 <div class="upsell_banner">
456 <div class="banner__info">
457 <div class="banner__title">
458 <?php echo wp_kses( $nudge['content'], array() ); ?>
459 </div>
460 </div>
461 <div class="banner__action">
462 <button type="button" class="button">
463 <?php echo wp_kses( $nudge['cta'], array() ); ?>
464 </button>
465 </div>
466 <?php if ( $nudge['dismissible'] ) : ?>
467 <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>
468 <?php endif; ?>
469 </div>
470 </div>
471 </a>
472 </li>
473 <?php
474 wp_die();
475 }
476
477 /**
478 * Returns the first available upsell nudge.
479 * Needs to be implemented separately for each child menu class.
480 * Empty by default.
481 *
482 * @return array
483 */
484 public function get_upsell_nudge() {
485 return array();
486 }
487 }
488