Completed
Push — fix/jumpstart ( ec3788 )
by
unknown
10:26
created

Jetpack_React_Page::additional_styles()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 0
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
1
<?php
2
include_once( 'class.jetpack-admin-page.php' );
3
4
// Builds the landing page and its menu
5
class Jetpack_React_Page extends Jetpack_Admin_Page {
6
7
	protected $dont_show_if_not_active = false;
8
9
	protected $is_redirecting = false;
10
11
	function get_page_hook() {
12
		$title = _x( 'Jetpack', 'The menu item label', 'jetpack' );
13
14
		// Add the main admin Jetpack menu
15
		return add_menu_page( 'Jetpack', $title, 'jetpack_admin_page', 'jetpack', array( $this, 'render' ), 'div' );
16
	}
17
18
	function add_page_actions( $hook ) {
19
		/** This action is documented in class.jetpack.php */
20
		do_action( 'jetpack_admin_menu', $hook );
21
22
		// Place the Jetpack menu item on top and others in the order they appear
23
		add_filter( 'custom_menu_order',         '__return_true' );
24
		add_filter( 'menu_order',                array( $this, 'jetpack_menu_order' ) );
25
26
		if ( ! isset( $_GET['page'] ) || 'jetpack' !== $_GET['page'] || ! empty( $_GET['configure'] ) ) {
27
			return; // No need to handle the fallback redirection if we are not on the Jetpack page
28
		}
29
30
		// Adding a redirect meta tag for older WordPress versions or if the REST API is disabled
31
		if ( $this->is_wp_version_too_old() || ! $this->is_rest_api_enabled() ) {
32
			$this->is_redirecting = true;
33
			add_action( 'admin_head', array( $this, 'add_fallback_head_meta' ) );
34
		}
35
36
		// Adding a redirect meta tag wrapped in noscript tags for all browsers in case they have JavaScript disabled
37
		add_action( 'admin_head', array( $this, 'add_noscript_head_meta' ) );
38
39
		// Adding a redirect tag wrapped in browser conditional comments
40
		add_action( 'admin_head', array( $this, 'add_legacy_browsers_head_script' ) );
41
	}
42
43
	/**
44
	 * Add Jetpack Dashboard sub-link and point it to AAG if the user can view stats, manage modules or if Protect is active.
45
	 * Otherwise and only if user is allowed to see the Jetpack Admin, the Dashboard sub-link is added but pointed to Apps tab.
46
	 *
47
	 * Works in Dev Mode or when user is connected.
48
	 *
49
	 * @since 4.3.0
50
	 */
51
	function jetpack_add_dashboard_sub_nav_item() {
52
		if ( Jetpack::is_development_mode() || Jetpack::is_active() ) {
53
			global $submenu;
54
			if ( current_user_can( 'jetpack_manage_modules' ) || Jetpack::is_module_active( 'protect' ) || current_user_can( 'view_stats' ) ) {
55
				$submenu['jetpack'][] = array( __( 'Dashboard', 'jetpack' ), 'jetpack_admin_page', Jetpack::admin_url( 'page=jetpack#/dashboard' ) );
56
			} elseif ( current_user_can( 'jetpack_admin_page' ) ) {
57
				$submenu['jetpack'][] = array( __( 'Dashboard', 'jetpack' ), 'jetpack_admin_page', Jetpack::admin_url( 'page=jetpack#/apps' ) );
58
			}
59
		}
60
	}
61
62
	/**
63
	 * If user is allowed to see the Jetpack Admin, add Settings sub-link.
64
	 *
65
	 * @since 4.3.0
66
	 */
67
	function jetpack_add_settings_sub_nav_item() {
68
		if ( ( Jetpack::is_development_mode() || Jetpack::is_active() ) && current_user_can( 'jetpack_admin_page' ) && current_user_can( 'edit_posts' ) ) {
69
			global $submenu;
70
			$submenu['jetpack'][] = array( __( 'Settings', 'jetpack' ), 'jetpack_admin_page', Jetpack::admin_url( 'page=jetpack#/settings' ) );
71
		}
72
	}
73
74
	function add_fallback_head_meta() {
75
		echo '<meta http-equiv="refresh" content="0; url=?page=jetpack_modules">';
76
	}
77
78
	function add_noscript_head_meta() {
79
		echo '<noscript>';
80
		$this->add_fallback_head_meta();
81
		echo '</noscript>';
82
	}
83
84
	function add_legacy_browsers_head_script() {
85
		echo
86
			"<script type=\"text/javascript\">\n"
87
			. "/*@cc_on\n"
88
			. "if ( @_jscript_version <= 10) {\n"
89
			. "window.location.href = '?page=jetpack_modules';\n"
90
			. "}\n"
91
			. "@*/\n"
92
			. "</script>";
93
	}
94
95 View Code Duplication
	function jetpack_menu_order( $menu_order ) {
96
		$jp_menu_order = array();
97
98
		foreach ( $menu_order as $index => $item ) {
99
			if ( $item != 'jetpack' )
100
				$jp_menu_order[] = $item;
101
102
			if ( $index == 0 )
103
				$jp_menu_order[] = 'jetpack';
104
		}
105
106
		return $jp_menu_order;
107
	}
108
109
	// Render the configuration page for the module if it exists and an error
110
	// screen if the module is not configurable
111
	// @todo remove when real settings are in place
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
112
	function render_nojs_configurable( $module_name ) {
0 ignored issues
show
Unused Code introduced by
The parameter $module_name is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
113
		$module_name = preg_replace( '/[^\da-z\-]+/', '', $_GET['configure'] );
114
115
		include_once( JETPACK__PLUGIN_DIR . '_inc/header.php' );
116
		echo '<div class="wrap configure-module">';
117
118
		if ( Jetpack::is_module( $module_name ) && current_user_can( 'jetpack_configure_modules' ) ) {
119
			Jetpack::admin_screen_configure_module( $module_name );
120
		} else {
121
			echo '<h2>' . esc_html__( 'Error, bad module.', 'jetpack' ) . '</h2>';
122
		}
123
124
		echo '</div><!-- /wrap -->';
125
	}
126
127
	function page_render() {
128
		// Handle redirects to configuration pages
129
		if ( ! empty( $_GET['configure'] ) ) {
130
			return $this->render_nojs_configurable( $_GET['configure'] );
131
		}
132
133
		/** This action is already documented in views/admin/admin-page.php */
134
		do_action( 'jetpack_notices' );
135
136
		// Try fetching by patch
137
		$static_html = @file_get_contents( JETPACK__PLUGIN_DIR . '_inc/build/static.html' );
138
139
		if ( false === $static_html ) {
140
141
			// If we still have nothing, display an error
142
			esc_html_e( 'Error fetching static.html.', 'jetpack' );
143
		} else {
144
145
			// We got the static.html so let's display it
146
			echo $static_html;
147
		}
148
	}
149
150
	function get_i18n_data() {
151
152
		$i18n_json = JETPACK__PLUGIN_DIR . 'languages/json/jetpack-' . jetpack_get_user_locale() . '.json';
153
154
		if ( is_file( $i18n_json ) && is_readable( $i18n_json ) ) {
155
			$locale_data = @file_get_contents( $i18n_json );
156
			if ( $locale_data ) {
157
				return $locale_data;
158
			}
159
		}
160
161
		// Return empty if we have nothing to return so it doesn't fail when parsed in JS
162
		return '{}';
163
	}
164
165
	/**
166
	 * Gets array of any Jetpack notices that have been dismissed.
167
	 *
168
	 * @since 4.0.1
169
	 * @return mixed|void
170
	 */
171
	function get_dismissed_jetpack_notices() {
172
		$jetpack_dismissed_notices = get_option( 'jetpack_dismissed_notices', array() );
173
		/**
174
		 * Array of notices that have been dismissed.
175
		 *
176
		 * @since 4.0.1
177
		 *
178
		 * @param array $jetpack_dismissed_notices If empty, will not show any Jetpack notices.
179
		 */
180
		$dismissed_notices = apply_filters( 'jetpack_dismissed_notices', $jetpack_dismissed_notices );
181
		return $dismissed_notices;
182
	}
183
184
	function additional_styles() {
185
		$rtl = is_rtl() ? '.rtl' : '';
186
187
		wp_enqueue_style( 'dops-css', plugins_url( "_inc/build/admin.dops-style$rtl.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
188
		wp_enqueue_style( 'components-css', plugins_url( "_inc/build/style.min$rtl.css", JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION );
189
	}
190
191
	function page_admin_scripts() {
192
		if ( $this->is_redirecting ) {
193
			return; // No need for scripts on a fallback page
194
		}
195
196
		$is_dev_mode = Jetpack::is_development_mode();
197
198
		// Enqueue jp.js and localize it
199
		wp_enqueue_script( 'react-plugin', plugins_url( '_inc/build/admin.js', JETPACK__PLUGIN_FILE ), array(), JETPACK__VERSION, true );
200
201
		if ( ! $is_dev_mode ) {
202
			// Required for Analytics
203
			wp_enqueue_script( 'jp-tracks', '//stats.wp.com/w.js', array(), gmdate( 'YW' ), true );
204
		}
205
206
		$localeSlug = explode( '_', jetpack_get_user_locale() );
207
		$localeSlug = $localeSlug[0];
208
209
		// Collecting roles that can view site stats
210
		$stats_roles = array();
211
		$enabled_roles = function_exists( 'stats_get_option' ) ? stats_get_option( 'roles' ) : array( 'administrator' );
212
		foreach( get_editable_roles() as $slug => $role ) {
213
			$stats_roles[ $slug ] = array(
214
				'name' => translate_user_role( $role['name'] ),
215
				'canView' => is_array( $enabled_roles ) ? in_array( $slug, $enabled_roles, true ) : false,
216
			);
217
		}
218
219
		$response = rest_do_request( new WP_REST_Request( 'GET', '/jetpack/v4/module/all' ) );
220
		$modules = $response->get_data();
221
222
		// Preparing translated fields for JSON encoding by transforming all HTML entities to
223
		// respective characters.
224
		foreach( $modules as $slug => $data ) {
225
			$modules[ $slug ]['name'] = html_entity_decode( $data['name'] );
226
			$modules[ $slug ]['description'] = html_entity_decode( $data['description'] );
227
			$modules[ $slug ]['short_description'] = html_entity_decode( $data['short_description'] );
228
			$modules[ $slug ]['long_description'] = html_entity_decode( $data['long_description'] );
229
		}
230
231
		// Get last post, to build the link to Customizer in the Related Posts module.
232
		$last_post = get_posts( array( 'posts_per_page' => 1 ) );
233
		$last_post = isset( $last_post[0] ) && $last_post[0] instanceof WP_Post
0 ignored issues
show
Bug introduced by
The class WP_Post does not exist. Did you forget a USE statement, or did you not list all dependencies?

This error could be the result of:

1. Missing dependencies

PHP Analyzer uses your composer.json file (if available) to determine the dependencies of your project and to determine all the available classes and functions. It expects the composer.json to be in the root folder of your repository.

Are you sure this class is defined by one of your dependencies, or did you maybe not list a dependency in either the require or require-dev section?

2. Missing use statement

PHP does not complain about undefined classes in ìnstanceof checks. For example, the following PHP code will work perfectly fine:

if ($x instanceof DoesNotExist) {
    // Do something.
}

If you have not tested against this specific condition, such errors might go unnoticed.

Loading history...
234
			? get_permalink( $last_post[0]->ID )
235
			: get_home_url();
236
237
		// Add objects to be passed to the initial state of the app
238
		wp_localize_script( 'react-plugin', 'Initial_State', array(
239
			'WP_API_root' => esc_url_raw( rest_url() ),
240
			'WP_API_nonce' => wp_create_nonce( 'wp_rest' ),
241
			'pluginBaseUrl' => plugins_url( '', JETPACK__PLUGIN_FILE ),
242
			'connectionStatus' => array(
243
				'isActive'  => Jetpack::is_active(),
244
				'isStaging' => Jetpack::is_staging_site(),
245
				'devMode'   => array(
246
					'isActive' => $is_dev_mode,
247
					'constant' => defined( 'JETPACK_DEV_DEBUG' ) && JETPACK_DEV_DEBUG,
248
					'url'      => site_url() && false === strpos( site_url(), '.' ),
249
					'filter'   => apply_filters( 'jetpack_development_mode', false ),
250
				),
251
				'isPublic'	=> '1' == get_option( 'blog_public' ),
252
				'isInIdentityCrisis' => Jetpack::validate_sync_error_idc_option(),
253
			),
254
			'dismissedNotices' => $this->get_dismissed_jetpack_notices(),
255
			'isDevVersion' => Jetpack::is_development_version(),
256
			'currentVersion' => JETPACK__VERSION,
257
			'happinessGravIds' => jetpack_get_happiness_gravatar_ids(),
258
			'getModules' => $modules,
259
			'showJumpstart' => jetpack_show_jumpstart(),
260
			'showHolidaySnow' => function_exists( 'jetpack_show_holiday_snow_option' ) ? jetpack_show_holiday_snow_option() : false,
261
			'rawUrl' => Jetpack::build_raw_urls( get_home_url() ),
262
			'adminUrl' => esc_url( admin_url() ),
263
			'stats' => array(
264
				// data is populated asynchronously on page load
265
				'data'  => array(
266
					'general' => false,
267
					'day'     => false,
268
					'week'    => false,
269
					'month'   => false,
270
				),
271
				'roles' => $stats_roles,
272
			),
273
			'settings' => $this->get_flattened_settings( $modules ),
274
			'settingNames' => array(
275
				'jetpack_holiday_snow_enabled' => function_exists( 'jetpack_holiday_snow_option_name' ) ? jetpack_holiday_snow_option_name() : false,
276
			),
277
			'userData' => array(
278
//				'othersLinked' => Jetpack::get_other_linked_admins(),
279
				'currentUser'  => jetpack_current_user_data(),
280
			),
281
			'siteData' => array(
282
				'icon' => has_site_icon()
283
					? apply_filters( 'jetpack_photon_url', get_site_icon_url(), array( 'w' => 64 ) )
284
					: '',
285
			),
286
			'locale' => $this->get_i18n_data(),
287
			'localeSlug' => $localeSlug,
288
			'jetpackStateNotices' => array(
289
				'messageCode' => Jetpack::state( 'message' ),
290
				'errorCode' => Jetpack::state( 'error' ),
291
				'errorDescription' => Jetpack::state( 'error_description' ),
292
			),
293
			'tracksUserData' => Jetpack_Tracks_Client::get_connected_user_tracks_identity(),
294
			'currentIp' => function_exists( 'jetpack_protect_get_ip' ) ? jetpack_protect_get_ip() : false,
295
			'lastPostUrl' => esc_url( $last_post ),
296
		) );
297
	}
298
299
	/**
300
	 * Returns an array of modules and settings both as first class members of the object.
301
	 *
302
	 * @param array $modules the result of an API request to get all modules.
303
	 *
304
	 * @return array flattened settings with modules.
305
	 */
306
	function get_flattened_settings( $modules ) {
0 ignored issues
show
Unused Code introduced by
The parameter $modules is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
307
		$core_api_endpoint = new Jetpack_Core_API_Data();
308
		$settings = $core_api_endpoint->get_all_options();
309
		return $settings->data;
310
	}
311
}
312
313
/*
314
 * List of happiness Gravatar IDs
315
 *
316
 * @todo move to functions.global.php when available
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
317
 * @since 4.1.0
318
 * @return array
319
 */
320
function jetpack_get_happiness_gravatar_ids() {
321
	return array(
322
		'623f42e878dbd146ddb30ebfafa1375b',
323
		'561be467af56cefa58e02782b7ac7510',
324
		'd8ad409290a6ae7b60f128a0b9a0c1c5',
325
		'790618302648bd80fa8a55497dfd8ac8',
326
		'6e238edcb0664c975ccb9e8e80abb307',
327
		'4e6c84eeab0a1338838a9a1e84629c1a',
328
		'9d4b77080c699629e846d3637b3a661c',
329
		'4626de7797aada973c1fb22dfe0e5109',
330
		'190cf13c9cd358521085af13615382d5',
331
		'f7006d10e9f7dd7bea89a001a2a2fd59',
332
		'16acbc88e7aa65104ed289d736cb9698',
333
		'4d5ad4219c6f676ea1e7d40d2e8860e8',
334
		'e301f7d01b09e7578fdfc1b1ec1bc08d',
335
		'42f4c73f5337486e199f6e3b3910f168',
336
		'e7b26de48e76498cff880abca1eed8da',
337
		'764fb02aaae2ff64c0625c763d82b74e',
338
		'4988305772319fb9bc8fce0a7acb3aa1',
339
		'5d8695c4b81592f1255721d2644627ca',
340
		'0e2249a7de3404bc6d5207a45e911187',
341
	);
342
}
343
344
/*
345
 * Only show Jump Start on first activation.
346
 * Any option 'jumpstart' other than 'new connection' will hide it.
347
 *
348
 * The option can be of 4 things, and will be stored as such:
349
 * new_connection      : Brand new connection - Show
350
 * jumpstart_activated : Jump Start has been activated - dismiss
351
 * jetpack_action_taken: Manual activation of a module already happened - dismiss
352
 * jumpstart_dismissed : Manual dismissal of Jump Start - dismiss
353
 *
354
 * @todo move to functions.global.php when available
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
355
 * @since 3.6
356
 * @return bool | show or hide
357
 */
358
function jetpack_show_jumpstart() {
359
	if ( ! Jetpack::is_active() ) {
360
		return false;
361
	}
362
	$jumpstart_option = Jetpack_Options::get_option( 'jumpstart' );
363
364
	$hide_options = array(
365
		'jumpstart_activated',
366
		'jetpack_action_taken',
367
		'jumpstart_dismissed'
368
	);
369
370
	if ( ! $jumpstart_option || in_array( $jumpstart_option, $hide_options ) ) {
371
		return false;
372
	}
373
374
	return true;
375
}
376
377
/**
378
 * Gather data about the current user.
379
 *
380
 * @since 4.1.0
381
 *
382
 * @return array
383
 */
384
function jetpack_current_user_data() {
385
	$current_user = wp_get_current_user();
386
	$is_master_user = $current_user->ID == Jetpack_Options::get_option( 'master_user' );
387
	$dotcom_data    = Jetpack::get_connected_user_data();
388
	// Add connected user gravatar to the returned dotcom_data.
389
	$dotcom_data['avatar'] = get_avatar_url( $dotcom_data['email'], array( 'size' => 64, 'default' => 'mysteryman' ) );
390
391
	$current_user_data = array(
392
		'isConnected' => Jetpack::is_user_connected( $current_user->ID ),
393
		'isMaster'    => $is_master_user,
394
		'username'    => $current_user->user_login,
395
		'wpcomUser'   => $dotcom_data,
396
		'gravatar'    => get_avatar( $current_user->ID, 40 ),
397
		'permissions' => array(
398
			'admin_page'         => current_user_can( 'jetpack_admin_page' ),
399
			'connect'            => current_user_can( 'jetpack_connect' ),
400
			'disconnect'         => current_user_can( 'jetpack_disconnect' ),
401
			'manage_modules'     => current_user_can( 'jetpack_manage_modules' ),
402
			'network_admin'      => current_user_can( 'jetpack_network_admin_page' ),
403
			'network_sites_page' => current_user_can( 'jetpack_network_sites_page' ),
404
			'edit_posts'         => current_user_can( 'edit_posts' ),
405
			'publish_posts'      => current_user_can( 'publish_posts' ),
406
			'manage_options'     => current_user_can( 'manage_options' ),
407
			'view_stats'		 => current_user_can( 'view_stats' ),
408
			'manage_plugins'	 => current_user_can( 'install_plugins' )
409
									&& current_user_can( 'activate_plugins' )
410
									&& current_user_can( 'update_plugins' )
411
									&& current_user_can( 'delete_plugins' ),
412
		),
413
	);
414
415
	return $current_user_data;
416
}
417
418
/**
419
 * Set the admin language, based on user language.
420
 *
421
 * @since 4.5.0
422
 *
423
 * @return string
424
 *
425
 * @todo Remove this function when WordPress 4.8 is released
0 ignored issues
show
Coding Style introduced by
Comment refers to a TODO task

This check looks TODO comments that have been left in the code.

``TODO``s show that something is left unfinished and should be attended to.

Loading history...
426
 * and replace `jetpack_get_user_locale()` in this file with `get_user_locale()`.
427
 */
428
function jetpack_get_user_locale() {
429
	$locale = get_locale();
430
431
	if ( function_exists( 'get_user_locale' ) ) {
432
		$locale = get_user_locale();
433
	}
434
435
	return $locale;
436
}
437