PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 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 All 508 releases
← All changes | jetpack_vendor/automattic/jetpack-masterbar/src/admin-menu/class-admin-menu.php +231 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,231 @@
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 +}