Completed
Push — add/e2e-mock-plan-data ( 230928...216737 )
by Yaroslav
14:00 queued 07:08
created

Jetpack_Admin_Page::the_footer_link()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 1
nop 4
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
use Automattic\Jetpack\Status;
4
5
// Shared logic between Jetpack admin pages
6
abstract class Jetpack_Admin_Page {
7
	// Add page specific actions given the page hook
8
	abstract function add_page_actions( $hook );
9
10
	// Create a menu item for the page and returns the hook
11
	abstract function get_page_hook();
12
13
	// Enqueue and localize page specific scripts
14
	abstract function page_admin_scripts();
15
16
	// Render page specific HTML
17
	abstract function page_render();
18
19
	/**
20
	 * Should we block the page rendering because the site is in IDC?
21
	 *
22
	 * @var bool
23
	 */
24
	static $block_page_rendering_for_idc;
25
26
	/**
27
	 * Function called after admin_styles to load any additional needed styles.
28
	 *
29
	 * @since 4.3.0
30
	 */
31
	function additional_styles() {}
32
33
	/**
34
	 * The constructor.
35
	 */
36
	public function __construct() {
37
		add_action( 'jetpack_loaded', array( $this, 'on_jetpack_loaded' ) );
38
	}
39
40
	/**
41
	 * Runs on Jetpack being ready to load its packages.
42
	 *
43
	 * @param Jetpack $jetpack object.
44
	 */
45
	public function on_jetpack_loaded( $jetpack ) {
46
		$this->jetpack = $jetpack;
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...
47
48
		self::$block_page_rendering_for_idc = (
49
			Jetpack::validate_sync_error_idc_option() && ! Jetpack_Options::get_option( 'safe_mode_confirmed' )
50
		);
51
	}
52
53
	function add_actions() {
54
		global $pagenow;
55
56
		$is_development_mode = ( new Status() )->is_development_mode();
57
		// If user is not an admin and site is in Dev Mode or not connected yet then don't do anything.
58
		if ( ! current_user_can( 'manage_options' ) && ( $is_development_mode || ! Jetpack::is_active() ) ) {
59
			return;
60
		}
61
62
		// Don't add in the modules page unless modules are available!
63
		if ( $this->dont_show_if_not_active && ! Jetpack::is_active() && ! $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...
64
			return;
65
		}
66
67
		// Initialize menu item for the page in the admin
68
		$hook = $this->get_page_hook();
69
70
		// Attach hooks common to all Jetpack admin pages based on the created
71
		// hook
72
		add_action( "load-$hook", array( $this, 'admin_help' ) );
73
		add_action( "load-$hook", array( $this, 'admin_page_load' ) );
74
		add_action( "admin_print_styles-$hook", array( $this, 'admin_styles' ) );
75
		add_action( "admin_print_scripts-$hook", array( $this, 'admin_scripts' ) );
76
77
		if ( ! self::$block_page_rendering_for_idc ) {
78
			add_action( "admin_print_styles-$hook", array( $this, 'additional_styles' ) );
79
		}
80
		// If someone just activated Jetpack, let's show them a fullscreen connection banner.
81
		if (
82
			( 'admin.php' === $pagenow && isset( $_GET['page'] ) && 'jetpack' === $_GET['page'] )
83
			&& ! Jetpack::is_active()
84
			&& current_user_can( 'jetpack_connect' )
85
			&& ! $is_development_mode
86
		) {
87
			add_action( 'admin_enqueue_scripts', array( 'Jetpack_Connection_Banner', 'enqueue_banner_scripts' ) );
88
			add_action( 'admin_enqueue_scripts', array( 'Jetpack_Connection_Banner', 'enqueue_connect_button_scripts' ) );
89
			add_action( 'admin_print_styles', array( Jetpack::init(), 'admin_banner_styles' ) );
90
			add_action( 'admin_notices', array( 'Jetpack_Connection_Banner', 'render_connect_prompt_full_screen' ) );
91
			delete_transient( 'activated_jetpack' );
92
		}
93
94
		// If Jetpack not yet connected, but user is viewing one of the pages with a Jetpack connection banner.
95
		if (
96
			( 'index.php' === $pagenow || 'plugins.php' === $pagenow )
97
			&& ! Jetpack::is_active()
98
			&& current_user_can( 'jetpack_connect' )
99
			&& ! $is_development_mode
100
		) {
101
			add_action( 'admin_enqueue_scripts', array( 'Jetpack_Connection_Banner', 'enqueue_connect_button_scripts' ) );
102
		}
103
104
		// Check if the site plan changed and deactivate modules accordingly.
105
		add_action( 'current_screen', array( $this, 'check_plan_deactivate_modules' ) );
106
107
		// Attach page specific actions in addition to the above
108
		$this->add_page_actions( $hook );
109
	}
110
111
	// Render the page with a common top and bottom part, and page specific content
112
	function render() {
113
		// We're in an IDC: we need a decision made before we show the UI again.
114
		if ( self::$block_page_rendering_for_idc ) {
115
			return;
116
		}
117
118
		// Check if we are looking at the main dashboard
119
		if ( isset( $_GET['page'] ) && 'jetpack' === $_GET['page'] ) {
120
			$this->page_render();
121
			return;
122
		}
123
		self::wrap_ui( array( $this, 'page_render' ) );
124
	}
125
126
	function admin_help() {
127
		$this->jetpack->admin_help();
128
	}
129
130
	function admin_page_load() {
131
		// This is big.  For the moment, just call the existing one.
132
		$this->jetpack->admin_page_load();
133
	}
134
135
	// Add page specific scripts and jetpack stats for all menu pages
136
	function admin_scripts() {
137
		$this->page_admin_scripts(); // Delegate to inheriting class
138
		add_action( 'admin_footer', array( $this->jetpack, 'do_stats' ) );
139
	}
140
141
	// Enqueue the Jetpack admin stylesheet
142
	function admin_styles() {
143
		$min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
144
145
		wp_enqueue_style( 'jetpack-admin', plugins_url( "css/jetpack-admin{$min}.css", JETPACK__PLUGIN_FILE ), array( 'genericons' ), JETPACK__VERSION . '-20121016' );
146
		wp_style_add_data( 'jetpack-admin', 'rtl', 'replace' );
147
		wp_style_add_data( 'jetpack-admin', 'suffix', $min );
148
	}
149
150
	/**
151
	 * Checks if REST API is enabled.
152
	 *
153
	 * @since 4.4.2
154
	 *
155
	 * @return bool
156
	 */
157
	function is_rest_api_enabled() {
158
		return /** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
159
			apply_filters( 'rest_enabled', true ) &&
160
			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
161
			apply_filters( 'rest_jsonp_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 $page
172
	 *
173
	 * @return array
174
	 */
175
	function check_plan_deactivate_modules( $page ) {
176
		if (
177
			( new Status() )->is_development_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
			)
188
		) {
189
			return false;
190
		}
191
192
		$current = Jetpack_Plan::get();
193
194
		$to_deactivate = array();
195
		if ( isset( $current['product_slug'] ) ) {
196
			$active = Jetpack::get_active_modules();
197
			switch ( $current['product_slug'] ) {
198 View Code Duplication
				case 'jetpack_free':
199
					$to_deactivate = array( 'seo-tools', 'videopress', 'google-analytics', 'wordads', 'search' );
200
					break;
201
				case 'jetpack_personal':
202 View Code Duplication
				case 'jetpack_personal_monthly':
203
					$to_deactivate = array( 'seo-tools', 'videopress', 'google-analytics', 'wordads', 'search' );
204
					break;
205
				case 'jetpack_premium':
206
				case 'jetpack_premium_monthly':
207
					$to_deactivate = array( 'seo-tools', 'google-analytics', 'search' );
208
					break;
209
			}
210
			$to_deactivate = array_intersect( $active, $to_deactivate );
211
212
			$to_leave_enabled = array();
213
			foreach ( $to_deactivate as $feature ) {
214
				if ( Jetpack_Plan::supports( $feature ) ) {
215
					$to_leave_enabled [] = $feature;
216
				}
217
			}
218
			$to_deactivate = array_diff( $to_deactivate, $to_leave_enabled );
219
220
			if ( ! empty( $to_deactivate ) ) {
221
				Jetpack::update_active_modules( array_filter( array_diff( $active, $to_deactivate ) ) );
222
			}
223
		}
224
		return array(
225
			'current'    => $current,
226
			'deactivate' => $to_deactivate,
227
		);
228
	}
229
230
	static function load_wrapper_styles() {
231
		$rtl = is_rtl() ? '.rtl' : '';
232
		wp_enqueue_style( 'dops-css', plugins_url( "_inc/build/admin{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
233
		wp_enqueue_style( 'components-css', plugins_url( "_inc/build/style.min{$rtl}.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
234
		$custom_css = '
235
			#wpcontent {
236
				padding-left: 0 !important;
237
			}
238
			#wpbody-content {
239
				background-color: #f6f6f6;
240
			}
241
242
			#jp-plugin-container .wrap {
243
				margin: 0 auto;
244
				max-width:45rem;
245
				padding: 0 1.5rem;
246
			}
247
			#jp-plugin-container.is-wide .wrap {
248
				max-width: 1040px;
249
			}
250
			#jp-plugin-container .wrap .jetpack-wrap-container {
251
				margin-top: 1em;
252
			}
253
			.wp-admin #dolly {
254
			    float: none;
255
			    position: relative;
256
			    right: 0;
257
			    left: 0;
258
			    top: 0;
259
			    padding: .625rem;
260
			    text-align: right;
261
			    background: #fff;
262
			    font-size: .75rem;
263
			    font-style: italic;
264
			    color: #87a6bc;
265
			    border-bottom: 1px #e9eff3 solid;
266
			}
267
		';
268
		wp_add_inline_style( 'dops-css', $custom_css );
269
	}
270
271
	public static function wrap_ui( $callback, $args = array() ) {
272
		$defaults          = array(
273
			'is-wide'  => false,
274
			'show-nav' => true,
275
		);
276
		$args              = wp_parse_args( $args, $defaults );
277
		$jetpack_admin_url = admin_url( 'admin.php?page=jetpack' );
278
279
		?>
280
		<div id="jp-plugin-container" class="
281
		<?php
282
		if ( $args['is-wide'] ) {
283
			echo 'is-wide'; }
284
		?>
285
		">
286
287
			<div class="jp-masthead">
288
				<div class="jp-masthead__inside-container">
289
					<div class="jp-masthead__logo-container">
290
						<a class="jp-masthead__logo-link" href="<?php echo esc_url( $jetpack_admin_url ); ?>">
291
							<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>
292
						</a>
293
					</div>
294
					<?php
295
					if ( $args['show-nav'] ) :
296
						?>
297
						<div class="jp-masthead__nav">
298
							<?php
299
							if ( is_network_admin() ) {
300
								$current_screen = get_current_screen();
301
								$highlight_current_sites    = ( 'toplevel_page_jetpack-network' === $current_screen->id ? 'is-primary' : '' );
302
								$highlight_current_settings = ( 'jetpack_page_jetpack-settings-network' === $current_screen->id ? 'is-primary' : '' );
303
								?>
304
								<span class="dops-button-group">
305
									<?php
306
									if ( current_user_can( 'jetpack_network_sites_page' ) ) {
307
										?>
308
										<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>
309
										<?php
310
									} if ( current_user_can( 'jetpack_network_settings_page' ) ) {
311
										?>
312
										<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>
313
										<?php
314
									}
315
									?>
316
								</span>
317
							<?php } else { ?>
318
								<span class="dops-button-group">
319
									<a href="<?php echo esc_url( $jetpack_admin_url ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Dashboard', 'jetpack' ); ?></a>
320
														<?php
321
														if ( current_user_can( 'jetpack_manage_modules' ) ) {
322
															?>
323
										<a href="<?php echo esc_url( $jetpack_admin_url . '#/settings' ); ?>" type="button" class="dops-button is-compact"><?php esc_html_e( 'Settings', 'jetpack' ); ?></a>
324
															<?php
325
														}
326
														?>
327
								</span>
328
							<?php } ?>
329
						</div>
330
					<?php endif; ?>
331
				</div>
332
			</div>
333
			<div class="wrap"><div id="jp-admin-notices" aria-live="polite"></div></div>
334
			<!-- START OF CALLBACK -->
335
			<?php
336
			ob_start();
337
			call_user_func( $callback );
338
			$callback_ui = ob_get_contents();
339
			ob_end_clean();
340
			echo $callback_ui;
341
			?>
342
			<!-- END OF CALLBACK -->
343
			<?php self::render_footer(); ?>
344
		</div>
345
		<?php
346
		return;
347
	}
348
349
	/**
350
	 * Output a list item with a link.
351
	 *
352
	 * @param string $url         URL.
353
	 * @param string $title       Link title attribute.
354
	 * @param string $text        Link text.
355
	 * @param bool   $is_internal Is the link linking to an internal or external domain.
356
	 */
357
	public static function the_footer_link( $url, $title, $text, $is_internal = true ) {
358
		printf(
359
			'<li class="jp-footer__link-item"><a class="jp-footer__link" href="%1$s" title="%2$s" %4$s>%3$s</a></li>',
360
			esc_url( $url ),
361
			esc_attr( $title ),
362
			esc_html( $text ),
363
			( $is_internal ? '' : 'target="_blank" rel="noopener noreferrer"' )
364
		);
365
	}
366
367
	/**
368
	 * Render the footer of the jetpack dashboard. For admin pages.
369
	 *
370
	 * Note that the Jetpack Dashboard may append additional links to that list.
371
	 */
372
	public static function render_footer() {
373
		$admin_url = admin_url( 'admin.php?page=jetpack' );
374
375
		$is_dev_mode_or_connected = Jetpack::is_active() || ( new Status() )->is_development_mode();
376
377
		$privacy_url = ( $is_dev_mode_or_connected )
378
			? $admin_url . '#/privacy'
379
			: 'https://automattic.com/privacy/';
380
381
		$about_url = ( $is_dev_mode_or_connected )
382
			? admin_url( 'admin.php?page=jetpack_about' )
383
			: 'https://jetpack.com';
384
385
		?>
386
		<div class="jp-footer">
387
				<div class="jp-footer__a8c-attr-container">
388
					<a href="<?php echo esc_url( $about_url ); ?>">
389
						<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>
390
					</a>
391
				</div>
392
				<ul class="jp-footer__links" id="jp-footer__links-id">
393
					<?php
394
					// Version number.
395
					self::the_footer_link(
396
						'https://jetpack.com',
397
						__( 'Jetpack version', 'jetpack' ),
398
						sprintf(
399
							/* Translators: placeholder is a number. */
400
							__( 'Jetpack version %s', 'jetpack' ),
401
							JETPACK__VERSION
402
						),
403
						false
404
					);
405
406
					// About page.
407
					self::the_footer_link(
408
						$about_url,
409
						__( 'About Jetpack', 'jetpack' ),
410
						__( 'About', 'jetpack' ),
411
						$is_dev_mode_or_connected
412
					);
413
414
					// TOS.
415
					self::the_footer_link(
416
						'https://wordpress.com/tos/',
417
						__( 'WordPress.com Terms of Service', 'jetpack' ),
418
						_x( 'Terms', 'Navigation item', 'jetpack' ),
419
						false
420
					);
421
422
					// Privacy policy.
423
					self::the_footer_link(
424
						$privacy_url,
425
						__( "Automattic's Privacy Policy", 'jetpack' ),
426
						_x( 'Privacy', 'Navigation item', 'jetpack' ),
427
						$is_dev_mode_or_connected
428
					);
429
430
					// Network Admin Jetpack dashboard.
431
					if ( is_multisite() && current_user_can( 'jetpack_network_sites_page' ) ) {
432
						self::the_footer_link(
433
							network_admin_url( 'admin.php?page=jetpack' ),
434
							__( "Manage your network's Jetpack Sites", 'jetpack' ),
435
							_x( 'Network Sites', 'Navigation item', 'jetpack' ),
436
							true
437
						);
438
					}
439
440
					// Network Admin Jetpack settings.
441
					if ( is_multisite() && current_user_can( 'jetpack_network_settings_page' ) ) {
442
						self::the_footer_link(
443
							network_admin_url( 'admin.php?page=jetpack-settings' ),
444
							__( "Manage your network's Jetpack settings", 'jetpack' ),
445
							_x( 'Network Settings', 'Navigation item', 'jetpack' ),
446
							true
447
						);
448
					}
449
450
					// Legacy Modules page.
451 View Code Duplication
					if ( current_user_can( 'manage_options' ) && $is_dev_mode_or_connected ) {
452
						self::the_footer_link(
453
							admin_url( 'admin.php?page=jetpack_modules' ),
454
							__( 'Access the full list of Jetpack modules available on your site', 'jetpack' ),
455
							_x( 'Modules', 'Navigation item', 'jetpack' ),
456
							true
457
						);
458
					}
459
460
					// Debugger.
461 View Code Duplication
					if ( current_user_can( 'manage_options' ) ) {
462
						self::the_footer_link(
463
							admin_url( 'admin.php?page=jetpack-debugger' ),
464
							__( "Test your site's compatibility with Jetpack", 'jetpack' ),
465
							_x( 'Debug', 'Navigation item', 'jetpack' ),
466
							true
467
						);
468
					}
469
					?>
470
				</ul>
471
			</div>
472
		<?php
473
	}
474
}
475