PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.7
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.7
16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.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 All 506 releases
jetpack / jetpack_vendor / automattic / jetpack-masterbar / src / admin-menu / class-admin-menu.php

class-admin-menu.php in Jetpack – WP Security, Backup, Speed, & Growth 16.3-a.7, at jetpack_vendor/automattic/jetpack-masterbar/src/admin-menu/class-admin-menu.php

232 lines 8.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Admin Menu file.
4 *
5 * @package automattic/jetpack-masterbar
6 */
7
8 namespace Automattic\Jetpack\Masterbar;
9
10 require_once __DIR__ . '/class-base-admin-menu.php';
11
12 /**
13 * Class Admin_Menu.
14 */
15 class Admin_Menu extends Base_Admin_Menu {
16
17 /**
18 * Create the desired menu output.
19 */
20 public function reregister_menu_items() {
21 $this->add_appearance_menu();
22 $this->add_plugins_menu();
23 $this->add_users_menu();
24
25 // Remove Links Manager menu since its usage is discouraged. https://github.com/Automattic/wp-calypso/issues/51188.
26 // @see https://core.trac.wordpress.org/ticket/21307#comment:73.
27 if ( $this->should_disable_links_manager() ) {
28 remove_menu_page( 'link-manager.php' );
29 }
30
31 ksort( $GLOBALS['menu'] );
32 }
33
34 /**
35 * Get the preferred view for the given screen.
36 *
37 * @param string $screen Screen identifier.
38 * @param bool $fallback_global_preference (Optional) Whether the global preference for all screens should be used
39 * as fallback if there is no specific preference for the given screen.
40 * Default: true.
41 * @return string
42 */
43 public function get_preferred_view( $screen, $fallback_global_preference = true ) {
44 $force_default_view = in_array( $screen, array( 'users.php', 'options-general.php' ), true );
45 $use_wp_admin = $this->use_wp_admin_interface();
46
47 // When no preferred view has been set for "Users > All Users" or "Settings > General", keep the previous
48 // behavior that forced the default view regardless of the global preference.
49 // This behavior is overriden by the wpcom_admin_interface option when it is set to wp-admin.
50 if ( ! $use_wp_admin && $fallback_global_preference && $force_default_view ) {
51 $preferred_view = parent::get_preferred_view( $screen, false );
52 if ( self::UNKNOWN_VIEW === $preferred_view ) {
53 return self::DEFAULT_VIEW;
54 }
55 return $preferred_view;
56 }
57
58 return parent::get_preferred_view( $screen, $fallback_global_preference );
59 }
60
61 /**
62 * Check if Links Manager is being used.
63 */
64 public function should_disable_links_manager() {
65 // The max ID number of the auto-generated links.
66 // See /wp-content/mu-plugins/wpcom-wp-install-defaults.php in WP.com.
67 $max_default_id = 10;
68
69 // We are only checking the latest entry link_id so are limiting the query to 1.
70 $link_manager_links = get_bookmarks(
71 array(
72 'orderby' => 'link_id',
73 'order' => 'DESC',
74 'limit' => 1,
75 'hide_invisible' => 0,
76 )
77 );
78
79 // Ordered links by ID descending, check if the first ID is more than $max_default_id.
80 if ( is_countable( $link_manager_links ) && count( $link_manager_links ) > 0 && $link_manager_links[0]->link_id > $max_default_id ) {
81 return false;
82 }
83
84 return true;
85 }
86
87 /**
88 * Adds Appearance menu.
89 *
90 * @return string The Customizer URL.
91 */
92 public function add_appearance_menu() {
93 $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
94 $default_customize_slug = add_query_arg( 'return', rawurlencode( remove_query_arg( wp_removable_query_args(), $request_uri ) ), 'customize.php' );
95 $default_customize_header_slug_1 = add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $default_customize_slug );
96 // TODO: Remove WPCom_Theme_Customizer::modify_header_menu_links() and WPcom_Custom_Header::modify_admin_menu_links().
97 $default_customize_header_slug_2 = admin_url( 'themes.php?page=custom-header' );
98 $default_customize_background_slug_1 = add_query_arg( array( 'autofocus' => array( 'control' => 'background_image' ) ), $default_customize_slug );
99 // TODO: Remove Colors_Manager::modify_header_menu_links() and Colors_Manager_Common::modify_header_menu_links().
100 $default_customize_background_slug_2 = add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), admin_url( 'customize.php' ) );
101
102 if ( $this->is_api_request ) {
103 // In case this is an api request we will have to add the 'return' querystring via JS.
104 $customize_url = 'customize.php';
105 } else {
106 $customize_url = $default_customize_slug;
107 }
108
109 $submenus_to_update = array(
110 $default_customize_slug => $customize_url,
111 $default_customize_header_slug_1 => add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url ),
112 $default_customize_header_slug_2 => add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url ),
113 $default_customize_background_slug_1 => add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), $customize_url ),
114 $default_customize_background_slug_2 => add_query_arg( array( 'autofocus' => array( 'section' => 'colors_manager_tool' ) ), $customize_url ),
115 );
116
117 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'themes.php' ) ) {
118 $submenus_to_update['themes.php'] = 'https://wordpress.com/themes/' . $this->domain;
119 }
120
121 $this->update_submenus( 'themes.php', $submenus_to_update );
122
123 $this->hide_submenu_page( 'themes.php', 'custom-header' );
124 $this->hide_submenu_page( 'themes.php', 'custom-background' );
125
126 return $customize_url;
127 }
128
129 /**
130 * Adds Plugins menu.
131 */
132 public function add_plugins_menu() {
133 if ( self::CLASSIC_VIEW === $this->get_preferred_view( 'plugins.php' ) ) {
134 return;
135 }
136 $this->hide_submenu_page( 'plugins.php', 'plugin-install.php' );
137 $this->hide_submenu_page( 'plugins.php', 'plugin-editor.php' );
138
139 $this->update_menu( 'plugins.php', 'https://wordpress.com/plugins/' . $this->domain );
140 }
141
142 /**
143 * Adds Users menu.
144 */
145 public function add_users_menu() {
146 $submenus_to_update = array(
147 'profile.php' => 'https://wordpress.com/me',
148 );
149
150 if ( self::DEFAULT_VIEW === $this->get_preferred_view( 'users.php' ) ) {
151 $submenus_to_update['users.php'] = 'https://wordpress.com/people/team/' . $this->domain;
152 $submenus_to_update['user-new.php'] = 'https://wordpress.com/people/new/' . $this->domain;
153 }
154
155 $slug = current_user_can( 'list_users' ) ? 'users.php' : 'profile.php';
156 $this->update_submenus( $slug, $submenus_to_update );
157 }
158
159 /**
160 * Renders the upsell nudge directly in the admin menu.
161 *
162 * This renders server-side via the `adminmenu` hook to avoid the layout
163 * shift caused by the previous AJAX-based approach.
164 */
165 public function render_upsell_nudge() {
166 // Skip if jetpack-mu-wpcom is already rendering the upsell banner.
167 if ( has_action( 'adminmenu', 'wpcom_add_sidebar_notice_menu_page' ) ) {
168 return;
169 }
170
171 /** This action is already documented in \Automattic\Jetpack\JITMS\JITM */
172 if ( ! apply_filters( 'jetpack_just_in_time_msgs', true ) ) {
173 return;
174 }
175
176 $nudge = $this->get_upsell_nudge();
177 if ( ! $nudge ) {
178 return;
179 }
180
181 $link = $nudge['link'];
182 if ( str_starts_with( $link, '/' ) ) {
183 $link = 'https://wordpress.com' . $link;
184 }
185 ?>
186 <li class="wp-not-current-submenu menu-top menu-icon-generic toplevel_page_site-notices" id="toplevel_page_site-notices">
187 <a href="<?php echo esc_url( $link ); ?>" class="wp-not-current-submenu menu-top menu-icon-generic toplevel_page_site-notices">
188 <div class="wp-menu-arrow">
189 <div></div>
190 </div>
191 <div class="wp-menu-image dashicons-before dashicons-admin-generic" aria-hidden="true"><br></div>
192 <div class="wp-menu-name">
193 <div class="upsell_banner">
194 <div class="banner__info">
195 <div class="banner__title">
196 <?php echo wp_kses( $nudge['content'], array() ); ?>
197 </div>
198 </div>
199 <div class="banner__action">
200 <button type="button" class="button">
201 <?php echo wp_kses( $nudge['cta'], array() ); ?>
202 </button>
203 </div>
204 <?php if ( $nudge['dismissible'] ) : ?>
205 <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>
206 <?php endif; ?>
207 </div>
208 </div>
209 </a>
210 </li>
211 <script>
212 ( function ( el ) {
213 if ( el && el.parentNode ) {
214 el.parentNode.prepend( el );
215 }
216 } )( document.getElementById( 'toplevel_page_site-notices' ) );
217 </script>
218 <?php
219 }
220
221 /**
222 * Returns the first available upsell nudge.
223 * Needs to be implemented separately for each child menu class.
224 * Empty by default.
225 *
226 * @return array
227 */
228 public function get_upsell_nudge() {
229 return array();
230 }
231 }
232