PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.9.2
Jetpack – WP Security, Backup, Speed, & Growth v14.9.2
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 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 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-jetpack-about-page.php 1 year ago class-jetpack-redux-state-helper.php 1 year ago class.jetpack-admin-page.php 1 year ago class.jetpack-landing-page.php 2 years ago class.jetpack-react-page.php 1 year ago class.jetpack-settings-page.php 3 years ago
class.jetpack-admin-page.php
411 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
13 /**
14 * Shared logic between Jetpack admin pages.
15 */
16 abstract class Jetpack_Admin_Page {
17
18 /**
19 * Determines whether or not to hide if not active.
20 *
21 * @var bool
22 */
23 protected $dont_show_if_not_active;
24
25 /**
26 * Add page specific actions given the page hook.
27 *
28 * @param string $hook Hook of current page.
29 */
30 abstract public function add_page_actions( $hook );
31
32 /**
33 * Create a menu item for the page and returns the hook.
34 *
35 * @return string|false Return value from WordPress's `add_menu_page()` or `add_submenu_page()`.
36 */
37 abstract public function get_page_hook();
38
39 /**
40 * Enqueue and localize page specific scripts.
41 */
42 abstract public function page_admin_scripts();
43
44 /**
45 * Render page specific HTML
46 */
47 abstract public function page_render();
48
49 /**
50 * Function called after admin_styles to load any additional needed styles.
51 *
52 * @since 4.3.0
53 */
54 public function additional_styles() {}
55
56 /**
57 * Add common page actions and attach page-specific actions.
58 */
59 public function add_actions() {
60 $is_offline_mode = ( new Status() )->is_offline_mode();
61
62 // If user is not an admin and site is in Offline Mode or not connected yet then don't do anything.
63 if ( ! current_user_can( 'manage_options' ) && ( $is_offline_mode || ! Jetpack::is_connection_ready() ) ) {
64 return;
65 }
66
67 // Is Jetpack not connected and not offline?
68 // True means that Jetpack is NOT connected and NOT in offline mode.
69 // If Jetpack is connected OR in offline mode, this will be false.
70 $connectable = ! Jetpack::is_connection_ready() && ! $is_offline_mode;
71
72 // Don't add in the modules page unless modules are available!
73 if ( $this->dont_show_if_not_active && $connectable ) {
74 return;
75 }
76
77 // Initialize menu item for the page in the admin.
78 $hook = $this->get_page_hook();
79
80 // Attach hooks common to all Jetpack admin pages based on the created hook.
81 add_action( "load-$hook", array( $this, 'admin_page_load' ) );
82 add_action( "admin_print_styles-$hook", array( $this, 'admin_styles' ) );
83 add_action( "admin_print_scripts-$hook", array( $this, 'admin_scripts' ) );
84 add_action( "admin_print_styles-$hook", array( $this, 'additional_styles' ) );
85
86 // Check if the site plan changed and deactivate modules accordingly.
87 add_action( 'current_screen', array( $this, 'check_plan_deactivate_modules' ) );
88
89 // Attach page specific actions in addition to the above.
90 $this->add_page_actions( $hook );
91 }
92
93 /**
94 * Render the page with a common top and bottom part, and page specific content.
95 */
96 public function render() {
97 /** This action is documented in class.jetpack.php */
98 do_action( 'jetpack_initialize_tracking' );
99
100 // We're in an IDC: we need a decision made before we show the UI again.
101 if ( $this->block_page_rendering_for_idc() ) {
102 return;
103 }
104
105 // Check if we are looking at the main dashboard.
106 if ( isset( $_GET['page'] ) && 'jetpack' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- View logic.
107 $this->page_render();
108 return;
109 }
110
111 $args = array();
112
113 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
114 if ( isset( $_GET['page'] ) && 'jetpack_modules' === $_GET['page'] ) {
115 $args['is-wide'] = true;
116 }
117
118 self::wrap_ui( array( $this, 'page_render' ), $args );
119 }
120
121 /**
122 * Call the existing admin page events.
123 */
124 public function admin_page_load() {
125 Jetpack::init()->admin_page_load();
126 }
127
128 /**
129 * Add page specific scripts and jetpack stats for all menu pages.
130 */
131 public function admin_scripts() {
132 $this->page_admin_scripts(); // Delegate to inheriting class.
133 add_action( 'admin_footer', array( Jetpack::init(), 'do_stats' ) );
134 }
135
136 /**
137 * Enqueue the Jetpack admin stylesheet.
138 */
139 public function admin_styles() {
140 $min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
141
142 wp_enqueue_style( 'jetpack-admin', plugins_url( "css/jetpack-admin{$min}.css", JETPACK__PLUGIN_FILE ), array( 'genericons', 'jetpack-connection' ), JETPACK__VERSION . '-20121016' );
143 wp_style_add_data( 'jetpack-admin', 'rtl', 'replace' );
144 wp_style_add_data( 'jetpack-admin', 'suffix', $min );
145 }
146
147 /**
148 * Checks if REST API is enabled.
149 *
150 * @since 4.4.2
151 *
152 * @return bool
153 */
154 public function is_rest_api_enabled() {
155 return /** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
156 apply_filters( 'rest_enabled', true ) &&
157 /** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
158 apply_filters( 'rest_authentication_errors', true );
159 }
160
161 /**
162 * Checks the site plan and deactivates modules that were active but are no longer included in the plan.
163 *
164 * @since 4.4.0
165 *
166 * @param WP_Screen $page Current WP_Screen object.
167 *
168 * @return array
169 */
170 public function check_plan_deactivate_modules( $page ) {
171 if (
172 ( new Status() )->is_offline_mode()
173 || ! in_array(
174 $page->base,
175 array(
176 'toplevel_page_jetpack',
177 'admin_page_jetpack_modules',
178 'jetpack_page_vaultpress',
179 'jetpack_page_stats',
180 'jetpack_page_akismet-key-config',
181 ),
182 true
183 )
184 ) {
185 return false;
186 }
187
188 $current = Jetpack_Plan::get();
189
190 $to_deactivate = array();
191 if ( isset( $current['product_slug'] ) ) {
192 $active = Jetpack::get_active_modules();
193 switch ( $current['product_slug'] ) {
194 case 'jetpack_free':
195 case 'jetpack_personal':
196 case 'jetpack_personal_monthly':
197 $to_deactivate = array( 'google-analytics', 'wordads', 'search' );
198 break;
199 case 'jetpack_premium':
200 case 'jetpack_premium_monthly':
201 $to_deactivate = array( 'google-analytics', 'search' );
202 break;
203 }
204 $to_deactivate = array_intersect( $active, $to_deactivate );
205
206 $to_leave_enabled = array();
207 foreach ( $to_deactivate as $feature ) {
208 if ( Jetpack_Plan::supports( $feature ) ) {
209 $to_leave_enabled [] = $feature;
210 }
211 }
212 $to_deactivate = array_diff( $to_deactivate, $to_leave_enabled );
213
214 if ( ! empty( $to_deactivate ) ) {
215 Jetpack::update_active_modules( array_filter( array_diff( $active, $to_deactivate ) ) );
216 }
217 }
218 return array(
219 'current' => $current,
220 'deactivate' => $to_deactivate,
221 );
222 }
223
224 /**
225 * Enqueue inline wrapper styles for the main container.
226 */
227 public static function load_wrapper_styles() {
228 $rtl = is_rtl() ? '.rtl' : '';
229 wp_enqueue_style( 'dops-css', plugins_url( "_inc/build/admin{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
230 wp_enqueue_style( 'components-css', plugins_url( "_inc/build/style.min{$rtl}.css", JETPACK__PLUGIN_FILE ), array( 'wp-components' ), JETPACK__VERSION );
231 }
232
233 /**
234 * Build header, content, and footer for admin page.
235 *
236 * @param callable $callback Callback to produce the content of the page. The callback is responsible for any needed escaping.
237 * @param array $args Options for the wrapping. Also passed to the `jetpack_admin_pages_wrap_ui_after_callback` action.
238 * - is-wide: (bool) Set the "is-wide" class on the wrapper div, which increases the max width. Default false.
239 * - show-nav: (bool) Whether to show the navigation bar at the top of the page. Default true.
240 */
241 public static function wrap_ui( $callback, $args = array() ) {
242 $defaults = array(
243 'is-wide' => false,
244 'show-nav' => true,
245 );
246 $args = wp_parse_args( $args, $defaults );
247
248 // Is Jetpack not connected and not offline?
249 // True means that Jetpack is NOT connected and NOT in offline mode.
250 // If Jetpack is connected OR in offline mode, this will be false.
251 $connectable = ! Jetpack::is_connection_ready() && ! ( new Status() )->is_offline_mode();
252
253 $jetpack_admin_url = admin_url( 'admin.php?page=jetpack' );
254 $jetpack_about_url = ! $connectable
255 ? admin_url( 'admin.php?page=jetpack_about' )
256 : Redirect::get_url( 'jetpack' );
257
258 $jetpack_privacy_url = ! $connectable
259 ? $jetpack_admin_url . '#/privacy'
260 : Redirect::get_url( 'a8c-privacy' );
261
262 $external_link_icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" class="jp-footer__menu-item__icon" aria-hidden="true" focusable="false"><path d="M18.2 17c0 .7-.6 1.2-1.2 1.2H7c-.7 0-1.2-.6-1.2-1.2V7c0-.7.6-1.2 1.2-1.2h3.2V4.2H7C5.5 4.2 4.2 5.5 4.2 7v10c0 1.5 1.2 2.8 2.8 2.8h10c1.5 0 2.8-1.2 2.8-2.8v-3.6h-1.5V17zM14.9 3v1.5h3.7l-6.4 6.4 1.1 1.1 6.4-6.4v3.7h1.5V3h-6.3z"></path></svg>';
263
264 ?>
265 <div id="jp-plugin-container" class="
266 <?php
267 if ( $args['is-wide'] ) {
268 echo 'is-wide'; }
269 ?>
270 ">
271
272 <div class="jp-masthead jp-masthead-middle">
273 <div class="jp-masthead__inside-container">
274 <div class="jp-masthead__logo-container">
275 <a class="jp-masthead__logo-link" href="<?php echo esc_url( $jetpack_admin_url ); ?>">
276 <svg class="jetpack-logo__masthead" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" height="40" viewBox="0 0 118 32"><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><path d="M41.3,26.6c-0.5-0.7-0.9-1.4-1.3-2.1c2.3-1.4,3-2.5,3-4.6V8h-3V6h6v13.4C46,22.8,45,24.8,41.3,26.6z"></path><path d="M65,18.4c0,1.1,0.8,1.3,1.4,1.3c0.5,0,2-0.2,2.6-0.4v2.1c-0.9,0.3-2.5,0.5-3.7,0.5c-1.5,0-3.2-0.5-3.2-3.1V12H60v-2h2.1V7.1 H65V10h4v2h-4V18.4z"></path><path d="M71,10h3v1.3c1.1-0.8,1.9-1.3,3.3-1.3c2.5,0,4.5,1.8,4.5,5.6s-2.2,6.3-5.8,6.3c-0.9,0-1.3-0.1-2-0.3V28h-3V10z M76.5,12.3 c-0.8,0-1.6,0.4-2.5,1.2v5.9c0.6,0.1,0.9,0.2,1.8,0.2c2,0,3.2-1.3,3.2-3.9C79,13.4,78.1,12.3,76.5,12.3z"></path><path d="M93,22h-3v-1.5c-0.9,0.7-1.9,1.5-3.5,1.5c-1.5,0-3.1-1.1-3.1-3.2c0-2.9,2.5-3.4,4.2-3.7l2.4-0.3v-0.3c0-1.5-0.5-2.3-2-2.3 c-0.7,0-2.3,0.5-3.7,1.1L84,11c1.2-0.4,3-1,4.4-1c2.7,0,4.6,1.4,4.6,4.7L93,22z M90,16.4l-2.2,0.4c-0.7,0.1-1.4,0.5-1.4,1.6 c0,0.9,0.5,1.4,1.3,1.4s1.5-0.5,2.3-1V16.4z"></path><path d="M104.5,21.3c-1.1,0.4-2.2,0.6-3.5,0.6c-4.2,0-5.9-2.4-5.9-5.9c0-3.7,2.3-6,6.1-6c1.4,0,2.3,0.2,3.2,0.5V13 c-0.8-0.3-2-0.6-3.2-0.6c-1.7,0-3.2,0.9-3.2,3.6c0,2.9,1.5,3.8,3.3,3.8c0.9,0,1.9-0.2,3.2-0.7V21.3z"></path><path d="M110,15.2c0.2-0.3,0.2-0.8,3.8-5.2h3.7l-4.6,5.7l5,6.3h-3.7l-4.2-5.8V22h-3V6h3V15.2z"></path><path d="M58.5,21.3c-1.5,0.5-2.7,0.6-4.2,0.6c-3.6,0-5.8-1.8-5.8-6c0-3.1,1.9-5.9,5.5-5.9s4.9,2.5,4.9,4.9c0,0.8,0,1.5-0.1,2h-7.3 c0.1,2.5,1.5,2.8,3.6,2.8c1.1,0,2.2-0.3,3.4-0.7C58.5,19,58.5,21.3,58.5,21.3z M56,15c0-1.4-0.5-2.9-2-2.9c-1.4,0-2.3,1.3-2.4,2.9 C51.6,15,56,15,56,15z"></path></svg>
277 </a>
278 </div>
279 <?php
280 if ( $args['show-nav'] ) :
281 ?>
282 <div class="jp-masthead__nav">
283 <?php
284 if ( is_network_admin() ) {
285 $current_screen = get_current_screen();
286
287 $highlight_current_sites = ( 'toplevel_page_jetpack-network' === $current_screen->id ? 'is-primary' : '' );
288 $highlight_current_settings = ( 'jetpack_page_jetpack-settings-network' === $current_screen->id ? 'is-primary' : '' );
289 ?>
290 <span class="dops-button-group">
291 <?php
292 if ( current_user_can( 'jetpack_network_sites_page' ) ) {
293 ?>
294 <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>
295 <?php
296 } if ( current_user_can( 'jetpack_network_settings_page' ) ) {
297 ?>
298 <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>
299 <?php
300 }
301 ?>
302 </span>
303 <?php } else { ?>
304 <span class="dops-button-group">
305 <a href="<?php echo esc_url( $jetpack_admin_url ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Dashboard', 'jetpack' ); ?></a>
306 <?php
307 if ( current_user_can( 'jetpack_manage_modules' ) ) {
308 ?>
309 <a href="<?php echo esc_url( $jetpack_admin_url . '#/settings' ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Settings', 'jetpack' ); ?></a>
310 <?php
311 }
312 ?>
313 </span>
314 <?php } ?>
315 </div>
316 <?php endif; ?>
317 </div>
318 </div>
319 <div class="wrap"><div id="jp-admin-notices" aria-live="polite"></div></div>
320 <!-- START OF CALLBACK -->
321 <?php
322 ob_start();
323 call_user_func( $callback );
324 $callback_ui = ob_get_contents();
325 ob_end_clean();
326 echo $callback_ui;// phpcs:ignore WordPress.Security.EscapeOutput -- Callback is responsible for any needed escaping.
327 ?>
328 <!-- END OF CALLBACK -->
329
330 <div id="jp-stats-report-bottom">
331 <div class="wrap">
332 <?php
333 /**
334 * Fires at the bottom of the Jetpack admin page template, after the dynamic content section.
335 *
336 * @since 10.0.0
337 *
338 * @param string $callback The callback sent to the Jetpack_Admin_Page::wrap_ui method.
339 * @param array $args The arguments sent to the Jetpack_Admin_Page::wrap_ui method.
340 */
341 do_action( 'jetpack_admin_pages_wrap_ui_after_callback', $callback, $args );
342 ?>
343 </div>
344 </div>
345
346 <div class="jp-footer jp-footer--static">
347 <div class="jp-footer__container">
348 <div class="jp-footer__logo">
349 <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' ); ?>">
350 <desc id="jetpack-logo-title">
351 <?php esc_html_e( 'Jetpack Logo', 'jetpack' ); ?>
352 </desc>
353 <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>
354 </svg>
355 <span class="jp-footer__module-name">
356 <a href="<?php echo esc_url( Redirect::get_url( 'jetpack' ) ); ?>" target="_blank" rel="noopener noreferrer" aria-label="Jetpack 12.2-a.0">
357 <?php esc_html_e( 'Jetpack', 'jetpack' ); ?>
358 </a>
359 </span>
360 </div>
361 <div class="jp-footer__menu">
362 <a href="<?php echo esc_url( $jetpack_about_url ); ?>" title="<?php esc_attr__( 'About Jetpack', 'jetpack' ); ?>" class="jp-footer__menu-item">
363 <?php echo esc_html__( 'About', 'jetpack' ); ?>
364 </a>
365 <a href="<?php echo esc_url( $jetpack_privacy_url ); ?>" rel="noopener noreferrer" title="<?php esc_html_e( "Automattic's Privacy Policy", 'jetpack' ); ?>" class="jp-footer__menu-item <?php echo ! $connectable ? 'is-external' : ''; ?> ?>" target="<?php echo ! $connectable ? '_blank' : '_self'; ?>">
366 <?php echo esc_html_x( 'Privacy', 'Navigation item', 'jetpack' ); ?>
367 <?php echo ! $connectable ? $external_link_icon : ''; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
368 </a>
369 <a href="<?php echo esc_url( Redirect::get_url( 'wpcom-tos' ) ); ?>" target="_blank" rel="noopener noreferrer" title="<?php esc_html__( 'WordPress.com Terms of Service', 'jetpack' ); ?>" class="jp-footer__menu-item is-external">
370 <?php echo esc_html_x( 'Terms', 'Navigation item', 'jetpack' ); ?>
371 <?php echo $external_link_icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
372 </a>
373 <a href="<?php echo esc_url( Redirect::get_url( 'jetpack' ) ); ?>" target="_blank" rel="noopener noreferrer" aria-label="Jetpack 12.2-a.0" class="jp-footer__menu-item is-external">
374 Version <?php echo esc_html( JETPACK__VERSION ); ?>
375 <?php echo $external_link_icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
376 </a>
377 <?php if ( is_multisite() && current_user_can( 'jetpack_network_sites_page' ) ) { ?>
378 <a href="<?php echo esc_url( network_admin_url( 'admin.php?page=jetpack' ) ); ?>" title="<?php esc_html_e( "Manage your network's Jetpack Sites.", 'jetpack' ); ?>" class="jp-footer__menu-item"><?php echo esc_html_x( 'Network Sites', 'Navigation item', 'jetpack' ); ?></a>
379 <?php } ?>
380 <?php if ( is_multisite() && current_user_can( 'jetpack_network_settings_page' ) ) { ?>
381 <a href="<?php echo esc_url( network_admin_url( 'admin.php?page=jetpack-settings' ) ); ?>" title="<?php esc_html_e( "Manage your network's Jetpack Sites.", 'jetpack' ); ?>" class="jp-footer__menu-item"><?php echo esc_html_x( 'Network Settings', 'Navigation item', 'jetpack' ); ?></a>
382 <?php } ?>
383 <?php if ( current_user_can( 'manage_options' ) ) { ?>
384 <a href="<?php echo esc_url( admin_url( 'admin.php?page=jetpack_modules' ) ); ?>" title="<?php esc_html_e( 'Access the full list of Jetpack modules available on your site.', 'jetpack' ); ?>" class="jp-footer__menu-item"><?php echo esc_html_x( 'Modules', 'Navigation item', 'jetpack' ); ?></a>
385 <a href="<?php echo esc_url( admin_url( 'admin.php?page=jetpack-debugger' ) ); ?>" title="<?php esc_html_e( "Test your site's compatibility with Jetpack.", 'jetpack' ); ?>" class="jp-footer__menu-item"><?php echo esc_html_x( 'Debug', 'Navigation item', 'jetpack' ); ?></a>
386 <?php } ?>
387 </div>
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