PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 6.2
Jetpack – WP Security, Backup, Speed, & Growth v6.2
16.2-beta 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 All 501 releases
jetpack / modules / masterbar / masterbar.php

masterbar.php in Jetpack – WP Security, Backup, Speed, & Growth 6.2, at modules/masterbar/masterbar.php

1,027 lines 30.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 require_once dirname( __FILE__ ) . '/rtl-admin-bar.php';
4
5 class A8C_WPCOM_Masterbar {
6 /**
7 * Use for testing changes made to remotely enqueued scripts and styles on your sandbox.
8 * If not set it will default to loading the ones from WordPress.com.
9 *
10 * @var string $sandbox_url
11 */
12 private $sandbox_url = '';
13
14 private $locale;
15
16 private $user_id;
17 private $user_data;
18 private $user_login;
19 private $user_email;
20 private $display_name;
21 private $primary_site_slug;
22 private $user_text_direction;
23 private $user_site_count;
24
25 function __construct() {
26 $this->locale = $this->get_locale();
27 $this->user_id = get_current_user_id();
28
29 // Limit the masterbar to be shown only to connected Jetpack users.
30 if ( ! Jetpack::is_user_connected( $this->user_id ) ) {
31 return;
32 }
33
34 Jetpack::dns_prefetch( array(
35 '//s0.wp.com',
36 '//s1.wp.com',
37 '//s2.wp.com',
38 '//0.gravatar.com',
39 '//1.gravatar.com',
40 '//2.gravatar.com',
41 ) );
42
43 // Atomic only
44 if ( jetpack_is_atomic_site() ) {
45 // override user setting that hides masterbar from site's front.
46 // https://github.com/Automattic/jetpack/issues/7667
47 add_filter( 'show_admin_bar', '__return_true' );
48 }
49
50 $this->user_data = Jetpack::get_connected_user_data( $this->user_id );
51 $this->user_login = $this->user_data['login'];
52 $this->user_email = $this->user_data['email'];
53 $this->display_name = $this->user_data['display_name'];
54 $this->user_site_count = $this->user_data['site_count'];
55
56 // Used to build menu links that point directly to Calypso.
57 $this->primary_site_slug = Jetpack::build_raw_urls( get_home_url() );
58
59 // Used for display purposes and for building WP Admin links.
60 $this->primary_site_url = str_replace( '::', '/', $this->primary_site_slug );
61
62 // We need to use user's setting here, instead of relying on current blog's text direction
63 $this->user_text_direction = $this->user_data['text_direction'];
64
65 if ( $this->is_rtl() ) {
66 // Extend core WP_Admin_Bar class in order to add rtl styles
67 add_filter( 'wp_admin_bar_class', array( $this, 'get_rtl_admin_bar_class' ) );
68 }
69 add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );
70
71 add_action( 'wp_before_admin_bar_render', array( $this, 'replace_core_masterbar' ), 99999 );
72
73 add_action( 'wp_enqueue_scripts', array( $this, 'add_styles_and_scripts' ) );
74 add_action( 'admin_enqueue_scripts', array( $this, 'add_styles_and_scripts' ) );
75
76 add_action( 'wp_enqueue_scripts', array( $this, 'remove_core_styles' ) );
77 add_action( 'admin_enqueue_scripts', array( $this, 'remove_core_styles' ) );
78
79 if ( Jetpack::is_module_active( 'notes' ) && $this->is_rtl() ) {
80 // Override Notification module to include RTL styles
81 add_action( 'a8c_wpcom_masterbar_enqueue_rtl_notification_styles', '__return_true' );
82 }
83
84 add_action( 'wp_logout', array( $this, 'maybe_logout_user_from_wpcom' ) );
85 }
86
87 public function maybe_logout_user_from_wpcom() {
88 /**
89 * Whether we should sign out from wpcom too when signing out from the masterbar.
90 *
91 * @since 5.9.0
92 *
93 * @param bool $masterbar_should_logout_from_wpcom True by default.
94 */
95 $masterbar_should_logout_from_wpcom = apply_filters( 'jetpack_masterbar_should_logout_from_wpcom', true );
96 if (
97 isset( $_GET['context'] ) &&
98 'masterbar' === $_GET['context'] &&
99 $masterbar_should_logout_from_wpcom
100 ) {
101 do_action( 'wp_masterbar_logout' );
102 }
103 }
104
105 public function get_rtl_admin_bar_class() {
106 return 'RTL_Admin_Bar';
107 }
108
109 /**
110 * Adds CSS classes to admin body tag.
111 *
112 * @since 5.1
113 *
114 * @param string $admin_body_classes CSS classes that will be added.
115 *
116 * @return string
117 */
118 public function admin_body_class( $admin_body_classes ) {
119 return "$admin_body_classes jetpack-masterbar";
120 }
121
122 public function remove_core_styles() {
123 wp_dequeue_style( 'admin-bar' );
124 }
125
126 public function is_rtl() {
127 return $this->user_text_direction === 'rtl' ? true : false;
128 }
129
130 public function add_styles_and_scripts() {
131
132 if ( $this->is_rtl() ) {
133 wp_enqueue_style( 'a8c-wpcom-masterbar-rtl', $this->wpcom_static_url( '/wp-content/mu-plugins/admin-bar/rtl/wpcom-admin-bar-rtl.css' ), array(), JETPACK__VERSION );
134 wp_enqueue_style( 'a8c-wpcom-masterbar-overrides-rtl', $this->wpcom_static_url( '/wp-content/mu-plugins/admin-bar/masterbar-overrides/rtl/masterbar-rtl.css' ), array(), JETPACK__VERSION );
135 } else {
136 wp_enqueue_style( 'a8c-wpcom-masterbar', $this->wpcom_static_url( '/wp-content/mu-plugins/admin-bar/wpcom-admin-bar.css' ), array(), JETPACK__VERSION );
137 wp_enqueue_style( 'a8c-wpcom-masterbar-overrides', $this->wpcom_static_url( '/wp-content/mu-plugins/admin-bar/masterbar-overrides/masterbar.css' ), array(), JETPACK__VERSION );
138 }
139
140 // Local overrides
141 wp_enqueue_style( 'a8c_wpcom_css_override', plugins_url( 'overrides.css', __FILE__ ), array(), JETPACK__VERSION );
142
143 if ( ! Jetpack::is_module_active( 'notes ' ) ) {
144 // Masterbar is relying on some icons from noticons.css
145 wp_enqueue_style( 'noticons', $this->wpcom_static_url( '/i/noticons/noticons.css' ), array(), JETPACK__VERSION . '-' . gmdate( 'oW' ) );
146 }
147
148 wp_enqueue_script(
149 'jetpack-accessible-focus',
150 Jetpack::get_file_url_for_environment( '_inc/build/accessible-focus.min.js', '_inc/accessible-focus.js' ),
151 array(),
152 JETPACK__VERSION
153 );
154 wp_enqueue_script(
155 'a8c_wpcom_masterbar_tracks_events',
156 Jetpack::get_file_url_for_environment(
157 '_inc/build/masterbar/tracks-events.min.js',
158 'modules/masterbar/tracks-events.js'
159 ),
160 array( 'jquery' ),
161 JETPACK__VERSION
162 );
163
164 wp_enqueue_script( 'a8c_wpcom_masterbar_overrides', $this->wpcom_static_url( '/wp-content/mu-plugins/admin-bar/masterbar-overrides/masterbar.js' ), array( 'jquery' ), JETPACK__VERSION );
165 }
166
167 function wpcom_static_url( $file ) {
168 if ( ! empty( $this->sandbox_url ) ) {
169 // For testing undeployed changes to remotely enqueued scripts and styles.
170 return set_url_scheme( $this->sandbox_url . $file, 'https');
171 }
172
173 $i = hexdec( substr( md5( $file ), - 1 ) ) % 2;
174 $url = 'https://s' . $i . '.wp.com' . $file;
175
176 return set_url_scheme( $url, 'https');
177 }
178
179 public function replace_core_masterbar() {
180 global $wp_admin_bar;
181
182 if ( ! is_object( $wp_admin_bar ) ) {
183 return false;
184 }
185
186 $this->clear_core_masterbar( $wp_admin_bar );
187 $this->build_wpcom_masterbar( $wp_admin_bar );
188 }
189
190 // Remove all existing toolbar entries from core Masterbar
191 public function clear_core_masterbar( $wp_admin_bar ) {
192 foreach ( $wp_admin_bar->get_nodes() as $node ) {
193 $wp_admin_bar->remove_node( $node->id );
194 }
195 }
196
197 // Add entries corresponding to WordPress.com Masterbar
198 public function build_wpcom_masterbar( $wp_admin_bar ) {
199 // Menu groups
200 $this->wpcom_adminbar_add_secondary_groups( $wp_admin_bar );
201
202 // Left part
203 $this->add_my_sites_submenu( $wp_admin_bar );
204 $this->add_reader_submenu( $wp_admin_bar );
205
206 // Right part
207 if ( Jetpack::is_module_active( 'notes' ) ) {
208 $this->add_notifications( $wp_admin_bar );
209 }
210
211 $this->add_me_submenu( $wp_admin_bar );
212 $this->add_write_button( $wp_admin_bar );
213 }
214
215 public function get_locale() {
216 $wpcom_locale = get_locale();
217
218 if ( ! class_exists( 'GP_Locales' ) ) {
219 if ( defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) && file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) {
220 require JETPACK__GLOTPRESS_LOCALES_PATH;
221 }
222 }
223
224 if ( class_exists( 'GP_Locales' ) ) {
225 $wpcom_locale_object = GP_Locales::by_field( 'wp_locale', get_locale() );
226 if ( $wpcom_locale_object instanceof GP_Locale ) {
227 $wpcom_locale = $wpcom_locale_object->slug;
228 }
229 }
230
231 return $wpcom_locale;
232 }
233
234 public function add_notifications( $wp_admin_bar ) {
235 $wp_admin_bar->add_node( array(
236 'id' => 'notes',
237 'title' => '<span id="wpnt-notes-unread-count" class="wpnt-loading wpn-read"></span>
238 <span class="screen-reader-text">' . esc_html__( 'Notifications', 'jetpack' ) . '</span>
239 <span class="noticon noticon-bell"></span>',
240 'meta' => array(
241 'html' => '<div id="wpnt-notes-panel2" style="display:none" lang="'. esc_attr( $this->locale ) . '" dir="' . ( $this->is_rtl() ? 'rtl' : 'ltr' ) . '">' .
242 '<div class="wpnt-notes-panel-header">' .
243 '<span class="wpnt-notes-header">' .
244 esc_html__( 'Notifications', 'jetpack' ) .
245 '</span>' .
246 '<span class="wpnt-notes-panel-link">' .
247 '</span>' .
248 '</div>' .
249 '</div>',
250 'class' => 'menupop mb-trackable',
251 ),
252 'parent' => 'top-secondary',
253 ) );
254 }
255
256 public function add_reader_submenu( $wp_admin_bar ) {
257 $wp_admin_bar->add_menu( array(
258 'parent' => 'root-default',
259 'id' => 'newdash',
260 'title' => esc_html__( 'Reader', 'jetpack' ),
261 'href' => '#',
262 'meta' => array(
263 'class' => 'mb-trackable',
264 )
265 ) );
266
267 $wp_admin_bar->add_menu( array(
268 'parent' => 'newdash',
269 'id' => 'streams-header',
270 'title' => esc_html_x(
271 'Streams',
272 'Title for Reader sub-menu that contains followed sites, likes, and recommendations',
273 'jetpack'
274 ),
275 'meta' => array(
276 'class' => 'ab-submenu-header',
277 )
278 ) );
279
280 $following_title = $this->create_menu_item_pair(
281 array(
282 'url' => 'https://wordpress.com/',
283 'id' => 'wp-admin-bar-followed-sites',
284 'label' => esc_html__( 'Followed Sites', 'jetpack' ),
285 ),
286 array(
287 'url' => 'https://wordpress.com/following/edit',
288 'id' => 'wp-admin-bar-reader-followed-sites-manage',
289 'label' => esc_html__( 'Manage', 'jetpack' ),
290 )
291 );
292
293 $wp_admin_bar->add_menu( array(
294 'parent' => 'newdash',
295 'id' => 'following',
296 'title' => $following_title,
297 'meta' => array( 'class' => 'inline-action' )
298 ) );
299
300 $wp_admin_bar->add_menu( array(
301 'parent' => 'newdash',
302 'id' => 'discover-discover',
303 'title' => esc_html__( 'Discover', 'jetpack' ),
304 'href' => 'https://wordpress.com/discover',
305 'meta' => array(
306 'class' => 'mb-icon-spacer',
307 )
308 ) );
309
310 $wp_admin_bar->add_menu( array(
311 'parent' => 'newdash',
312 'id' => 'discover-search',
313 'title' => esc_html__( 'Search', 'jetpack' ),
314 'href' => 'https://wordpress.com/read/search',
315 'meta' => array(
316 'class' => 'mb-icon-spacer',
317 )
318 ) );
319
320 $wp_admin_bar->add_menu( array(
321 'parent' => 'newdash',
322 'id' => 'discover-recommended-blogs',
323 'title' => esc_html__( 'Recommendations', 'jetpack' ),
324 'href' => 'https://wordpress.com/recommendations',
325 'meta' => array(
326 'class' => 'mb-icon-spacer',
327 )
328 ) );
329
330 $wp_admin_bar->add_menu( array(
331 'parent' => 'newdash',
332 'id' => 'my-activity-my-likes',
333 'title' => esc_html__( 'My Likes', 'jetpack' ),
334 'href' => 'https://wordpress.com/activities/likes',
335 'meta' => array(
336 'class' => 'mb-icon-spacer',
337 )
338 ) );
339
340 }
341
342 public function create_menu_item_pair( $primary, $secondary ) {
343 $primary_class = 'ab-item ab-primary mb-icon';
344 $secondary_class = 'ab-secondary';
345
346 $primary_anchor = $this->create_menu_item_anchor( $primary_class, $primary['url'], $primary['label'], $primary['id'] );
347 $secondary_anchor = $this->create_menu_item_anchor( $secondary_class, $secondary['url'], $secondary['label'], $secondary['id'] );
348
349 return $primary_anchor . $secondary_anchor;
350 }
351
352 public function create_menu_item_anchor( $class, $url, $label, $id ) {
353 return '<a href="' . $url . '" class="' . $class . '" id="' . $id . '">' . $label . '</a>';
354 }
355
356 public function wpcom_adminbar_add_secondary_groups( $wp_admin_bar ) {
357 $wp_admin_bar->add_group( array(
358 'id' => 'root-default',
359 'meta' => array(
360 'class' => 'ab-top-menu',
361 ),
362 ) );
363
364 $wp_admin_bar->add_group( array(
365 'parent' => 'blog',
366 'id' => 'blog-secondary',
367 'meta' => array(
368 'class' => 'ab-sub-secondary',
369 ),
370 ) );
371
372 $wp_admin_bar->add_group( array(
373 'id' => 'top-secondary',
374 'meta' => array(
375 'class' => 'ab-top-secondary',
376 ),
377 ) );
378 }
379
380 public function add_me_submenu( $wp_admin_bar ) {
381 $user_id = get_current_user_id();
382 if ( empty( $user_id ) ) {
383 return;
384 }
385
386 $avatar = get_avatar( $this->user_email, 32, 'mm', '', array( 'force_display' => true ) );
387 $class = empty( $avatar ) ? 'mb-trackable' : 'with-avatar mb-trackable';
388
389 // Add the 'Me' menu
390 $wp_admin_bar->add_menu( array(
391 'id' => 'my-account',
392 'parent' => 'top-secondary',
393 'title' => $avatar . '<span class="ab-text">' . esc_html__( 'Me', 'jetpack' ) . '</span>',
394 'href' => '#',
395 'meta' => array(
396 'class' => $class,
397 ),
398 ) );
399
400 $id = 'user-actions';
401 $wp_admin_bar->add_group( array(
402 'parent' => 'my-account',
403 'id' => $id,
404 ) );
405
406 $settings_url = 'https://wordpress.com/me/account';
407
408 $logout_url = wp_logout_url();
409 $logout_url = add_query_arg( 'context', 'masterbar', $logout_url );
410
411 $user_info = get_avatar( $this->user_email, 128, 'mm', '', array( 'force_display' => true ) );
412 $user_info .= '<span class="display-name">' . $this->display_name . '</span>';
413 $user_info .= '<a class="username" href="http://gravatar.com/' . $this->user_login . '">@' . $this->user_login . '</a>';
414
415 $user_info .= sprintf(
416 '<div><a href="%s" class="ab-sign-out">%s</a></div>',
417 $logout_url,
418 esc_html__( 'Sign Out', 'jetpack' )
419 );
420
421 $wp_admin_bar->add_menu( array(
422 'parent' => $id,
423 'id' => 'user-info',
424 'title' => $user_info,
425 'meta' => array(
426 'class' => 'user-info user-info-item',
427 'tabindex' => -1,
428 ),
429 ) );
430
431 $wp_admin_bar->add_menu( array(
432 'parent' => $id,
433 'id' => 'profile-header',
434 'title' => esc_html__( 'Profile', 'jetpack' ),
435 'meta' => array(
436 'class' => 'ab-submenu-header',
437 ),
438 ) );
439
440 $wp_admin_bar->add_menu( array(
441 'parent' => $id,
442 'id' => 'my-profile',
443 'title' => esc_html__( 'My Profile', 'jetpack' ),
444 'href' => 'https://wordpress.com/me',
445 'meta' => array(
446 'class' => 'mb-icon',
447 ),
448 ) );
449
450 $wp_admin_bar->add_menu( array(
451 'parent' => $id,
452 'id' => 'account-settings',
453 'title' => esc_html__( 'Account Settings', 'jetpack' ),
454 'href' => $settings_url,
455 'meta' => array(
456 'class' => 'mb-icon',
457 ),
458 ) );
459
460 $wp_admin_bar->add_menu( array(
461 'parent' => $id,
462 'id' => 'billing',
463 'title' => esc_html__( 'Manage Purchases', 'jetpack' ),
464 'href' => 'https://wordpress.com/me/purchases',
465 'meta' => array(
466 'class' => 'mb-icon',
467 ),
468 ) );
469
470 $wp_admin_bar->add_menu( array(
471 'parent' => $id,
472 'id' => 'security',
473 'title' => esc_html__( 'Security', 'jetpack' ),
474 'href' => 'https://wordpress.com/me/security',
475 'meta' => array(
476 'class' => 'mb-icon',
477 ),
478 ) );
479
480 $wp_admin_bar->add_menu( array(
481 'parent' => $id,
482 'id' => 'notifications',
483 'title' => esc_html__( 'Notifications', 'jetpack' ),
484 'href' => 'https://wordpress.com/me/notifications',
485 'meta' => array(
486 'class' => 'mb-icon',
487 ),
488 ) );
489
490 $wp_admin_bar->add_menu( array(
491 'parent' => $id,
492 'id' => 'special-header',
493 'title' => esc_html_x(
494 'Special',
495 'Title for Me sub-menu that contains Get Apps, Next Steps, and Help options',
496 'jetpack'
497 ),
498 'meta' => array(
499 'class' => 'ab-submenu-header',
500 ),
501 ) );
502
503 $wp_admin_bar->add_menu( array(
504 'parent' => $id,
505 'id' => 'get-apps',
506 'title' => esc_html__( 'Get Apps', 'jetpack' ),
507 'href' => 'https://wordpress.com/me/get-apps',
508 'meta' => array(
509 'class' => 'mb-icon user-info-item',
510 ),
511 ) );
512
513 $help_link = 'https://jetpack.com/support/';
514
515 if ( jetpack_is_atomic_site() ) {
516 $help_link = 'https://wordpress.com/help';
517 }
518
519 $wp_admin_bar->add_menu( array(
520 'parent' => $id,
521 'id' => 'help',
522 'title' => esc_html__( 'Help', 'jetpack' ),
523 'href' => $help_link,
524 'meta' => array(
525 'class' => 'mb-icon user-info-item',
526 ),
527 ) );
528 }
529
530 public function add_write_button( $wp_admin_bar ) {
531 $current_user = wp_get_current_user();
532
533 $posting_blog_id = get_current_blog_id();
534 if ( ! is_user_member_of_blog( get_current_user_id(), get_current_blog_id() ) ) {
535 $posting_blog_id = $current_user->primary_blog;
536 }
537
538 $user_can_post = current_user_can_for_blog( $posting_blog_id, 'publish_posts' );
539
540 if ( ! $posting_blog_id || ! $user_can_post ) {
541 return;
542 }
543
544 $blog_post_page = 'https://wordpress.com/post/' . esc_attr( $this->primary_site_slug );
545
546 $wp_admin_bar->add_menu( array(
547 'parent' => 'top-secondary',
548 'id' => 'ab-new-post',
549 'href' => $blog_post_page,
550 'title' => '<span>' . esc_html__( 'Write', 'jetpack' ) . '</span>',
551 'meta' => array(
552 'class' => 'mb-trackable',
553 )
554 ) );
555 }
556
557 public function add_my_sites_submenu( $wp_admin_bar ) {
558 $current_user = wp_get_current_user();
559
560 $blog_name = get_bloginfo( 'name' );
561 if ( empty( $blog_name ) ) {
562 $blog_name = $this->primary_site_slug;
563 }
564
565 if ( mb_strlen( $blog_name ) > 20 ) {
566 $blog_name = mb_substr( html_entity_decode( $blog_name, ENT_QUOTES ), 0, 20 ) . '&hellip;';
567 }
568
569 $wp_admin_bar->add_menu( array(
570 'parent' => 'root-default',
571 'id' => 'blog',
572 'title' => _n( 'My Site', 'My Sites', $this->user_site_count, 'jetpack' ),
573 'href' => '#',
574 'meta' => array(
575 'class' => 'my-sites mb-trackable',
576 ),
577 ) );
578
579 if ( $this->user_site_count > 1 ) {
580 $wp_admin_bar->add_menu( array(
581 'parent' => 'blog',
582 'id' => 'switch-site',
583 'title' => esc_html__( 'Switch Site', 'jetpack' ),
584 'href' => 'https://wordpress.com/sites',
585 ) );
586 } else {
587 $wp_admin_bar->add_menu( array(
588 'parent' => 'blog',
589 'id' => 'new-site',
590 'title' => esc_html__( '+ Add New WordPress', 'jetpack' ),
591 'href' => 'https://wordpress.com/start?ref=admin-bar-logged-in',
592 ) );
593 }
594
595 if ( is_user_member_of_blog( $current_user->ID ) ) {
596 $blavatar = '';
597 $class = 'current-site';
598
599 if ( has_site_icon() ) {
600 $src = get_site_icon_url();
601 $blavatar = '<img class="avatar" src="'. esc_attr( $src ) . '" alt="Current site avatar">';
602 $class = 'has-blavatar';
603 }
604
605 $blog_info = '<div class="ab-site-icon">' . $blavatar . '</div>';
606 $blog_info .= '<span class="ab-site-title">' . esc_html( $blog_name ) . '</span>';
607 $blog_info .= '<span class="ab-site-description">' . esc_html( $this->primary_site_url ) . '</span>';
608
609 $wp_admin_bar->add_menu( array(
610 'parent' => 'blog',
611 'id' => 'blog-info',
612 'title' => $blog_info,
613 'href' => esc_url( trailingslashit( $this->primary_site_url ) ),
614 'meta' => array(
615 'class' => $class,
616 ),
617 ) );
618 }
619
620 // Site Preview
621 if ( is_admin() ) {
622 $wp_admin_bar->add_menu( array(
623 'parent' => 'blog',
624 'id' => 'site-view',
625 'title' => __( 'View Site', 'jetpack' ),
626 'href' => home_url(),
627 'meta' => array(
628 'class' => 'mb-icon',
629 'target' => '_blank',
630 ),
631 ) );
632 }
633
634 // Stats
635 if ( Jetpack::is_module_active( 'stats' ) ) {
636 $wp_admin_bar->add_menu( array(
637 'parent' => 'blog',
638 'id' => 'blog-stats',
639 'title' => esc_html__( 'Stats', 'jetpack' ),
640 'href' => 'https://wordpress.com/stats/' . esc_attr( $this->primary_site_slug ),
641 'meta' => array(
642 'class' => 'mb-icon',
643 ),
644 ) );
645 }
646
647 // Add Calypso plans link and plan type indicator
648 if ( is_user_member_of_blog( $current_user->ID ) ) {
649 $plans_url = 'https://wordpress.com/plans/' . esc_attr( $this->primary_site_slug );
650 $label = esc_html__( 'Plan', 'jetpack' );
651 $plan = Jetpack::get_active_plan();
652
653 $plan_title = $this->create_menu_item_pair(
654 array(
655 'url' => $plans_url,
656 'id' => 'wp-admin-bar-plan',
657 'label' => $label,
658 ),
659 array(
660 'url' => $plans_url,
661 'id' => 'wp-admin-bar-plan-badge',
662 'label' => $plan['product_name_short']
663 )
664 );
665
666 $wp_admin_bar->add_menu( array(
667 'parent' => 'blog',
668 'id' => 'plan',
669 'title' => $plan_title,
670 'meta' => array(
671 'class' => 'inline-action',
672 ),
673 ) );
674 }
675
676 // Publish group
677 $wp_admin_bar->add_group( array(
678 'parent' => 'blog',
679 'id' => 'publish',
680 ) );
681
682 // Publish header
683 $wp_admin_bar->add_menu( array(
684 'parent' => 'publish',
685 'id' => 'publish-header',
686 'title' => esc_html_x( 'Manage', 'admin bar menu group label', 'jetpack' ),
687 'meta' => array(
688 'class' => 'ab-submenu-header',
689 ),
690 ) );
691
692 // Pages
693 $pages_title = $this->create_menu_item_pair(
694 array(
695 'url' => 'https://wordpress.com/pages/' . esc_attr( $this->primary_site_slug ),
696 'id' => 'wp-admin-bar-edit-page',
697 'label' => esc_html__( 'Site Pages', 'jetpack' ),
698 ),
699 array(
700 'url' => 'https://wordpress.com/page/' . esc_attr( $this->primary_site_slug ),
701 'id' => 'wp-admin-bar-new-page-badge',
702 'label' => esc_html_x( 'Add', 'admin bar menu new item label', 'jetpack' ),
703 )
704 );
705
706 if ( ! current_user_can( 'edit_pages' ) ) {
707 $pages_title = $this->create_menu_item_anchor(
708 'ab-item ab-primary mb-icon',
709 'https://wordpress.com/pages/' . esc_attr( $this->primary_site_slug ),
710 esc_html__( 'Site Pages', 'jetpack' ),
711 'wp-admin-bar-edit-page'
712 );
713 }
714
715 $wp_admin_bar->add_menu( array(
716 'parent' => 'publish',
717 'id' => 'new-page',
718 'title' => $pages_title,
719 'meta' => array(
720 'class' => 'inline-action',
721 ),
722 ) );
723
724 // Blog Posts
725 $posts_title = $this->create_menu_item_pair(
726 array(
727 'url' => 'https://wordpress.com/posts/' . esc_attr( $this->primary_site_slug ),
728 'id' => 'wp-admin-bar-edit-post',
729 'label' => esc_html__( 'Blog Posts', 'jetpack' ),
730 ),
731 array(
732 'url' => 'https://wordpress.com/post/' . esc_attr( $this->primary_site_slug ),
733 'id' => 'wp-admin-bar-new-post-badge',
734 'label' => esc_html_x( 'Add', 'admin bar menu new item label', 'jetpack' ),
735 )
736 );
737
738 if ( ! current_user_can( 'edit_posts' ) ) {
739 $posts_title = $this->create_menu_item_anchor(
740 'ab-item ab-primary mb-icon',
741 'https://wordpress.com/posts/' . esc_attr( $this->primary_site_slug ),
742 esc_html__( 'Blog Posts', 'jetpack' ),
743 'wp-admin-bar-edit-post'
744 );
745 }
746
747 $wp_admin_bar->add_menu( array(
748 'parent' => 'publish',
749 'id' => 'new-post',
750 'title' => $posts_title,
751 'meta' => array(
752 'class' => 'inline-action mb-trackable',
753 ),
754 ) );
755
756 // Comments
757 if ( current_user_can( 'moderate_comments' ) ) {
758 $wp_admin_bar->add_menu( array(
759 'parent' => 'publish',
760 'id' => 'comments',
761 'title' => __( 'Comments' ),
762 'href' => 'https://wordpress.com/comments/' . esc_attr( $this->primary_site_slug ),
763 'meta' => array(
764 'class' => 'mb-icon',
765 ),
766 ) );
767 }
768
769 // Testimonials
770 if ( Jetpack::is_module_active( 'custom-content-types' ) && get_option( 'jetpack_testimonial' ) ) {
771 $testimonials_title = $this->create_menu_item_pair(
772 array(
773 'url' => 'https://wordpress.com/types/jetpack-testimonial/' . esc_attr( $this->primary_site_slug ),
774 'id' => 'wp-admin-bar-edit-testimonial',
775 'label' => esc_html__( 'Testimonials', 'jetpack' ),
776 ),
777 array(
778 'url' => 'https://wordpress.com/edit/jetpack-testimonial/' . esc_attr( $this->primary_site_slug ),
779 'id' => 'wp-admin-bar-new-testimonial',
780 'label' => esc_html_x( 'Add', 'Button label for adding a new item via the toolbar menu', 'jetpack' ),
781 )
782 );
783
784 if ( ! current_user_can( 'edit_pages' ) ) {
785 $testimonials_title = $this->create_menu_item_anchor(
786 'ab-item ab-primary mb-icon',
787 'https://wordpress.com/types/jetpack-testimonial/' . esc_attr( $this->primary_site_slug ),
788 esc_html__( 'Testimonials', 'jetpack' ),
789 'wp-admin-bar-edit-testimonial'
790 );
791 }
792
793 $wp_admin_bar->add_menu( array(
794 'parent' => 'publish',
795 'id' => 'new-jetpack-testimonial',
796 'title' => $testimonials_title,
797 'meta' => array(
798 'class' => 'inline-action',
799 ),
800 ) );
801 }
802
803 // Portfolio
804 if ( Jetpack::is_module_active( 'custom-content-types' ) && get_option( 'jetpack_portfolio' ) ) {
805 $portfolios_title = $this->create_menu_item_pair(
806 array(
807 'url' => 'https://wordpress.com/types/jetpack-portfolio/' . esc_attr( $this->primary_site_slug ),
808 'id' => 'wp-admin-bar-edit-portfolio',
809 'label' => esc_html__( 'Portfolio', 'jetpack' ),
810 ),
811 array(
812 'url' => 'https://wordpress.com/edit/jetpack-portfolio/' . esc_attr( $this->primary_site_slug ),
813 'id' => 'wp-admin-bar-new-portfolio',
814 'label' => esc_html_x( 'Add', 'Button label for adding a new item via the toolbar menu', 'jetpack' ),
815 )
816 );
817
818 if ( ! current_user_can( 'edit_pages' ) ) {
819 $portfolios_title = $this->create_menu_item_anchor(
820 'ab-item ab-primary mb-icon',
821 'https://wordpress.com/types/jetpack-portfolio/' . esc_attr( $this->primary_site_slug ),
822 esc_html__( 'Portfolio', 'jetpack' ),
823 'wp-admin-bar-edit-portfolio'
824 );
825 }
826
827 $wp_admin_bar->add_menu( array(
828 'parent' => 'publish',
829 'id' => 'new-jetpack-portfolio',
830 'title' => $portfolios_title,
831 'meta' => array(
832 'class' => 'inline-action',
833 ),
834 ) );
835 }
836
837 if ( current_user_can( 'edit_theme_options' ) ) {
838 // Look and Feel group
839 $wp_admin_bar->add_group( array(
840 'parent' => 'blog',
841 'id' => 'look-and-feel',
842 ) );
843
844 // Look and Feel header
845 $wp_admin_bar->add_menu( array(
846 'parent' => 'look-and-feel',
847 'id' => 'look-and-feel-header',
848 'title' => esc_html_x( 'Personalize', 'admin bar menu group label', 'jetpack' ),
849 'meta' => array(
850 'class' => 'ab-submenu-header',
851 ),
852 ) );
853
854 if ( is_admin() ) {
855 // In wp-admin the `return` query arg will return to that page after closing the Customizer
856 $customizer_url = add_query_arg( array( 'return' => urlencode( site_url( $_SERVER['REQUEST_URI'] ) ) ), wp_customize_url() );
857 } else {
858 // On the frontend the `url` query arg will load that page in the Customizer and also return to it after closing
859 // non-home URLs won't work unless we undo domain mapping since the Customizer preview is unmapped to always have HTTPS
860 $current_page = '//' . $this->primary_site_slug . $_SERVER['REQUEST_URI'];
861 $customizer_url = add_query_arg( array( 'url' => urlencode( $current_page ) ), wp_customize_url() );
862 }
863
864 $theme_title = $this->create_menu_item_pair(
865 array(
866 'url' => $customizer_url,
867 'id' => 'wp-admin-bar-cmz',
868 'label' => esc_html_x( 'Customize', 'admin bar customize item label', 'jetpack' ),
869 ),
870 array(
871 'url' => 'https://wordpress.com/themes/' . esc_attr( $this->primary_site_slug ),
872 'id' => 'wp-admin-bar-themes',
873 'label' => esc_html__( 'Themes', 'jetpack' ),
874 )
875 );
876 $meta = array( 'class' => 'mb-icon', 'class' => 'inline-action' );
877 $href = false;
878
879 $wp_admin_bar->add_menu( array(
880 'parent' => 'look-and-feel',
881 'id' => 'themes',
882 'title' => $theme_title,
883 'href' => $href,
884 'meta' => $meta
885 ) );
886 }
887
888 if ( current_user_can( 'manage_options' ) ) {
889 // Configuration group
890 $wp_admin_bar->add_group( array(
891 'parent' => 'blog',
892 'id' => 'configuration',
893 ) );
894
895 // Configuration header
896 $wp_admin_bar->add_menu( array(
897 'parent' => 'configuration',
898 'id' => 'configuration-header',
899 'title' => esc_html__( 'Configure', 'admin bar menu group label', 'jetpack' ),
900 'meta' => array(
901 'class' => 'ab-submenu-header',
902 ),
903 ) );
904
905 if ( Jetpack::is_module_active( 'publicize' ) || Jetpack::is_module_active( 'sharedaddy' ) ) {
906 $wp_admin_bar->add_menu( array(
907 'parent' => 'configuration',
908 'id' => 'sharing',
909 'title' => esc_html__( 'Sharing', 'jetpack' ),
910 'href' => 'https://wordpress.com/sharing/' . esc_attr( $this->primary_site_slug ),
911 'meta' => array(
912 'class' => 'mb-icon',
913 ),
914 ) );
915 }
916
917 $people_title = $this->create_menu_item_pair(
918 array(
919 'url' => 'https://wordpress.com/people/team/' . esc_attr( $this->primary_site_slug ),
920 'id' => 'wp-admin-bar-people',
921 'label' => esc_html__( 'People', 'jetpack' ),
922 ),
923 array(
924 'url' => admin_url( 'user-new.php' ),
925 'id' => 'wp-admin-bar-people-add',
926 'label' => esc_html_x( 'Add', 'admin bar people item label', 'jetpack' ),
927 )
928 );
929
930 $wp_admin_bar->add_menu( array(
931 'parent' => 'configuration',
932 'id' => 'users-toolbar',
933 'title' => $people_title,
934 'href' => false,
935 'meta' => array(
936 'class' => 'inline-action',
937 ),
938 ) );
939
940 $plugins_title = $this->create_menu_item_pair(
941 array(
942 'url' => 'https://wordpress.com/plugins/' . esc_attr( $this->primary_site_slug ),
943 'id' => 'wp-admin-bar-plugins',
944 'label' => esc_html__( 'Plugins', 'jetpack' ),
945 ),
946 array(
947 'url' => 'https://wordpress.com/plugins/manage/' . esc_attr( $this->primary_site_slug ),
948 'id' => 'wp-admin-bar-plugins-add',
949 'label' => esc_html_x( 'Manage', 'Label for the button on the Masterbar to manage plugins', 'jetpack' ),
950 )
951 );
952
953 $wp_admin_bar->add_menu( array(
954 'parent' => 'configuration',
955 'id' => 'plugins',
956 'title' => $plugins_title,
957 'href' => false,
958 'meta' => array(
959 'class' => 'inline-action',
960 ),
961 ) );
962
963 if ( jetpack_is_atomic_site() ) {
964 $domain_title = $this->create_menu_item_pair(
965 array(
966 'url' => 'https://wordpress.com/domains/' . esc_attr( $this->primary_site_slug ),
967 'id' => 'wp-admin-bar-domains',
968 'label' => esc_html__( 'Domains', 'jetpack' ),
969 ),
970 array(
971 'url' => 'https://wordpress.com/domains/add/' . esc_attr( $this->primary_site_slug ),
972 'id' => 'wp-admin-bar-domains-add',
973 'label' => esc_html_x( 'Add', 'Label for the button on the Masterbar to add a new domain', 'jetpack' ),
974 )
975 );
976 $wp_admin_bar->add_menu( array(
977 'parent' => 'configuration',
978 'id' => 'domains',
979 'title' => $domain_title,
980 'href' => false,
981 'meta' => array(
982 'class' => 'inline-action',
983 ),
984 ) );
985 }
986
987 $wp_admin_bar->add_menu( array(
988 'parent' => 'configuration',
989 'id' => 'blog-settings',
990 'title' => esc_html__( 'Settings', 'jetpack' ),
991 'href' => 'https://wordpress.com/settings/general/' . esc_attr( $this->primary_site_slug ),
992 'meta' => array(
993 'class' => 'mb-icon',
994 ),
995 ) );
996
997 if ( ! is_admin() ) {
998 $wp_admin_bar->add_menu( array(
999 'parent' => 'configuration',
1000 'id' => 'legacy-dashboard',
1001 'title' => esc_html__( 'Dashboard', 'jetpack' ),
1002 'href' => admin_url(),
1003 'meta' => array(
1004 'class' => 'mb-icon',
1005 ),
1006 ) );
1007 }
1008
1009 // Restore dashboard menu toggle that is needed on mobile views.
1010 if ( is_admin() ) {
1011 $wp_admin_bar->add_menu( array(
1012 'id' => 'menu-toggle',
1013 'title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . esc_html__( 'Menu', 'jetpack' ) . '</span>',
1014 'href' => '#',
1015 ) );
1016 }
1017
1018 /**
1019 * Fires when menu items are added to the masterbar "My Sites" menu.
1020 *
1021 * @since 5.4
1022 */
1023 do_action( 'jetpack_masterbar' );
1024 }
1025 }
1026 }
1027