PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-stats-admin / src / class-odyssey-assets.php
jetpack / jetpack_vendor / automattic / jetpack-stats-admin / src Last commit date
class-admin-post-list-column.php 3 days ago class-dashboard.php 3 days ago class-main.php 3 days ago class-notices.php 8 months ago class-odyssey-assets.php 2 weeks ago class-odyssey-config-data.php 3 days ago class-rest-controller.php 1 month ago class-wp-dashboard-odyssey-widget.php 2 years ago class-wpcom-client.php 3 days ago
class-odyssey-assets.php
156 lines
1 <?php
2 /**
3 * Stats Assets
4 *
5 * @package automattic/jetpack-stats-admin
6 */
7
8 namespace Automattic\Jetpack\Stats_Admin;
9
10 use Automattic\Jetpack\Assets;
11
12 /**
13 * Class Odyssey_Config_Data
14 *
15 * @package automattic/jetpack-stats-admin
16 */
17 class Odyssey_Assets {
18 // This is a fixed list @see https://github.com/Automattic/wp-calypso/pull/71442/
19 const JS_DEPENDENCIES = array( 'lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-primitives', 'wp-url', 'wp-warning', 'moment' );
20 /**
21 * Odyssey's UI is built on @wordpress/components and runs against the page's own
22 * `wp.components` (externalized, see JS_DEPENDENCIES above), so it needs that package's
23 * matching stylesheet. Declare it rather than relying on some other admin feature loading it
24 * as a side effect — WP 7.0's command palette happens to enqueue it globally today, but that's
25 * an implementation detail of the palette, not a contract. Declaring it also fixes cascade
26 * order: WP emits dependencies first, so Odyssey's own overrides of these classes reliably win.
27 */
28 const CSS_DEPENDENCIES = array( 'wp-components' );
29 // Sometimes custom scripts would strip the `ver` query params, so we need to make sure it doesn't by adding a custom version param `osv` here.
30 const ODYSSEY_CDN_URL = 'https://widgets.wp.com/odyssey-stats/%s/%s?minify=false&osv=%s';
31
32 /**
33 * We bump the asset version when the Jetpack back end is not compatible anymore.
34 */
35 const ODYSSEY_STATS_VERSION = 'v1';
36 const ODYSSEY_STATS_CACHE_BUSTER_CACHE_KEY = 'odyssey_stats_admin_asset_cache_buster';
37
38 /**
39 * Load the admin scripts.
40 *
41 * @param string $asset_handle The handle of the asset.
42 * @param string $asset_name The name of the asset.
43 * @param array $options The options.
44 */
45 public function load_admin_scripts( $asset_handle, $asset_name, $options = array() ) {
46 $default_options = array(
47 'config_data' => ( new Odyssey_Config_Data() )->get_data(),
48 'config_variable_name' => 'configData',
49 'enqueue_css' => true,
50 );
51 $options = wp_parse_args( $options, $default_options );
52 if ( file_exists( __DIR__ . "/../dist/{$asset_name}.js" ) ) {
53 // Load local assets for the convinience of development.
54 Assets::register_script(
55 $asset_handle,
56 "../dist/{$asset_name}.js",
57 __FILE__,
58 array(
59 'in_footer' => true,
60 'textdomain' => 'jetpack-stats-admin',
61 'css_dependencies' => self::CSS_DEPENDENCIES,
62 )
63 );
64 Assets::enqueue_script( $asset_handle );
65 } else {
66 // In production, we load the assets from our CDN.
67 wp_register_script(
68 $asset_handle,
69 sprintf( self::ODYSSEY_CDN_URL, self::ODYSSEY_STATS_VERSION, "{$asset_name}.js", $this->get_cdn_asset_cache_buster() ),
70 self::JS_DEPENDENCIES,
71 $this->get_cdn_asset_cache_buster(),
72 true
73 );
74 wp_enqueue_script( $asset_handle );
75
76 // Enqueue CSS if needed.
77 if ( $options['enqueue_css'] ) {
78 $css_url = $asset_name . ( is_rtl() ? '.rtl' : '' ) . '.css';
79 $css_handle = $asset_handle . '-style';
80 wp_register_style(
81 $css_handle,
82 sprintf( self::ODYSSEY_CDN_URL, self::ODYSSEY_STATS_VERSION, $css_url, $this->get_cdn_asset_cache_buster() ),
83 self::CSS_DEPENDENCIES,
84 $this->get_cdn_asset_cache_buster()
85 );
86 wp_enqueue_style( $css_handle );
87 }
88 }
89
90 wp_add_inline_script(
91 $asset_handle,
92 ( new Odyssey_Config_Data() )->get_js_config_data( $options['config_variable_name'], $options['config_data'] ),
93 'before'
94 );
95 }
96
97 /**
98 * Returns cache buster string for assets.
99 * Development mode doesn't need this, as it's handled by `Assets` class.
100 *
101 * @return string
102 */
103 protected function get_cdn_asset_cache_buster() {
104 $now_in_ms = floor( microtime( true ) * 1000 );
105 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
106 if ( isset( $_GET['force_refresh'] ) ) {
107 update_option( self::ODYSSEY_STATS_CACHE_BUSTER_CACHE_KEY, $this->get_cache_buster_option_value( $now_in_ms ), false );
108 }
109
110 // Use cached cache buster in production.
111 $remote_asset_version = get_option( self::ODYSSEY_STATS_CACHE_BUSTER_CACHE_KEY );
112
113 if ( ! empty( $remote_asset_version ) ) {
114 $remote_asset_version = json_decode( $remote_asset_version, true );
115 // If cache buster is cached and not expired (valid in 15 min), return it.
116 if ( ! empty( $remote_asset_version['cache_buster'] ) && $remote_asset_version['cached_at'] > $now_in_ms - MINUTE_IN_SECONDS * 1000 * 15 ) {
117 return $remote_asset_version['cache_buster'];
118 }
119 }
120
121 // If no cached cache buster, we fetch it from CDN and set to transient.
122 $response = wp_remote_get( sprintf( self::ODYSSEY_CDN_URL, self::ODYSSEY_STATS_VERSION, 'build_meta.json', $now_in_ms ), array( 'timeout' => 5 ) );
123
124 if ( is_wp_error( $response ) ) {
125 // fallback to current timestamp.
126 return (string) $now_in_ms;
127 }
128
129 $build_meta = json_decode( wp_remote_retrieve_body( $response ), true );
130 if ( ! empty( $build_meta['cache_buster'] ) ) {
131 // Cache the cache buster for 15 mins.
132 update_option( self::ODYSSEY_STATS_CACHE_BUSTER_CACHE_KEY, $this->get_cache_buster_option_value( $build_meta['cache_buster'] ), false );
133 return $build_meta['cache_buster'];
134 }
135
136 // fallback to current timestamp.
137 return (string) $now_in_ms;
138 }
139
140 /**
141 * Get the cache buster option value.
142 *
143 * @param string|int|float $cache_buster The cache buster.
144 * @return string|false
145 */
146 protected function get_cache_buster_option_value( $cache_buster ) {
147 return wp_json_encode(
148 array(
149 'cache_buster' => (string) $cache_buster,
150 'cached_at' => floor( microtime( true ) * 1000 ), // milliseconds.
151 ),
152 JSON_UNESCAPED_SLASHES
153 );
154 }
155 }
156