PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.1
16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 All 504 releases
jetpack / jetpack_vendor / automattic / jetpack-assets / src / class-script-data.php

class-script-data.php in Jetpack – WP Security, Backup, Speed, & Growth 16.3-a.1, at jetpack_vendor/automattic/jetpack-assets/src/class-script-data.php

240 lines 6.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Jetpack script data.
4 *
5 * @package automattic/jetpack-assets
6 */
7
8 namespace Automattic\Jetpack\Assets;
9
10 use Automattic\Jetpack\Assets;
11 use Automattic\Jetpack\Status;
12 use Automattic\Jetpack\Status\Host;
13
14 /**
15 * Class script data
16 */
17 class Script_Data {
18
19 const SCRIPT_HANDLE = 'jetpack-script-data';
20
21 /**
22 * Whether the script data has been rendered.
23 *
24 * @var bool
25 */
26 private static $did_render_script_data = false;
27
28 /**
29 * Configure.
30 */
31 public static function configure() {
32 /**
33 * Ensure that assets are registered on wp_loaded,
34 * which is fired before *_enqueue_scripts actions.
35 * It means that when the dependent scripts are registered,
36 * the scripts here are already registered.
37 */
38 add_action( 'wp_loaded', array( self::class, 'register_assets' ) );
39
40 /**
41 * Notes:
42 * 1. wp_print_scripts action is fired on both admin and public pages.
43 * On admin pages, it's fired before admin_enqueue_scripts action,
44 * which can be a problem if the consumer package uses admin_enqueue_scripts
45 * to hook into the script data. Thus, we prefer to use admin_print_scripts on admin pages.
46 * 2. We want to render the script data on print, instead of init or enqueue actions,
47 * so that the hook callbacks have enough time and information
48 * to decide whether to update the script data or not.
49 */
50 $hook = is_admin() ? 'admin_print_scripts' : 'wp_print_scripts';
51 add_action( $hook, array( self::class, 'render_script_data' ), 1 );
52 add_action( 'enqueue_block_editor_assets', array( self::class, 'render_script_data' ), 1 );
53 }
54
55 /**
56 * Register assets.
57 *
58 * @access private
59 */
60 public static function register_assets() {
61
62 Assets::register_script(
63 self::SCRIPT_HANDLE,
64 '../build/jetpack-script-data.js',
65 __FILE__,
66 array(
67 'in_footer' => true,
68 'textdomain' => 'jetpack-assets',
69 )
70 );
71 }
72
73 /**
74 * Render the script data using an inline script.
75 *
76 * @access private
77 *
78 * @return void
79 */
80 public static function render_script_data() {
81 // In case of 'enqueue_block_editor_assets' action, this can be called multiple times.
82 if ( self::$did_render_script_data ) {
83 return;
84 }
85
86 self::$did_render_script_data = true;
87
88 $script_data = is_admin() || self::is_authenticated_rest_request()
89 ? self::get_admin_script_data()
90 : self::get_public_script_data();
91
92 if ( ! empty( $script_data ) ) {
93 $script_data = wp_json_encode(
94 $script_data,
95 JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE
96 );
97
98 wp_add_inline_script(
99 self::SCRIPT_HANDLE,
100 sprintf( 'window.JetpackScriptData = %s;', $script_data ),
101 'before'
102 );
103 Assets::enqueue_script( self::SCRIPT_HANDLE );
104 }
105 }
106
107 /**
108 * Whether the current request is an authenticated REST API request.
109 *
110 * @return bool
111 */
112 protected static function is_authenticated_rest_request() {
113 return wp_is_serving_rest_request() && current_user_can( 'read' );
114 }
115
116 /**
117 * Get the admin script data.
118 *
119 * @return array
120 */
121 protected static function get_admin_script_data() {
122
123 global $wp_version;
124
125 $data = array(
126 'site' => array(
127 'admin_url' => esc_url_raw( admin_url() ),
128 'date_format' => get_option( 'date_format' ),
129 'icon' => self::get_site_icon(),
130 'is_multisite' => is_multisite(),
131 'host' => ( new Host() )->get_known_host_guess(),
132 'is_wpcom_platform' => ( new Host() )->is_wpcom_platform(),
133 'plan' => array(
134 // The properties here should be updated by the consumer package/plugin.
135 // It includes properties like 'product_slug', 'features', etc.
136 'product_slug' => '',
137 ),
138 'rest_nonce' => wp_create_nonce( 'wp_rest' ),
139 'rest_root' => esc_url_raw( rest_url() ),
140 'suffix' => ( new Status() )->get_site_suffix(),
141 'title' => self::get_site_title(),
142 'wp_version' => $wp_version,
143 'wpcom' => array(
144 // This should contain the connected site details like blog_id, is_atomic etc.
145 'blog_id' => 0,
146 ),
147 ),
148 'user' => array(
149 'current_user' => self::get_current_user_data(),
150 ),
151 );
152
153 /**
154 * Filter the admin script data.
155 *
156 * When using this filter, ensure that the data is added only if it is used by some script.
157 * This filter may be called on almost every admin page load. So, one should check if the data is needed/used on that page.
158 * For example, the social (publicize) data is used only on Social admin page, Jetpack settings page and the post editor.
159 * So, the social data should be added only on those pages.
160 *
161 * @since 2.3.0
162 *
163 * @param array $data The script data.
164 */
165 return apply_filters( 'jetpack_admin_js_script_data', $data );
166 }
167
168 /**
169 * Get the public script data.
170 *
171 * @return array
172 */
173 protected static function get_public_script_data() {
174
175 $data = array();
176
177 /**
178 * Filter the public script data.
179 *
180 * See the docs for `jetpack_admin_js_script_data` filter for more information.
181 *
182 * @since 2.3.0
183 *
184 * @param array $data The script data.
185 */
186 return apply_filters( 'jetpack_public_js_script_data', $data );
187 }
188
189 /**
190 * Get the site title.
191 *
192 * @return string
193 */
194 protected static function get_site_title() {
195 $title = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
196
197 return $title ? $title : esc_url_raw( ( get_site_url() ) );
198 }
199
200 /**
201 * Get the site icon.
202 *
203 * @return string
204 */
205 protected static function get_site_icon() {
206 if ( ! has_site_icon() ) {
207 return '';
208 }
209
210 /**
211 * Filters the site icon using Photon.
212 *
213 * @see https://developer.wordpress.com/docs/photon/
214 *
215 * @param string $url The URL of the site icon.
216 * @param array|string $args An array of arguments, e.g. array( 'w' => '300', 'resize' => array( 123, 456 ) ), or in string form (w=123&h=456).
217 */
218 return apply_filters( 'jetpack_photon_url', get_site_icon_url(), array( 'w' => 64 ) );
219 }
220
221 /**
222 * Get the current user data.
223 *
224 * @return array
225 */
226 protected static function get_current_user_data() {
227 $current_user = wp_get_current_user();
228
229 return array(
230 'display_name' => $current_user->display_name,
231 'id' => $current_user->ID,
232 'capabilities' => array(
233 'edit_others_posts' => current_user_can( 'edit_others_posts' ),
234 'manage_options' => current_user_can( 'manage_options' ),
235 'manage_modules' => current_user_can( 'jetpack_manage_modules' ),
236 ),
237 );
238 }
239 }
240