Completed
Push — update/import-sync-detection ( 0bf98c...8808a0 )
by
unknown
25:48 queued 17:49
created

Jetpack_Admin_Page   F

Complexity

Total Complexity 61

Size/Duplication

Total Lines 349
Duplicated Lines 10.6 %

Coupling/Cohesion

Components 2
Dependencies 3

Importance

Changes 0
Metric Value
dl 37
loc 349
rs 3.52
c 0
b 0
f 0
wmc 61
lcom 2
cbo 3

17 Methods

Rating   Name   Duplication   Size   Complexity  
add_page_actions() 0 1 ?
get_page_hook() 0 1 ?
page_admin_scripts() 0 1 ?
page_render() 0 1 ?
A additional_styles() 0 1 1
A __construct() 0 6 2
A admin_head() 13 15 4
A render() 0 18 5
A admin_help() 0 3 1
A admin_page_load() 0 4 1
A admin_scripts() 0 4 1
A admin_styles() 0 7 3
C add_actions() 0 47 13
A is_rest_api_enabled() 0 9 3
C check_plan_deactivate_modules() 6 54 12
A load_wrapper_styles() 0 40 2
D wrap_ui() 18 85 13

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like Jetpack_Admin_Page often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Jetpack_Admin_Page, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
// Shared logic between Jetpack admin pages
4
abstract class Jetpack_Admin_Page {
5
	// Add page specific actions given the page hook
6
	abstract function add_page_actions( $hook );
7
8
	// Create a menu item for the page and returns the hook
9
	abstract function get_page_hook();
10
11
	// Enqueue and localize page specific scripts
12
	abstract function page_admin_scripts();
13
14
	// Render page specific HTML
15
	abstract function page_render();
16
17
	/**
18
	 * Should we block the page rendering because the site is in IDC?
19
	 * @var bool
20
	 */
21
	static $block_page_rendering_for_idc;
22
23
	/**
24
	 * Function called after admin_styles to load any additional needed styles.
25
	 *
26
	 * @since 4.3.0
27
	 */
28
	function additional_styles() {}
29
30
	function __construct() {
31
		$this->jetpack = Jetpack::init();
0 ignored issues
show
Bug introduced by
The property jetpack does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
32
		self::$block_page_rendering_for_idc = (
33
			Jetpack::validate_sync_error_idc_option() && ! Jetpack_Options::get_option( 'safe_mode_confirmed' )
34
		);
35
	}
36
37
	function add_actions() {
38
		global $pagenow;
39
40
		// If user is not an admin and site is in Dev Mode, don't do anything
41
		if ( ! current_user_can( 'manage_options' ) && Jetpack::is_development_mode() ) {
42
			return;
43
		}
44
45
		// Don't add in the modules page unless modules are available!
46
		if ( $this->dont_show_if_not_active && ! Jetpack::is_active() && ! Jetpack::is_development_mode() ) {
0 ignored issues
show
Bug introduced by
The property dont_show_if_not_active does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
47
			return;
48
		}
49
50
		// Initialize menu item for the page in the admin
51
		$hook = $this->get_page_hook();
52
53
		// Attach hooks common to all Jetpack admin pages based on the created
54
		// hook
55
		add_action( "load-$hook",                array( $this, 'admin_help'      ) );
56
		add_action( "load-$hook",                array( $this, 'admin_page_load' ) );
57
		add_action( "admin_head-$hook",          array( $this, 'admin_head'      ) );
58
59
		add_action( "admin_print_styles-$hook",  array( $this, 'admin_styles'    ) );
60
		add_action( "admin_print_scripts-$hook", array( $this, 'admin_scripts'   ) );
61
62
		if ( ! self::$block_page_rendering_for_idc ) {
63
			add_action( "admin_print_styles-$hook", array( $this, 'additional_styles' ) );
64
		}
65
		// If someone just activated Jetpack, let's show them a fullscreen connection banner.
66
		if (
67
			( 'admin.php' === $pagenow && isset( $_GET['page'] ) && 'jetpack' === $_GET['page'] )
68
			&& ! Jetpack::is_active()
69
			&& current_user_can( 'jetpack_connect' )
70
			&& ! Jetpack::is_development_mode()
71
		) {
72
			add_action( 'admin_enqueue_scripts', array( 'Jetpack_Connection_Banner', 'enqueue_banner_scripts' ) );
73
			add_action( 'admin_print_styles', array( Jetpack::init(), 'admin_banner_styles' ) );
74
			add_action( 'admin_notices', array( 'Jetpack_Connection_Banner', 'render_connect_prompt_full_screen' ) );
75
			delete_transient( 'activated_jetpack' );
76
		}
77
78
		// Check if the site plan changed and deactivate modules accordingly.
79
		add_action( 'current_screen', array( $this, 'check_plan_deactivate_modules' ) );
80
81
		// Attach page specific actions in addition to the above
82
		$this->add_page_actions( $hook );
83
	}
84
85
	function admin_head() {
86 View Code Duplication
		if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) && current_user_can( 'manage_options' ) ) {
87
			/**
88
			 * Fires in the <head> of a particular Jetpack configuration page.
89
			 *
90
			 * The dynamic portion of the hook name, `$_GET['configure']`,
91
			 * refers to the slug of module, such as 'stats', 'sso', etc.
92
			 * A complete hook for the latter would be
93
			 * 'jetpack_module_configuration_head_sso'.
94
			 *
95
			 * @since 3.0.0
96
			 */
97
			do_action( 'jetpack_module_configuration_head_' . $_GET['configure'] );
98
		}
99
	}
100
101
	// Render the page with a common top and bottom part, and page specific content
102
	function render() {
103
		// We're in an IDC: we need a decision made before we show the UI again.
104
		if ( self::$block_page_rendering_for_idc ) {
105
			return;
106
		}
107
108
		// Check if we are looking at the main dashboard
109
		if (
110
			isset( $_GET['page'] ) &&
111
			'jetpack' === $_GET['page'] &&
112
		     empty( $_GET['configure'] )
113
		)
114
		{
115
			$this->page_render();
116
			return;
117
		}
118
		Jetpack_Admin_Page::wrap_ui( array( $this, 'page_render' ) );
119
	}
120
121
	function admin_help() {
122
		$this->jetpack->admin_help();
123
	}
124
125
	function admin_page_load() {
126
		// This is big.  For the moment, just call the existing one.
127
		$this->jetpack->admin_page_load();
128
	}
129
130
	// Add page specific scripts and jetpack stats for all menu pages
131
	function admin_scripts() {
132
		$this->page_admin_scripts(); // Delegate to inheriting class
133
		add_action( 'admin_footer', array( $this->jetpack, 'do_stats' ) );
134
	}
135
136
	// Enqueue the Jetpack admin stylesheet
137
	function admin_styles() {
138
		$min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
139
140
		wp_enqueue_style( 'jetpack-admin', plugins_url( "css/jetpack-admin{$min}.css", JETPACK__PLUGIN_FILE ), array( 'genericons' ), JETPACK__VERSION . '-20121016' );
141
		wp_style_add_data( 'jetpack-admin', 'rtl', 'replace' );
142
		wp_style_add_data( 'jetpack-admin', 'suffix', $min );
143
	}
144
145
	/**
146
	 * Checks if REST API is enabled.
147
	 *
148
	 * @since 4.4.2
149
	 *
150
	 * @return bool
151
	 */
152
	function is_rest_api_enabled() {
153
		return
154
			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
155
			apply_filters( 'rest_enabled', true ) &&
156
			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
157
			apply_filters( 'rest_jsonp_enabled', true ) &&
158
			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
159
			apply_filters( 'rest_authentication_errors', true );
160
	}
161
162
	/**
163
	 * Checks the site plan and deactivates modules that were active but are no longer included in the plan.
164
	 *
165
	 * @since 4.4.0
166
	 *
167
	 * @param $page
168
	 *
169
	 * @return array
170
	 */
171
	function check_plan_deactivate_modules( $page ) {
172
		if (
173
			Jetpack::is_development_mode()
174
			|| ! in_array(
175
				$page->base,
176
				array(
177
					'toplevel_page_jetpack',
178
					'admin_page_jetpack_modules',
179
					'jetpack_page_vaultpress',
180
					'jetpack_page_stats',
181
					'jetpack_page_akismet-key-config'
182
				)
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 View Code Duplication
				case 'jetpack_free':
195
					$to_deactivate = array( 'seo-tools', 'videopress', 'google-analytics', 'wordads', 'search' );
196
					break;
197
				case 'jetpack_personal':
198 View Code Duplication
				case 'jetpack_personal_monthly':
199
					$to_deactivate = array( 'seo-tools', 'videopress', 'google-analytics', 'wordads', 'search' );
200
					break;
201
				case 'jetpack_premium':
202
				case 'jetpack_premium_monthly':
203
					$to_deactivate = array( 'seo-tools', 'google-analytics', 'search' );
204
					break;
205
			}
206
			$to_deactivate = array_intersect( $active, $to_deactivate );
207
208
			$to_leave_enabled = array();
209
			foreach ( $to_deactivate as $feature ) {
210
				if ( Jetpack_Plan::supports( $feature ) ) {
211
					$to_leave_enabled []= $feature;
212
				}
213
			}
214
			$to_deactivate = array_diff( $to_deactivate, $to_leave_enabled );
215
216
			if ( ! empty( $to_deactivate ) ) {
217
				Jetpack::update_active_modules( array_filter( array_diff( $active, $to_deactivate ) ) );
218
			}
219
		}
220
		return array(
221
			'current'    => $current,
222
			'deactivate' => $to_deactivate
223
		);
224
	}
225
226
	static function load_wrapper_styles( ) {
227
		$rtl = is_rtl() ? '.rtl' : '';
228
		wp_enqueue_style( 'dops-css', plugins_url( "_inc/build/admin.dops-style{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
229
		wp_enqueue_style( 'components-css', plugins_url( "_inc/build/style.min{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
230
		$custom_css = '
231
			#wpcontent {
232
				padding-left: 0 !important;
233
			}
234
			#wpbody-content {
235
				background-color: #f6f6f6;
236
			}
237
238
			#jp-plugin-container .wrap {
239
				margin: 0 auto;
240
				max-width:45rem;
241
				padding: 0 1.5rem;
242
			}
243
			#jp-plugin-container.is-wide .wrap {
244
				max-width: 1040px;
245
			}
246
			#jp-plugin-container .wrap .jetpack-wrap-container {
247
				margin-top: 1em;
248
			}
249
			.wp-admin #dolly {
250
			    float: none;
251
			    position: relative;
252
			    right: 0;
253
			    left: 0;
254
			    top: 0;
255
			    padding: .625rem;
256
			    text-align: right;
257
			    background: #fff;
258
			    font-size: .75rem;
259
			    font-style: italic;
260
			    color: #87a6bc;
261
			    border-bottom: 1px #e9eff3 solid;
262
			}
263
		';
264
		wp_add_inline_style( 'dops-css', $custom_css );
265
	}
266
267
	static function wrap_ui( $callback, $args = array() ) {
268
		$defaults = array(
269
			'is-wide' => false,
270
		);
271
		$args = wp_parse_args( $args, $defaults );
272
		$jetpack_admin_url = admin_url( 'admin.php?page=jetpack' );
273
274
		?>
275
		<div id="jp-plugin-container" class="<?php if ( $args['is-wide'] ) { echo "is-wide"; } ?>">
276
277
			<div class="jp-masthead">
278
				<div class="jp-masthead__inside-container">
279
					<div class="jp-masthead__logo-container">
280
						<a class="jp-masthead__logo-link" href="<?php echo esc_url( $jetpack_admin_url ); ?>">
281
							<svg class="jetpack-logo__masthead" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" height="32" viewBox="0 0 118 32"><path fill="#00BE28" 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>
282
						</a>
283
					</div>
284
					<div class="jp-masthead__nav">
285
						<?php if ( is_network_admin() ) {
286
							$current_screen = get_current_screen();
287
288
							$highlight_current_sites = ( 'toplevel_page_jetpack-network' === $current_screen->id  ? 'is-primary' : '' );
289
							$highlight_current_settings = ( 'jetpack_page_jetpack-settings-network' === $current_screen->id  ? 'is-primary' : '' );
290
							?>
291
							<span class="dops-button-group">
292
								<?php
293 View Code Duplication
								if ( current_user_can( 'jetpack_network_sites_page' ) ) {
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><?php
295
								} if ( current_user_can( 'jetpack_network_settings_page' ) ) {
296
									?><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><?php
297
								} ?>
298
							</span>
299
						<?php } else { ?>
300
							<span class="dops-button-group">
301
								<a href="<?php echo esc_url( $jetpack_admin_url ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Dashboard', 'jetpack' ); ?></a><?php
302
								if ( current_user_can( 'jetpack_manage_modules' ) ) {
303
									?><a href="<?php echo esc_url( $jetpack_admin_url . '#/settings' ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Settings', 'jetpack' ); ?></a><?php
304
								} ?>
305
							</span>
306
						<?php } ?>
307
					</div>
308
				</div>
309
			</div>
310
			<div class="wrap"><div id="jp-admin-notices" aria-live="polite"></div></div>
311
			<!-- START OF CALLBACK -->
312
			<?php
313
			ob_start();
314
			call_user_func( $callback );
315
			$callback_ui = ob_get_contents();
316
			ob_end_clean();
317
			echo $callback_ui;
318
			?>
319
			<!-- END OF CALLBACK -->
320
			<div class="jp-footer">
321
				<div class="jp-footer__a8c-attr-container"><a href="https://automattic.com" target="_blank" rel="noopener noreferrer"><svg role="img" class="jp-footer__a8c-attr" x="0" y="0" viewBox="0 0 935 38.2" enable-background="new 0 0 935 38.2" aria-labelledby="a8c-svg-title"><title id="a8c-svg-title">An Automattic Airline</title><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></svg></a></div>
322
				<ul class="jp-footer__links">
323
					<li class="jp-footer__link-item">
324
						<a href="https://jetpack.com" target="_blank" rel="noopener noreferrer" class="jp-footer__link" title="<?php esc_html_e( 'Jetpack version', 'jetpack' ); ?>">Jetpack <?php echo JETPACK__VERSION; ?></a>
325
					</li>
326
					<li class="jp-footer__link-item">
327
						<a href="https://wordpress.com/tos/" target="_blank" rel="noopener noreferrer" title="<?php esc_html__( 'WordPress.com Terms of Service', 'jetpack' ); ?>" class="jp-footer__link"><?php echo esc_html_x( 'Terms', 'Navigation item', 'jetpack' ); ?></a>
328
					</li>
329
					<li class="jp-footer__link-item">
330
						<a href="<?php echo esc_url( $jetpack_admin_url . '#/privacy' ); ?>" rel="noopener noreferrer" title="<?php esc_html_e( "Automattic's Privacy Policy", 'jetpack' ); ?>" class="jp-footer__link"><?php echo esc_html_x( 'Privacy', 'Navigation item', 'jetpack' ); ?></a>
331
					</li>
332 View Code Duplication
					<?php if ( is_multisite() && current_user_can( 'jetpack_network_sites_page' ) ) { ?>
333
						<li class="jp-footer__link-item">
334
							<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__link"><?php echo esc_html_x( 'Network Sites', 'Navigation item', 'jetpack' ); ?></a>
335
						</li>
336
					<?php } ?>
337 View Code Duplication
					<?php if ( is_multisite() && current_user_can( 'jetpack_network_settings_page' ) ) { ?>
338
						<li class="jp-footer__link-item">
339
							<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__link"><?php echo esc_html_x( 'Network Settings', 'Navigation item', 'jetpack' ); ?></a>
340
						</li>
341
					<?php } ?>
342 View Code Duplication
					<?php if ( current_user_can( 'manage_options' ) ) { ?>
343
						<li class="jp-footer__link-item">
344
							<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__link"><?php echo esc_html_x( 'Debug', 'Navigation item', 'jetpack' ); ?></a>
345
						</li>
346
					<?php } ?>
347
				</ul>
348
			</div>
349
		</div>
350
<?php return;
351
	}
352
}
353