PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta
16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / _inc / lib / admin-pages / class.jetpack-admin-page.php
jetpack / _inc / lib / admin-pages Last commit date
class-akismet-admin-chrome.php 3 weeks ago class-jetpack-about-page.php 2 months ago class-jetpack-ai-page.php 2 months ago class-jetpack-redux-state-helper.php 3 weeks ago class.jetpack-admin-page.php 6 days ago class.jetpack-landing-page.php 2 years ago class.jetpack-react-page.php 7 months ago class.jetpack-settings-page.php 6 days ago
class.jetpack-admin-page.php
431 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Main class file for Jetpack Admin pages.
4 *
5 * @package automattic/jetpack
6 */
7
8 use Automattic\Jetpack\Current_Plan as Jetpack_Plan;
9 use Automattic\Jetpack\Identity_Crisis;
10 use Automattic\Jetpack\Redirect;
11 use Automattic\Jetpack\Status;
12 use Automattic\Jetpack\Status\Host;
13
14 /**
15 * Shared logic between Jetpack admin pages.
16 */
17 abstract class Jetpack_Admin_Page {
18
19 /**
20 * Determines whether or not to hide if not active.
21 *
22 * @var bool
23 */
24 protected $dont_show_if_not_active;
25
26 /**
27 * Add page specific actions given the page hook.
28 *
29 * @param string $hook Hook of current page.
30 */
31 abstract public function add_page_actions( $hook );
32
33 /**
34 * Create a menu item for the page and returns the hook.
35 *
36 * @return string|false Return value from WordPress's `add_menu_page()` or `add_submenu_page()`.
37 */
38 abstract public function get_page_hook();
39
40 /**
41 * Enqueue and localize page specific scripts.
42 */
43 abstract public function page_admin_scripts();
44
45 /**
46 * Render page specific HTML
47 */
48 abstract public function page_render();
49
50 /**
51 * Function called after admin_styles to load any additional needed styles.
52 *
53 * @since 4.3.0
54 */
55 public function additional_styles() {}
56
57 /**
58 * Add common page actions and attach page-specific actions.
59 */
60 public function add_actions() {
61 $is_offline_mode = ( new Status() )->is_offline_mode();
62
63 // If user is not an admin and site is in Offline Mode or not connected yet then don't do anything.
64 if ( ! current_user_can( 'manage_options' ) && ( $is_offline_mode || ! Jetpack::is_connection_ready() ) ) {
65 return;
66 }
67
68 // Is Jetpack not connected and not offline?
69 // True means that Jetpack is NOT connected and NOT in offline mode.
70 // If Jetpack is connected OR in offline mode, this will be false.
71 $connectable = ! Jetpack::is_connection_ready() && ! $is_offline_mode;
72
73 // Don't add in the modules page unless modules are available!
74 if ( $this->dont_show_if_not_active && $connectable ) {
75 return;
76 }
77
78 // Initialize menu item for the page in the admin.
79 $hook = $this->get_page_hook();
80
81 // Attach hooks common to all Jetpack admin pages based on the created hook.
82 add_action( "load-$hook", array( $this, 'admin_page_load' ) );
83 add_action( "admin_print_styles-$hook", array( $this, 'admin_styles' ) );
84 add_action( "admin_print_scripts-$hook", array( $this, 'admin_scripts' ) );
85 add_action( "admin_print_styles-$hook", array( $this, 'additional_styles' ) );
86
87 // Check if the site plan changed and deactivate modules accordingly.
88 add_action( 'current_screen', array( $this, 'check_plan_deactivate_modules' ) );
89
90 // Attach page specific actions in addition to the above.
91 $this->add_page_actions( $hook );
92
93 // Override the page title for the module list page and the debugger page.
94 add_action( 'current_screen', array( __CLASS__, 'override_page_title' ) );
95 }
96
97 /**
98 * Render the page with a common top and bottom part, and page specific content.
99 */
100 public function render() {
101 /** This action is documented in class.jetpack.php */
102 do_action( 'jetpack_initialize_tracking' );
103
104 // We're in an IDC: we need a decision made before we show the UI again.
105 if ( $this->block_page_rendering_for_idc() ) {
106 return;
107 }
108
109 // Check if we are looking at the main dashboard.
110 if ( isset( $_GET['page'] ) && 'jetpack' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- View logic.
111 $this->page_render();
112 return;
113 }
114
115 $args = array();
116
117 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
118 if ( isset( $_GET['page'] ) && 'jetpack_modules' === $_GET['page'] ) {
119 $args['is-wide'] = true;
120 $args['show-nav'] = false;
121 }
122
123 self::wrap_ui( array( $this, 'page_render' ), $args );
124 }
125
126 /**
127 * Call the existing admin page events.
128 */
129 public function admin_page_load() {
130 Jetpack::init()->admin_page_load();
131 }
132
133 /**
134 * Add page specific scripts and jetpack stats for all menu pages.
135 */
136 public function admin_scripts() {
137 $this->page_admin_scripts(); // Delegate to inheriting class.
138 add_action( 'admin_footer', array( Jetpack::init(), 'do_stats' ) );
139 }
140
141 /**
142 * Enqueue the Jetpack admin stylesheet.
143 */
144 public function admin_styles() {
145 $min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
146
147 wp_enqueue_style( 'jetpack-admin', plugins_url( "css/jetpack-admin{$min}.css", JETPACK__PLUGIN_FILE ), array( 'genericons', 'jetpack-connection' ), JETPACK__VERSION . '-20121016' );
148 wp_style_add_data( 'jetpack-admin', 'rtl', 'replace' );
149 wp_style_add_data( 'jetpack-admin', 'suffix', $min );
150 }
151
152 /**
153 * Checks if REST API is enabled.
154 *
155 * @since 4.4.2
156 *
157 * @return bool
158 */
159 public function is_rest_api_enabled() {
160 return /** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
161 apply_filters( 'rest_enabled', true ) &&
162 /** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
163 apply_filters( 'rest_authentication_errors', true );
164 }
165
166 /**
167 * Checks the site plan and deactivates modules that were active but are no longer included in the plan.
168 *
169 * @since 4.4.0
170 *
171 * @param WP_Screen $page Current WP_Screen object.
172 *
173 * @return array
174 */
175 public function check_plan_deactivate_modules( $page ) {
176 if (
177 ( new Status() )->is_offline_mode()
178 || ! in_array(
179 $page->base,
180 array(
181 'toplevel_page_jetpack',
182 'admin_page_jetpack_modules',
183 'jetpack_page_vaultpress',
184 'jetpack_page_stats',
185 'jetpack_page_akismet-key-config',
186 ),
187 true
188 )
189 ) {
190 return false;
191 }
192
193 $current = Jetpack_Plan::get();
194
195 $to_deactivate = array();
196 if ( isset( $current['product_slug'] ) ) {
197 $active = Jetpack::get_active_modules();
198 switch ( $current['product_slug'] ) {
199 case 'jetpack_free':
200 case 'jetpack_personal':
201 case 'jetpack_personal_monthly':
202 $to_deactivate = array( 'google-analytics', 'wordads', 'search' );
203 break;
204 case 'jetpack_premium':
205 case 'jetpack_premium_monthly':
206 $to_deactivate = array( 'google-analytics', 'search' );
207 break;
208 }
209 $to_deactivate = array_intersect( $active, $to_deactivate );
210
211 $to_leave_enabled = array();
212 foreach ( $to_deactivate as $feature ) {
213 if ( Jetpack_Plan::supports( $feature ) ) {
214 $to_leave_enabled [] = $feature;
215 }
216 }
217 $to_deactivate = array_diff( $to_deactivate, $to_leave_enabled );
218
219 if ( ! empty( $to_deactivate ) ) {
220 Jetpack::update_active_modules( array_filter( array_diff( $active, $to_deactivate ) ) );
221 }
222 }
223 return array(
224 'current' => $current,
225 'deactivate' => $to_deactivate,
226 );
227 }
228
229 /**
230 * Enqueue inline wrapper styles for the main container.
231 */
232 public static function load_wrapper_styles() {
233 $rtl = is_rtl() ? '.rtl' : '';
234 wp_enqueue_style( 'dops-css', plugins_url( "_inc/build/admin{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
235 wp_enqueue_style( 'components-css', plugins_url( "_inc/build/style.min{$rtl}.css", JETPACK__PLUGIN_FILE ), array( 'wp-components' ), JETPACK__VERSION );
236 }
237
238 /**
239 * Build header, content, and footer for admin page.
240 *
241 * @param callable $callback Callback to produce the content of the page. The callback is responsible for any needed escaping.
242 * @param array $args Options for the wrapping. Also passed to the `jetpack_admin_pages_wrap_ui_after_callback` action.
243 * - is-wide: (bool) Set the "is-wide" class on the wrapper div, which increases the max width. Default false.
244 * - show-nav: (bool) Whether to show the navigation bar at the top of the page. Default true.
245 */
246 public static function wrap_ui( $callback, $args = array() ) {
247 $defaults = array(
248 'is-wide' => false,
249 'show-nav' => true,
250 );
251 $args = wp_parse_args( $args, $defaults );
252
253 // Is Jetpack not connected and not offline?
254 // True means that Jetpack is NOT connected and NOT in offline mode.
255 // If Jetpack is connected OR in offline mode, this will be false.
256 $connectable = ! Jetpack::is_connection_ready() && ! ( new Status() )->is_offline_mode();
257
258 $jetpack_admin_url = admin_url( 'admin.php?page=jetpack' );
259 $jetpack_about_url = ! $connectable
260 ? admin_url( 'admin.php?page=jetpack_about' )
261 : Redirect::get_url( 'jetpack' );
262
263 ?>
264 <div id="jp-plugin-container" class="
265 <?php
266 if ( $args['is-wide'] ) {
267 echo 'is-wide'; }
268 ?>
269 ">
270
271 <header class="jp-masthead">
272 <div class="jp-masthead__inside-container">
273 <div class="jp-masthead__title-container">
274 <a class="jp-masthead__logo-link" href="<?php echo esc_url( admin_url( 'admin.php?page=my-jetpack#/overview' ) ); ?>">
275 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" height="20" aria-label="<?php esc_attr_e( 'Jetpack logo', 'jetpack' ); ?>"><path fill="#069e08" d="M16,0C7.2,0,0,7.2,0,16s7.2,16,16,16s16-7.2,16-16S24.8,0,16,0z M15,19H7l8-16V19z M17,29V13h8L17,29z"></path></svg>
276 </a>
277 <h2 class="jp-masthead__title">
278 <?php
279 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- View logic only.
280 $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
281 $is_offline_mode = ( new Status() )->is_offline_mode();
282 $current_label = '';
283 if ( 'jetpack_modules' === $page ) {
284 $current_label = __( 'Modules', 'jetpack' );
285 } elseif ( 'jetpack_about' === $page ) {
286 $current_label = __( 'About', 'jetpack' );
287 } elseif ( 'jetpack-debugger' === $page ) {
288 $current_label = __( 'Debug', 'jetpack' );
289 }
290 ?>
291 <?php if ( $current_label ) : ?>
292 <a class="jp-masthead__title-link" href="<?php echo esc_url( admin_url( 'admin.php?page=my-jetpack#/overview' ) ); ?>">Jetpack</a><?php // "Jetpack" is a product name, do not translate. ?>
293 <span class="jp-masthead__title-separator" aria-hidden="true">/</span>
294 <?php if ( $is_offline_mode ) : ?>
295 <span class="jp-masthead__title-offline"><?php esc_html_e( 'Offline Mode', 'jetpack' ); ?></span>
296 <span class="jp-masthead__title-separator" aria-hidden="true">/</span>
297 <?php endif; ?>
298 <span class="jp-masthead__title-current"><?php echo esc_html( $current_label ); ?></span>
299 <?php else : ?>
300 Jetpack<?php // "Jetpack" is a product name, do not translate. ?>
301 <?php endif; ?>
302 </h2>
303 </div>
304 <?php
305 if ( $args['show-nav'] && ! ( new Host() )->is_wpcom_platform() ) :
306 ?>
307 <div class="jp-masthead__nav">
308 <?php
309 if ( is_network_admin() ) {
310 $current_screen = get_current_screen();
311
312 $highlight_current_sites = ( 'toplevel_page_jetpack-network' === $current_screen->id ? 'is-primary' : '' );
313 $highlight_current_settings = ( 'jetpack_page_jetpack-settings-network' === $current_screen->id ? 'is-primary' : '' );
314 ?>
315 <span class="dops-button-group">
316 <?php
317 if ( current_user_can( 'jetpack_network_sites_page' ) ) {
318 ?>
319 <a href="<?php echo esc_url( network_admin_url( 'admin.php?page=jetpack' ) ); ?>" type="button" class="<?php echo esc_attr( $highlight_current_sites ); ?> dops-button is-compact" title="<?php esc_html_e( "Manage your network's Jetpack Sites.", 'jetpack' ); ?>"><?php echo esc_html_x( 'Sites', 'Navigation item', 'jetpack' ); ?></a>
320 <?php
321 } if ( current_user_can( 'jetpack_network_settings_page' ) ) {
322 ?>
323 <a href="<?php echo esc_url( network_admin_url( 'admin.php?page=jetpack-settings' ) ); ?>" type="button" class="<?php echo esc_attr( $highlight_current_settings ); ?> dops-button is-compact" title="<?php esc_html_e( "Manage your network's Jetpack Sites.", 'jetpack' ); ?>"><?php echo esc_html_x( 'Network Settings', 'Navigation item', 'jetpack' ); ?></a>
324 <?php
325 }
326 ?>
327 </span>
328 <?php } else { ?>
329 <span class="dops-button-group">
330 <a href="<?php echo esc_url( $jetpack_admin_url ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Dashboard', 'jetpack' ); ?></a>
331 <?php
332 if ( current_user_can( 'jetpack_manage_modules' ) ) {
333 ?>
334 <a href="<?php echo esc_url( $jetpack_admin_url . '#/settings' ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Settings', 'jetpack' ); ?></a>
335 <?php
336 }
337 ?>
338 </span>
339 <?php } ?>
340 </div>
341 <?php endif; ?>
342 </div>
343 </header>
344 <div class="wrap"><div id="jp-admin-notices" aria-live="polite"></div></div>
345 <!-- START OF CALLBACK -->
346 <?php
347 ob_start();
348 call_user_func( $callback );
349 $callback_ui = ob_get_contents();
350 ob_end_clean();
351 echo $callback_ui;// phpcs:ignore WordPress.Security.EscapeOutput -- Callback is responsible for any needed escaping.
352 ?>
353 <!-- END OF CALLBACK -->
354
355 <div id="jp-stats-report-bottom">
356 <div class="wrap">
357 <?php
358 /**
359 * Fires at the bottom of the Jetpack admin page template, after the dynamic content section.
360 *
361 * @since 10.0.0
362 *
363 * @param string $callback The callback sent to the Jetpack_Admin_Page::wrap_ui method.
364 * @param array $args The arguments sent to the Jetpack_Admin_Page::wrap_ui method.
365 */
366 do_action( 'jetpack_admin_pages_wrap_ui_after_callback', $callback, $args );
367 ?>
368 </div>
369 </div>
370
371 <div class="jp-footer jp-footer--static">
372 <div class="jp-footer__container">
373 <div class="jp-footer__logo">
374 <svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 32 32" class="jetpack-logo jp-footer__jetpack-symbol" aria-labelledby="jetpack-logo-title" height="16" aria-label="<?php esc_html_e( 'Jetpack logo', 'jetpack' ); ?>">
375 <desc id="jetpack-logo-title">
376 <?php esc_html_e( 'Jetpack Logo', 'jetpack' ); ?>
377 </desc>
378 <path fill="#000" d="M16,0C7.2,0,0,7.2,0,16s7.2,16,16,16s16-7.2,16-16S24.8,0,16,0z M15,19H7l8-16V19z M17,29V13h8L17,29z"></path>
379 </svg>
380 <span class="jp-footer__module-name"><?php esc_html_e( 'Jetpack', 'jetpack' ); ?></span>
381 </div>
382 <?php if ( ! ( new Host() )->is_wpcom_platform() ) : ?>
383 <div class="jp-footer__menu">
384 <a href="<?php echo esc_url( admin_url( 'admin.php?page=my-jetpack#/products' ) ); ?>" class="jp-footer__menu-item"><?php echo esc_html_x( 'Products', 'Navigation item', 'jetpack' ); ?></a>
385 <a href="<?php echo esc_url( admin_url( 'admin.php?page=my-jetpack#/help' ) ); ?>" class="jp-footer__menu-item"><?php echo esc_html_x( 'Help', 'Navigation item', 'jetpack' ); ?></a>
386 </div>
387 <?php endif; ?>
388 <a class="jp-footer__a8c-logo" href="<?php echo esc_url( $jetpack_about_url ); ?>" aria-label="<?php echo esc_attr__( 'An Automattic Airline', 'jetpack' ); ?>">
389 <svg role="img" x="0" y="0" viewBox="0 0 935 38.2" enable-background="new 0 0 935 38.2" aria-labelledby="jp-automattic-byline-logo-title" height="7" class="jp-automattic-byline-logo">
390 <desc id="jp-automattic-byline-logo-title">
391 <?php echo esc_attr__( 'An Automattic Airline', 'jetpack' ); ?>
392 </desc>
393 <path d="M317.1 38.2c-12.6 0-20.7-9.1-20.7-18.5v-1.2c0-9.6 8.2-18.5 20.7-18.5 12.6 0 20.8 8.9 20.8 18.5v1.2C337.9 29.1 329.7 38.2 317.1 38.2zM331.2 18.6c0-6.9-5-13-14.1-13s-14 6.1-14 13v0.9c0 6.9 5 13.1 14 13.1s14.1-6.2 14.1-13.1V18.6zM175 36.8l-4.7-8.8h-20.9l-4.5 8.8h-7L157 1.3h5.5L182 36.8H175zM159.7 8.2L152 23.1h15.7L159.7 8.2zM212.4 38.2c-12.7 0-18.7-6.9-18.7-16.2V1.3h6.6v20.9c0 6.6 4.3 10.5 12.5 10.5 8.4 0 11.9-3.9 11.9-10.5V1.3h6.7V22C231.4 30.8 225.8 38.2 212.4 38.2zM268.6 6.8v30h-6.7v-30h-15.5V1.3h37.7v5.5H268.6zM397.3 36.8V8.7l-1.8 3.1 -14.9 25h-3.3l-14.7-25 -1.8-3.1v28.1h-6.5V1.3h9.2l14 24.4 1.7 3 1.7-3 13.9-24.4h9.1v35.5H397.3zM454.4 36.8l-4.7-8.8h-20.9l-4.5 8.8h-7l19.2-35.5h5.5l19.5 35.5H454.4zM439.1 8.2l-7.7 14.9h15.7L439.1 8.2zM488.4 6.8v30h-6.7v-30h-15.5V1.3h37.7v5.5H488.4zM537.3 6.8v30h-6.7v-30h-15.5V1.3h37.7v5.5H537.3zM569.3 36.8V4.6c2.7 0 3.7-1.4 3.7-3.4h2.8v35.5L569.3 36.8 569.3 36.8zM628 11.3c-3.2-2.9-7.9-5.7-14.2-5.7 -9.5 0-14.8 6.5-14.8 13.3v0.7c0 6.7 5.4 13 15.3 13 5.9 0 10.8-2.8 13.9-5.7l4 4.2c-3.9 3.8-10.5 7.1-18.3 7.1 -13.4 0-21.6-8.7-21.6-18.3v-1.2c0-9.6 8.9-18.7 21.9-18.7 7.5 0 14.3 3.1 18 7.1L628 11.3zM321.5 12.4c1.2 0.8 1.5 2.4 0.8 3.6l-6.1 9.4c-0.8 1.2-2.4 1.6-3.6 0.8l0 0c-1.2-0.8-1.5-2.4-0.8-3.6l6.1-9.4C318.7 11.9 320.3 11.6 321.5 12.4L321.5 12.4z"></path><path d="M37.5 36.7l-4.7-8.9H11.7l-4.6 8.9H0L19.4 0.8H25l19.7 35.9H37.5zM22 7.8l-7.8 15.1h15.9L22 7.8zM82.8 36.7l-23.3-24 -2.3-2.5v26.6h-6.7v-36H57l22.6 24 2.3 2.6V0.8h6.7v35.9H82.8z"></path><path d="M719.9 37l-4.8-8.9H694l-4.6 8.9h-7.1l19.5-36h5.6l19.8 36H719.9zM704.4 8l-7.8 15.1h15.9L704.4 8zM733 37V1h6.8v36H733zM781 37c-1.8 0-2.6-2.5-2.9-5.8l-0.2-3.7c-0.2-3.6-1.7-5.1-8.4-5.1h-12.8V37H750V1h19.6c10.8 0 15.7 4.3 15.7 9.9 0 3.9-2 7.7-9 9 7 0.5 8.5 3.7 8.6 7.9l0.1 3c0.1 2.5 0.5 4.3 2.2 6.1V37H781zM778.5 11.8c0-2.6-2.1-5.1-7.9-5.1h-13.8v10.8h14.4c5 0 7.3-2.4 7.3-5.2V11.8zM794.8 37V1h6.8v30.4h28.2V37H794.8zM836.7 37V1h6.8v36H836.7zM886.2 37l-23.4-24.1 -2.3-2.5V37h-6.8V1h6.5l22.7 24.1 2.3 2.6V1h6.8v36H886.2zM902.3 37V1H935v5.6h-26v9.2h20v5.5h-20v10.1h26V37H902.3z"></path>
394 </svg>
395 </a>
396 </div>
397 </div>
398 </div>
399 <?php
400 }
401
402 /**
403 * Should we block the page rendering because the site is in IDC?
404 *
405 * @return bool
406 */
407 protected function block_page_rendering_for_idc() {
408 return Jetpack::is_connection_ready() && Identity_Crisis::validate_sync_error_idc_option() && ! Jetpack_Options::get_option( 'safe_mode_confirmed' );
409 }
410
411 /**
412 * Set a page title for both the module list page and the debugger page.
413 * We set these here because we do not register a page title when we register them,
414 * so they do not appear in the admin navigation.
415 *
416 * @since 15.4
417 *
418 * @param WP_Screen $screen The screen object.
419 *
420 * @return void
421 */
422 public static function override_page_title( WP_Screen $screen ) {
423 global $title;
424 if ( 'admin_page_jetpack_modules' === $screen->id ) {
425 $title = __( 'Jetpack Settings', 'jetpack' ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- we override the title global only on this page.
426 } elseif ( 'admin_page_jetpack-debugger' === $screen->id ) {
427 $title = __( 'Debugging Center', 'jetpack' ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- we override the title global only on this page.
428 }
429 }
430 }
431