Completed
Push — fix/customizer_url ( 6059c7...b18ef3 )
by
unknown
85:54 queued 76:11
created

WPcom_Admin_Menu::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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