Completed
Push — add/crowdsignal-shortcode ( 65c42e...1b4a63 )
by Kuba
14:46 queued 06:22
created

Jetpack_Admin_Page   C

Complexity

Total Complexity 57

Size/Duplication

Total Lines 345
Duplicated Lines 10.72 %

Coupling/Cohesion

Components 2
Dependencies 2

Importance

Changes 0
Metric Value
dl 37
loc 345
rs 5.04
c 0
b 0
f 0
wmc 57
lcom 2
cbo 2

18 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
B add_actions() 0 34 7
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
A is_wp_version_too_old() 0 4 2
A is_rest_api_enabled() 0 9 3
C check_plan_deactivate_modules() 6 54 12
A load_wrapper_styles() 0 37 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
39
		// If user is not an admin and site is in Dev Mode, don't do anything
40
		if ( ! current_user_can( 'manage_options' ) && Jetpack::is_development_mode() ) {
41
			return;
42
		}
43
44
		// Don't add in the modules page unless modules are available!
45
		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...
46
			return;
47
		}
48
49
		// Initialize menu item for the page in the admin
50
		$hook = $this->get_page_hook();
51
52
		// Attach hooks common to all Jetpack admin pages based on the created
53
		// hook
54
		add_action( "load-$hook",                array( $this, 'admin_help'      ) );
55
		add_action( "load-$hook",                array( $this, 'admin_page_load' ) );
56
		add_action( "admin_head-$hook",          array( $this, 'admin_head'      ) );
57
58
		add_action( "admin_print_styles-$hook",  array( $this, 'admin_styles'    ) );
59
		add_action( "admin_print_scripts-$hook", array( $this, 'admin_scripts'   ) );
60
61
		if ( ! self::$block_page_rendering_for_idc ) {
62
			add_action( "admin_print_styles-$hook", array( $this, 'additional_styles' ) );
63
		}
64
65
		// Check if the site plan changed and deactivate modules accordingly.
66
		add_action( 'current_screen', array( $this, 'check_plan_deactivate_modules' ) );
67
68
		// Attach page specific actions in addition to the above
69
		$this->add_page_actions( $hook );
70
	}
71
72
	function admin_head() {
73 View Code Duplication
		if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) && current_user_can( 'manage_options' ) ) {
74
			/**
75
			 * Fires in the <head> of a particular Jetpack configuation page.
76
			 *
77
			 * The dynamic portion of the hook name, `$_GET['configure']`,
78
			 * refers to the slug of module, such as 'stats', 'sso', etc.
79
			 * A complete hook for the latter would be
80
			 * 'jetpack_module_configuation_head_sso'.
81
			 *
82
			 * @since 3.0.0
83
			 */
84
			do_action( 'jetpack_module_configuration_head_' . $_GET['configure'] );
85
		}
86
	}
87
88
	// Render the page with a common top and bottom part, and page specific content
89
	function render() {
90
		// We're in an IDC: we need a decision made before we show the UI again.
91
		if ( self::$block_page_rendering_for_idc ) {
92
			return;
93
		}
94
95
		// Check if we are looking at the main dashboard
96
		if (
97
			isset( $_GET['page'] ) &&
98
			'jetpack' === $_GET['page'] &&
99
		     empty( $_GET['configure'] )
100
		)
101
		{
102
			$this->page_render();
103
			return;
104
		}
105
		Jetpack_Admin_Page::wrap_ui( array( $this, 'page_render' ) );
106
	}
107
108
	function admin_help() {
109
		$this->jetpack->admin_help();
110
	}
111
112
	function admin_page_load() {
113
		// This is big.  For the moment, just call the existing one.
114
		$this->jetpack->admin_page_load();
115
	}
116
117
	// Add page specific scripts and jetpack stats for all menu pages
118
	function admin_scripts() {
119
		$this->page_admin_scripts(); // Delegate to inheriting class
120
		add_action( 'admin_footer', array( $this->jetpack, 'do_stats' ) );
121
	}
122
123
	// Enqueue the Jetpack admin stylesheet
124
	function admin_styles() {
125
		$min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
126
127
		wp_enqueue_style( 'jetpack-admin', plugins_url( "css/jetpack-admin{$min}.css", JETPACK__PLUGIN_FILE ), array( 'genericons' ), JETPACK__VERSION . '-20121016' );
128
		wp_style_add_data( 'jetpack-admin', 'rtl', 'replace' );
129
		wp_style_add_data( 'jetpack-admin', 'suffix', $min );
130
	}
131
132
	/**
133
	 * Checks if WordPress version is too old to have REST API.
134
	 *
135
	 * @since 4.3
136
	 *
137
	 * @return bool
138
	 */
139
	function is_wp_version_too_old() {
140
		global $wp_version;
141
		return ( ! function_exists( 'rest_api_init' ) || version_compare( $wp_version, '4.4-z', '<=' ) );
142
	}
143
144
	/**
145
	 * Checks if REST API is enabled.
146
	 *
147
	 * @since 4.4.2
148
	 *
149
	 * @return bool
150
	 */
151
	function is_rest_api_enabled() {
152
		return
153
			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
154
			apply_filters( 'rest_enabled', true ) &&
155
			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
156
			apply_filters( 'rest_jsonp_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 $page
167
	 *
168
	 * @return array
169
	 */
170
	function check_plan_deactivate_modules( $page ) {
171
		if (
172
			Jetpack::is_development_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
			)
183
		) {
184
			return false;
185
		}
186
187
		$current = Jetpack::get_active_plan();
188
189
		$to_deactivate = array();
190
		if ( isset( $current['product_slug'] ) ) {
191
			$active = Jetpack::get_active_modules();
192
			switch ( $current['product_slug'] ) {
193 View Code Duplication
				case 'jetpack_free':
194
					$to_deactivate = array( 'seo-tools', 'videopress', 'google-analytics', 'wordads', 'search' );
195
					break;
196
				case 'jetpack_personal':
197 View Code Duplication
				case 'jetpack_personal_monthly':
198
					$to_deactivate = array( 'seo-tools', 'videopress', 'google-analytics', 'wordads', 'search' );
199
					break;
200
				case 'jetpack_premium':
201
				case 'jetpack_premium_monthly':
202
					$to_deactivate = array( 'seo-tools', 'google-analytics', 'search' );
203
					break;
204
			}
205
			$to_deactivate = array_intersect( $active, $to_deactivate );
206
207
			$to_leave_enabled = array();
208
			foreach ( $to_deactivate as $feature ) {
209
				if ( Jetpack::active_plan_supports( $feature ) ) {
210
					$to_leave_enabled []= $feature;
211
				}
212
			}
213
			$to_deactivate = array_diff( $to_deactivate, $to_leave_enabled );
214
215
			if ( ! empty( $to_deactivate ) ) {
216
				Jetpack::update_active_modules( array_filter( array_diff( $active, $to_deactivate ) ) );
217
			}
218
		}
219
		return array(
220
			'current'    => $current,
221
			'deactivate' => $to_deactivate
222
		);
223
	}
224
225
	static function load_wrapper_styles( ) {
226
		$rtl = is_rtl() ? '.rtl' : '';
227
		wp_enqueue_style( 'dops-css', plugins_url( "_inc/build/admin.dops-style{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
228
		wp_enqueue_style( 'components-css', plugins_url( "_inc/build/style.min{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
229
		$custom_css = '
230
			#wpcontent {
231
				padding-left: 0 !important;
232
			}
233
			#wpbody-content {
234
				background-color: #f3f6f8;
235
			}
236
			
237
			#jp-plugin-container .wrap {
238
				margin: 0 auto;
239
				max-width:45rem;
240
				padding: 0 1.5rem;
241
			}
242
			#jp-plugin-container.is-wide .wrap {
243
				max-width: 1040px;
244
			}
245
			.wp-admin #dolly {
246
			    float: none;
247
			    position: relative;
248
			    right: 0;
249
			    left: 0;
250
			    top: 0;
251
			    padding: .625rem;
252
			    text-align: right;
253
			    background: #fff;
254
			    font-size: .75rem;
255
			    font-style: italic;
256
			    color: #87a6bc;
257
			    border-bottom: 1px #e9eff3 solid;
258
			}
259
		';
260
		wp_add_inline_style( 'dops-css', $custom_css );
261
	}
262
263
	static function wrap_ui( $callback, $args = array() ) {
264
		$defaults = array(
265
			'is-wide' => false,
266
		);
267
		$args = wp_parse_args( $args, $defaults );
268
		$jetpack_admin_url = admin_url( 'admin.php?page=jetpack' );
269
270
		?>
271
		<div id="jp-plugin-container" class="<?php if ( $args['is-wide'] ) { echo "is-wide"; } ?>">
272
273
			<div class="jp-masthead">
274
				<div class="jp-masthead__inside-container">
275
					<div class="jp-masthead__logo-container">
276
						<a class="jp-masthead__logo-link" href="<?php echo esc_url( $jetpack_admin_url ); ?>">
277
							<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>
278
						</a>
279
					</div>
280
					<div class="jp-masthead__nav">
281
						<?php if ( is_network_admin() ) {
282
							$current_screen = get_current_screen();
283
284
							$highlight_current_sites = ( 'toplevel_page_jetpack-network' === $current_screen->id  ? 'is-primary' : '' );
285
							$highlight_current_settings = ( 'jetpack_page_jetpack-settings-network' === $current_screen->id  ? 'is-primary' : '' );
286
							?>
287
							<span class="dops-button-group">
288
								<?php
289 View Code Duplication
								if ( current_user_can( 'jetpack_network_sites_page' ) ) {
290
									?><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
291
								} if ( current_user_can( 'jetpack_network_settings_page' ) ) {
292
									?><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
293
								} ?>
294
							</span>
295
						<?php } else { ?>
296
							<span class="dops-button-group">
297
								<a href="<?php echo esc_url( $jetpack_admin_url ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Dashboard', 'jetpack' ); ?></a><?php
298
								if ( current_user_can( 'jetpack_manage_modules' ) ) {
299
									?><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
300
								} ?>
301
							</span>
302
						<?php } ?>
303
					</div>
304
				</div>
305
			</div>
306
			<div class="wrap"><div id="jp-admin-notices" aria-live="polite"></div></div>
307
			<!-- START OF CALLBACK -->
308
			<?php
309
			ob_start();
310
			call_user_func( $callback );
311
			$callback_ui = ob_get_contents();
312
			ob_end_clean();
313
			echo $callback_ui;
314
			?>
315
			<!-- END OF CALLBACK -->
316
			<div class="jp-footer">
317
				<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>
318
				<ul class="jp-footer__links">
319
					<li class="jp-footer__link-item">
320
						<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>
321
					</li>
322
					<li class="jp-footer__link-item">
323
						<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>
324
					</li>
325
					<li class="jp-footer__link-item">
326
						<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>
327
					</li>
328 View Code Duplication
					<?php if ( is_multisite() && current_user_can( 'jetpack_network_sites_page' ) ) { ?>
329
						<li class="jp-footer__link-item">
330
							<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>
331
						</li>
332
					<?php } ?>
333 View Code Duplication
					<?php if ( is_multisite() && current_user_can( 'jetpack_network_settings_page' ) ) { ?>
334
						<li class="jp-footer__link-item">
335
							<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>
336
						</li>
337
					<?php } ?>
338 View Code Duplication
					<?php if ( current_user_can( 'manage_options' ) ) { ?>
339
						<li class="jp-footer__link-item">
340
							<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>
341
						</li>
342
					<?php } ?>
343
				</ul>
344
			</div>
345
		</div>
346
<?php return;
347
	}
348
}
349