Completed
Push — fix/customizer_url ( 485226...6059c7 )
by
unknown
40:58 queued 31:10
created

WPcom_Admin_Menu::add_appearance_menu()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
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\Status;
11
12
/**
13
 * Class WPcom_Admin_Menu.
14
 */
15
class WPcom_Admin_Menu extends Admin_Menu {
16
17
	/**
18
	 * Sets up class properties for REST API requests.
19
	 */
20
	public function rest_api_init() {
21
		parent::rest_api_init();
22
23
		// Get domain for requested site.
24
		$this->domain          = ( new Status() )->get_site_suffix();
25
		$this->$customize_slug = 'https://wordpress.com/customize/' . $this->domain;
0 ignored issues
show
Bug introduced by
The variable $customize_slug does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
26
	}
27
28
	/**
29
	 * Create the desired menu output.
30
	 */
31 View Code Duplication
	public function reregister_menu_items() {
32
		parent::reregister_menu_items();
33
34
		// Not needed outside of wp-admin.
35
		if ( ! $this->is_api_request ) {
36
			$this->add_browse_sites_link();
37
			$this->add_site_card_menu();
38
			$this->add_new_site_link();
39
		}
40
41
		$this->add_jetpack_menu();
42
43
		ksort( $GLOBALS['menu'] );
44
	}
45
46
	/**
47
	 * Adds the site switcher link if user has more than one site.
48
	 */
49
	public function add_browse_sites_link() {
50
		if ( count( get_blogs_of_user( get_current_user_id() ) ) < 2 ) {
51
			return;
52
		}
53
54
		// Add the menu item.
55
		add_menu_page( __( 'site-switcher', 'jetpack' ), __( 'Browse sites', 'jetpack' ), 'read', 'https://wordpress.com/home', null, 'dashicons-arrow-left-alt2', 0 );
56
		add_filter( 'add_menu_classes', array( $this, 'set_browse_sites_link_class' ) );
57
	}
58
59
	/**
60
	 * Adds a custom element class for Site Switcher menu item.
61
	 *
62
	 * @param array $menu Associative array of administration menu items.
63
	 * @return array
64
	 */
65 View Code Duplication
	public function set_browse_sites_link_class( array $menu ) {
66
		foreach ( $menu as $key => $menu_item ) {
67
			if ( 'site-switcher' !== $menu_item[3] ) {
68
				continue;
69
			}
70
71
			$menu[ $key ][4] = add_cssclass( 'site-switcher', $menu_item[4] );
72
			break;
73
		}
74
75
		return $menu;
76
	}
77
78
	/**
79
	 * Adds a link to the menu to create a new site.
80
	 */
81
	public function add_new_site_link() {
82
		global $menu;
83
84
		if ( count( get_blogs_of_user( get_current_user_id() ) ) > 1 ) {
85
			return;
86
		}
87
88
		// Attempt to get last position.
89
		$position = 1000;
90
		while ( isset( $menu[ $position ] ) ) {
91
			$position++;
92
		}
93
94
		$this->add_admin_menu_separator( ++$position );
95
		add_menu_page( __( 'Add new site', 'jetpack' ), __( 'Add new site', 'jetpack' ), 'read', 'https://wordpress.com/start?ref=calypso-sidebar', null, 'dashicons-plus-alt', ++$position );
96
	}
97
98
	/**
99
	 * Adds site card component.
100
	 */
101
	public function add_site_card_menu() {
102
		$default = 'data:image/svg+xml,' . rawurlencode( '<svg class="gridicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>Globe</title><rect fill-opacity="0" x="0" width="24" height="24"/><g><path fill="#fff" d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm0 18l2-2 1-1v-2h-2v-1l-1-1H9v3l2 2v1.93c-3.94-.494-7-3.858-7-7.93l1 1h2v-2h2l3-3V6h-2L9 5v-.41C9.927 4.21 10.94 4 12 4s2.073.212 3 .59V6l-1 1v2l1 1 3.13-3.13c.752.897 1.304 1.964 1.606 3.13H18l-2 2v2l1 1h2l.286.286C18.03 18.06 15.24 20 12 20z"/></g></svg>' );
103
		$icon    = get_site_icon_url( 32, $default );
104
105
		if ( $default === $icon && blavatar_exists( $this->domain ) ) {
106
			$icon = blavatar_url( $this->domain, 'img', 32 );
107
		}
108
109
		$badge = '';
110
		if ( is_private_blog() ) {
111
			$badge .= sprintf(
112
				'<span class="site__badge site__badge-private">%s</span>',
113
				wpcom_is_coming_soon() ? esc_html__( 'Coming Soon', 'jetpack' ) : esc_html__( 'Private', 'jetpack' )
114
			);
115
		}
116
117
		if ( is_redirected_domain( $this->domain ) ) {
118
			$badge .= '<span class="site__badge site__badge-redirect">' . esc_html__( 'Redirect', 'jetpack' ) . '</span>';
119
		}
120
121
		if ( ! empty( get_option( 'options' )['is_domain_only'] ) ) {
122
			$badge .= '<span class="site__badge site__badge-domain-only">' . esc_html__( 'Domain', 'jetpack' ) . '</span>';
123
		}
124
125
		$site_card = '
126
<div class="site__info">
127
	<div class="site__title">%1$s</div>
128
	<div class="site__domain">%2$s</div>
129
	%3$s
130
</div>';
131
132
		$site_card = sprintf(
133
			$site_card,
134
			get_option( 'blogname' ),
135
			$this->domain,
136
			$badge
137
		);
138
139
		add_menu_page( 'site-card', $site_card, 'read', get_home_url(), null, $icon, 1 );
140
		add_filter( 'add_menu_classes', array( $this, 'set_site_card_menu_class' ) );
141
	}
142
143
	/**
144
	 * Adds a custom element class and id for Site Card's menu item.
145
	 *
146
	 * @param array $menu Associative array of administration menu items.
147
	 * @return array
148
	 */
149
	public function set_site_card_menu_class( array $menu ) {
150
		foreach ( $menu as $key => $menu_item ) {
151
			if ( 'site-card' !== $menu_item[3] ) {
152
				continue;
153
			}
154
155
			$classes = ' toplevel_page_site-card';
156
			if ( blavatar_exists( $this->domain ) ) {
157
				$classes .= ' has-site-icon';
158
			}
159
160
			$menu[ $key ][4] = $menu_item[4] . $classes;
161
			$menu[ $key ][5] = 'toplevel_page_site_card';
162
			break;
163
		}
164
165
		return $menu;
166
	}
167
168
	/**
169
	 * Adds Stats menu.
170
	 */
171
	public function add_stats_menu() {
172
		$menu_title = __( 'Stats', 'jetpack' );
173
174
		if ( ! $this->is_api_request ) {
175
			$menu_title .= sprintf(
176
				'<img class="sidebar-unified__sparkline" width="80" height="20" src="%1$s" alt="%2$s">',
177
				esc_url( site_url( 'wp-includes/charts/admin-bar-hours-scale-2x.php?masterbar=1&s=' . get_current_blog_id() ) ),
178
				esc_attr__( 'Hourly views', 'jetpack' )
179
			);
180
		}
181
182
		add_menu_page( __( 'Stats', 'jetpack' ), $menu_title, 'edit_posts', 'https://wordpress.com/stats/day/' . $this->domain, null, 'dashicons-chart-bar', 3 );
183
	}
184
185
	/**
186
	 * Adds Upgrades menu.
187
	 */
188
	public function add_upgrades_menu() {
189
		parent::add_upgrades_menu();
190
191
		add_submenu_page( 'https://wordpress.com/plans/' . $this->domain, __( 'Domains', 'jetpack' ), __( 'Domains', 'jetpack' ), 'manage_options', 'https://wordpress.com/domains/manage/' . $this->domain, null, 10 );
192
	}
193
194
	/**
195
	 * Adds Jetpack menu.
196
	 */
197 View Code Duplication
	public function add_jetpack_menu() {
198
		global $menu;
199
200
		$position = 50;
201
		while ( isset( $menu[ $position ] ) ) {
202
			$position++;
203
		}
204
205
		// TODO: Replace with proper SVG data url.
206
		$jetpack_icon = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 32 32' %3E%3Cpath fill='%23a0a5aa' d='M16,0C7.2,0,0,7.2,0,16s7.2,16,16,16s16-7.2,16-16S24.8,0,16,0z'%3E%3C/path%3E%3Cpolygon fill='%23fff' points='15,19 7,19 15,3 '%3E%3C/polygon%3E%3Cpolygon fill='%23fff' points='17,29 17,13 25,13 '%3E%3C/polygon%3E%3C/svg%3E";
207
		$jetpack_slug = 'https://wordpress.com/activity-log/' . $this->domain;
208
209
		$this->add_admin_menu_separator( $position++, 'manage_options' );
210
		add_menu_page( esc_attr__( 'Jetpack', 'jetpack' ), __( 'Jetpack', 'jetpack' ), 'manage_options', $jetpack_slug, null, $jetpack_icon, $position );
211
212
		// Maintain id for jQuery selector.
213
		$menu[ $position ][5] = 'toplevel_page_jetpack'; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
214
215
		remove_menu_page( 'jetpack' );
216
		$this->migrate_submenus( 'jetpack', $jetpack_slug );
217
218
		add_submenu_page( $jetpack_slug, esc_attr__( 'Activity Log', 'jetpack' ), __( 'Activity Log', 'jetpack' ), 'manage_options', $jetpack_slug, null, 5 );
219
		add_submenu_page( $jetpack_slug, esc_attr__( 'Backup', 'jetpack' ), __( 'Backup', 'jetpack' ), 'manage_options', 'https://wordpress.com/backup/' . $this->domain, null, 10 );
220
221
		add_filter(
222
			'parent_file',
223
			function ( $parent_file ) use ( $jetpack_slug ) {
224
				return 'jetpack' === $parent_file ? $jetpack_slug : $parent_file;
225
			}
226
		);
227
	}
228
229
	/**
230
	 * Adds Plugins menu.
231
	 */
232
	public function add_plugins_menu() {
233
		parent::add_plugins_menu();
234
235
		$menu_slug = 'https://wordpress.com/plugins/' . $this->domain;
236
237
		remove_menu_page( 'plugins.php' );
238
		remove_submenu_page( 'plugins.php', 'plugins.php' );
239
240
		$count = '';
241
		if ( ! is_multisite() && current_user_can( 'update_plugins' ) ) {
242
			$update_data = wp_get_update_data();
243
			$count       = sprintf(
244
				'<span class="update-plugins count-%s"><span class="plugin-count">%s</span></span>',
245
				$update_data['counts']['plugins'],
246
				number_format_i18n( $update_data['counts']['plugins'] )
247
			);
248
		}
249
250
		/* translators: %s: Number of pending plugin updates. */
251
		add_menu_page( esc_attr__( 'Plugins', 'jetpack' ), sprintf( __( 'Plugins %s', 'jetpack' ), $count ), 'activate_plugins', $menu_slug, null, 'dashicons-admin-plugins', 65 );
252
253
		$this->migrate_submenus( 'plugins.php', $menu_slug );
254
		add_filter(
255
			'parent_file',
256
			function ( $parent_file ) use ( $menu_slug ) {
257
				return 'jetpack' === $parent_file ? $menu_slug : $parent_file;
258
			}
259
		);
260
	}
261
262
	/**
263
	 * Adds Users menu.
264
	 *
265
	 * @param bool $wp_admin Optional. Whether links should point to Calypso or wp-admin. Default false (Calypso).
266
	 */
267
	public function add_users_menu( $wp_admin = false ) {
268
		$users_slug   = $wp_admin ? 'users.php' : 'https://wordpress.com/people/team/' . $this->domain;
269
		$add_new_slug = 'https://wordpress.com/people/new/' . $this->domain;
270
		$profile_slug = $wp_admin ? 'grofiles-editor' : 'https://wordpress.com/me';
271
		$account_slug = $wp_admin ? 'grofiles-user-settings' : 'https://wordpress.com/me/account';
272
273
		if ( current_user_can( 'list_users' ) ) {
274
			remove_menu_page( 'users.php' );
275
			remove_submenu_page( 'users.php', 'users.php' );
276
			remove_submenu_page( 'users.php', 'user-new.php' );
277
			remove_submenu_page( 'users.php', 'profile.php' );
278
			remove_submenu_page( 'users.php', 'grofiles-editor' );
279
			remove_submenu_page( 'users.php', 'grofiles-user-settings' );
280
281
			add_menu_page( esc_attr__( 'Users', 'jetpack' ), __( 'Users', 'jetpack' ), 'list_users', $users_slug, null, 'dashicons-admin-users', 70 );
282
			add_submenu_page( $users_slug, esc_attr__( 'All People', 'jetpack' ), __( 'All People', 'jetpack' ), 'list_users', $users_slug, null, 5 );
283
			add_submenu_page( $users_slug, esc_attr__( 'Add New', 'jetpack' ), __( 'Add New', 'jetpack' ), 'promote_users', $add_new_slug, null, 10 );
284
			add_submenu_page( $users_slug, esc_attr__( 'My Profile', 'jetpack' ), __( 'My Profile', 'jetpack' ), 'read', $profile_slug, null, 15 );
285
			add_submenu_page( $users_slug, esc_attr__( 'Account Settings', 'jetpack' ), __( 'Account Settings', 'jetpack' ), 'read', $account_slug, null, 20 );
286
287
			$this->migrate_submenus( 'users.php', $users_slug );
288
			add_filter(
289
				'parent_file',
290
				function ( $parent_file ) use ( $users_slug ) {
291
					return 'users.php' === $parent_file ? $users_slug : $parent_file;
292
				}
293
			);
294
		} elseif ( ! $wp_admin ) {
295
			remove_menu_page( 'profile.php' );
296
			remove_submenu_page( 'profile.php', 'grofiles-editor' );
297
			remove_submenu_page( 'profile.php', 'grofiles-user-settings' );
298
299
			add_menu_page( esc_attr__( 'My Profile', 'jetpack' ), __( 'My Profile', 'jetpack' ), 'read', $profile_slug, null, 'dashicons-admin-users', 70 );
300
			add_submenu_page( $profile_slug, esc_attr__( 'Account Settings', 'jetpack' ), __( 'Account Settings', 'jetpack' ), 'read', $account_slug, null, 5 );
301
302
			$this->migrate_submenus( 'profile.php', $profile_slug );
303
			add_filter(
304
				'parent_file',
305
				function ( $parent_file ) use ( $profile_slug ) {
306
					return 'profile.php' === $parent_file ? $profile_slug : $parent_file;
307
				}
308
			);
309
		}
310
	}
311
312
	/**
313
	 * Adds Tools menu.
314
	 *
315
	 * @param bool $wp_admin Optional. Whether links should point to Calypso or wp-admin. Default false (Calypso).
316
	 */
317
	public function add_tools_menu( $wp_admin = false ) {
318
		$menu_slug = $wp_admin ? 'tools.php' : 'https://wordpress.com/marketing/tools/' . $this->domain;
319
320
		remove_submenu_page( 'tools.php', 'export.php' );
321
322
		add_submenu_page( $menu_slug, esc_attr__( 'Marketing', 'jetpack' ), __( 'Marketing', 'jetpack' ), 'manage_options', 'https://wordpress.com/marketing/tools/' . $this->domain, null, 5 );
323
		add_submenu_page( $menu_slug, esc_attr__( 'Earn', 'jetpack' ), __( 'Earn', 'jetpack' ), 'manage_options', 'https://wordpress.com/earn/' . $this->domain, null, 10 );
324
		add_submenu_page( $menu_slug, esc_attr__( 'Export', 'jetpack' ), __( 'Export', 'jetpack' ), 'export', 'https://wordpress.com/export/' . $this->domain, null, 20 );
325
326
		parent::add_tools_menu( $wp_admin );
327
	}
328
329
	/**
330
	 * Adds Settings menu.
331
	 *
332
	 * @param bool $wp_admin Optional. Whether links should point to Calypso or wp-admin. Default false (Calypso).
333
	 */
334
	public function add_options_menu( $wp_admin = false ) {
335
		add_options_page( esc_attr__( 'Hosting Configuration', 'jetpack' ), __( 'Hosting Configuration', 'jetpack' ), 'manage_options', 'https://wordpress.com/hosting-config/' . $this->domain, null, 6 );
336
337
		// Replace sharing menu if it exists. See Publicize_UI::sharing_menu.
338
		if ( remove_submenu_page( 'options-general.php', 'sharing' ) ) {
339
			add_options_page( esc_attr__( 'Sharing Settings', 'jetpack' ), __( 'Sharing', 'jetpack' ), 'publish_posts', 'https://wordpress.com/marketing/sharing-buttons/' . $this->domain, null, 30 );
340
		}
341
342
		parent::add_options_menu( $wp_admin );
343
	}
344
345
	/**
346
	 * Whether to use wp-admin pages rather than Calypso.
347
	 *
348
	 * @return bool
349
	 */
350
	public function should_link_to_wp_admin() {
351
		$result = false; // Calypso.
352
353
		$user_attribute = get_user_attribute( get_current_user_id(), 'calypso_preferences' );
354
		if ( ! empty( $user_attribute['linkDestination'] ) ) {
355
			$result = $user_attribute['linkDestination'];
356
		}
357
358
		return $result;
359
	}
360
}
361