summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/_inc/lib/class-jetpack-mapbox-helper.php')
-rw-r--r--plugins/jetpack/_inc/lib/class-jetpack-mapbox-helper.php111
1 files changed, 111 insertions, 0 deletions
diff --git a/plugins/jetpack/_inc/lib/class-jetpack-mapbox-helper.php b/plugins/jetpack/_inc/lib/class-jetpack-mapbox-helper.php
new file mode 100644
index 00000000..2252648e
--- /dev/null
+++ b/plugins/jetpack/_inc/lib/class-jetpack-mapbox-helper.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Mapbox API helper.
+ *
+ * @package automattic/jetpack
+ */
+
+use Automattic\Jetpack\Status\Host;
+
+/**
+ * Class Jetpack_Mapbox_Helper
+ */
+class Jetpack_Mapbox_Helper {
+ /**
+ * Site option key for the Mapbox service.
+ *
+ * @var string
+ */
+ private static $site_option_key = 'mapbox_api_key';
+
+ /**
+ * Transient key for the WordPress.com Mapbox access token.
+ *
+ * @var string
+ */
+ private static $transient_key = 'wpcom_mapbox_access_token';
+
+ /**
+ * Get the site's own Mapbox access token if set, or the WordPress.com's one otherwise.
+ *
+ * @return array An array containing the key (if any) and its source ("site" or "wpcom").
+ */
+ public static function get_access_token() {
+ // If the site provides its own Mapbox access token, return it.
+ $service_api_key = Jetpack_Options::get_option( self::$site_option_key );
+ if ( $service_api_key ) {
+ return self::format_access_token( $service_api_key );
+ }
+
+ $site_id = self::get_wpcom_site_id();
+
+ // If on WordPress.com, try to return the access token straight away.
+ if ( self::is_wpcom() && defined( 'WPCOM_MAPBOX_ACCESS_TOKEN' ) ) {
+ jetpack_require_lib( 'mapbox-blocklist' );
+ return wpcom_is_site_blocked_from_map_block( $site_id )
+ ? self::format_access_token()
+ : self::format_access_token( WPCOM_MAPBOX_ACCESS_TOKEN, 'wpcom' );
+ }
+
+ // If not on WordPress.com or Atomic, return an empty access token.
+ if ( ! $site_id || ( ! self::is_wpcom() && ! ( new Host() )->is_woa_site() ) ) {
+ return self::format_access_token();
+ }
+
+ // If there is a cached token, return it.
+ $cached_token = get_transient( self::$transient_key );
+ if ( $cached_token ) {
+ return self::format_access_token( $cached_token, 'wpcom' );
+ }
+
+ // Otherwise get it from the WordPress.com endpoint.
+ $request_url = 'https://public-api.wordpress.com/wpcom/v2/sites/' . $site_id . '/mapbox';
+ $response = wp_remote_get( esc_url_raw( $request_url ) );
+ if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
+ return self::format_access_token();
+ }
+
+ $response_body = json_decode( wp_remote_retrieve_body( $response ) );
+ $wpcom_mapbox_access_token = $response_body->wpcom_mapbox_access_token;
+
+ set_transient( self::$transient_key, $wpcom_mapbox_access_token, HOUR_IN_SECONDS );
+ return self::format_access_token( $wpcom_mapbox_access_token, 'wpcom' );
+ }
+
+ /**
+ * Check if we're in WordPress.com.
+ *
+ * @return bool
+ */
+ private static function is_wpcom() {
+ return defined( 'IS_WPCOM' ) && IS_WPCOM;
+ }
+
+ /**
+ * Get the current site's WordPress.com ID.
+ *
+ * @return mixed The site's WordPress.com ID.
+ */
+ private static function get_wpcom_site_id() {
+ if ( self::is_wpcom() ) {
+ return get_current_blog_id();
+ } elseif ( method_exists( 'Jetpack', 'is_connection_ready' ) && Jetpack::is_connection_ready() ) {
+ return Jetpack_Options::get_option( 'id' );
+ }
+ return false;
+ }
+
+ /**
+ * Format an access token and its source into an array.
+ *
+ * @param string $key The API key.
+ * @param string $source The key's source ("site" or "wpcom").
+ * @return array
+ */
+ private static function format_access_token( $key = '', $source = 'site' ) {
+ return array(
+ 'key' => $key,
+ 'source' => $source,
+ );
+ }
+}