Completed
Push — instant-search-master ( 9522da...404687 )
by
unknown
07:50 queued 10s
created

Jetpack_Mapbox_Helper::get_wpcom_site_id()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
nc 3
nop 0
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Mapbox API helper.
4
 *
5
 * @package jetpack
6
 */
7
8
/**
9
 * Class Jetpack_Mapbox_Helper
10
 */
11
class Jetpack_Mapbox_Helper {
12
	/**
13
	 * Site option key for the Mapbox service.
14
	 *
15
	 * @var string
16
	 */
17
	private static $site_option_key = 'mapbox_api_key';
18
19
	/**
20
	 * Transient key for the WordPress.com Mapbox access token.
21
	 *
22
	 * @var string
23
	 */
24
	private static $transient_key = 'wpcom_mapbox_access_token';
25
26
	/**
27
	 * Get the site's own Mapbox access token if set, or the WordPress.com's one otherwise.
28
	 *
29
	 * @return array An array containing the key (if any) and its source ("site" or "wpcom").
30
	 */
31
	public static function get_access_token() {
32
		// If the site provides its own Mapbox access token, return it.
33
		$service_api_key = Jetpack_Options::get_option( self::$site_option_key );
34
		if ( $service_api_key ) {
35
			return self::format_access_token( $service_api_key );
36
		}
37
38
		$site_id = self::get_wpcom_site_id();
39
40
		// If on WordPress.com, try to return the access token straight away.
41
		if ( self::is_wpcom() && defined( 'WPCOM_MAPBOX_ACCESS_TOKEN' ) ) {
42
			jetpack_require_lib( 'mapbox-blacklist' );
43
			return wpcom_is_site_blacklisted_from_map_block( $site_id )
44
				? self::format_access_token()
45
				: self::format_access_token( WPCOM_MAPBOX_ACCESS_TOKEN, 'wpcom' );
46
		}
47
48
		// If not on WordPress.com or Atomic, return an empty access token.
49
		if ( ! $site_id || ( ! self::is_wpcom() && ! jetpack_is_atomic_site() ) ) {
50
			return self::format_access_token();
51
		}
52
53
		// If there is a cached token, return it.
54
		$cached_token = get_transient( self::$transient_key );
55
		if ( $cached_token ) {
56
			return self::format_access_token( $cached_token, 'wpcom' );
57
		}
58
59
		// Otherwise get it from the WordPress.com endpoint.
60
		$request_url = 'https://public-api.wordpress.com/wpcom/v2/sites/' . $site_id . '/mapbox';
61
		$response    = wp_remote_get( esc_url_raw( $request_url ) );
62
		if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
63
			return self::format_access_token();
64
		}
65
66
		$response_body             = json_decode( wp_remote_retrieve_body( $response ) );
67
		$wpcom_mapbox_access_token = $response_body->wpcom_mapbox_access_token;
68
69
		set_transient( self::$transient_key, $wpcom_mapbox_access_token, HOUR_IN_SECONDS );
70
		return self::format_access_token( $wpcom_mapbox_access_token, 'wpcom' );
71
	}
72
73
	/**
74
	 * Check if we're in WordPress.com.
75
	 *
76
	 * @return bool
77
	 */
78
	private static function is_wpcom() {
79
		return defined( 'IS_WPCOM' ) && IS_WPCOM;
80
	}
81
82
	/**
83
	 * Get the current site's WordPress.com ID.
84
	 *
85
	 * @return mixed The site's WordPress.com ID.
86
	 */
87
	private static function get_wpcom_site_id() {
88
		if ( self::is_wpcom() ) {
89
			return get_current_blog_id();
90
		} elseif ( method_exists( 'Jetpack', 'is_active' ) && Jetpack::is_active() ) {
91
			return Jetpack_Options::get_option( 'id' );
92
		}
93
		return false;
94
	}
95
96
	/**
97
	 * Format an access token and its source into an array.
98
	 *
99
	 * @param string $key The API key.
100
	 * @param string $source The key's source ("site" or "wpcom").
101
	 * @return array
102
	 */
103
	private static function format_access_token( $key = '', $source = 'site' ) {
104
		return array(
105
			'key'    => $key,
106
			'source' => $source,
107
		);
108
	}
109
}
110