PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
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 / modules / google-fonts / current / load-google-fonts.php
jetpack / modules / google-fonts / current Last commit date
class-jetpack-google-font-face.php 5 months ago load-google-fonts.php 2 weeks ago
load-google-fonts.php
253 lines
1 <?php
2 /**
3 * Load the google fonts by the new Font Library. See pNEWy-hhx-p2.
4 *
5 * @package automattic/jetpack
6 */
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit( 0 );
10 }
11
12 if ( ! class_exists( 'Jetpack_Google_Font_Face' ) ) {
13 /**
14 * Load Jetpack Google Font Face
15 */
16 require_once __DIR__ . '/class-jetpack-google-font-face.php';
17 }
18
19 /**
20 * Gets the Google Fonts data
21 *
22 * @return array|null The collection data of the Google Fonts.
23 */
24 function jetpack_get_google_fonts_data() {
25 /**
26 * Filters the Google Fonts data before the default retrieval process.
27 *
28 * This filter allows short-circuiting the default Google Fonts data retrieval process.
29 * Returning a non-null value from this filter will bypass the default retrieval
30 * and return the filtered value instead.
31 *
32 * @module google-fonts
33 *
34 * @since 13.7
35 *
36 * @param null|array $pre The pre-filtered Google Fonts data, default null.
37 */
38 $pre = apply_filters( 'pre_jetpack_get_google_fonts_data', null );
39 if ( null !== $pre ) {
40 return $pre;
41 }
42
43 $default_google_fonts_api_url = 'https://fonts.gstatic.com';
44 $jetpack_google_fonts_collection_url = 'https://s0.wp.com/i/font-collections/jetpack-google-fonts.json';
45 $cache_key = 'jetpack_google_fonts_' . md5( $jetpack_google_fonts_collection_url );
46 $data = get_transient( $cache_key );
47 if ( $data === false ) {
48 $response = wp_remote_get( $jetpack_google_fonts_collection_url );
49 if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) {
50 return null;
51 }
52
53 $data = json_decode( wp_remote_retrieve_body( $response ), true );
54 if ( $data === null ) {
55 return null;
56 }
57
58 set_transient( $cache_key, $data, DAY_IN_SECONDS );
59 }
60
61 // Replace the google fonts api url if the custom one is provided.
62 $custom_google_fonts_api_url = \esc_url(
63 /**
64 * Filters the Google Fonts API URL.
65 *
66 * @module google-fonts
67 *
68 * @since 12.8
69 *
70 * @param string $url The Google Fonts API URL.
71 */
72 apply_filters( 'jetpack_google_fonts_api_url', $default_google_fonts_api_url )
73 );
74 if ( $custom_google_fonts_api_url !== $default_google_fonts_api_url ) {
75 foreach ( $data['fontFamilies'] as &$font_family ) {
76 foreach ( $font_family['fontFace'] as &$font_face ) {
77 $font_face['src'] = str_replace(
78 $default_google_fonts_api_url,
79 $custom_google_fonts_api_url,
80 $font_face['src']
81 );
82 }
83 }
84 }
85
86 if ( is_array( $data ) && is_array( $data['fontFamilies'] ) ) {
87 return $data;
88 }
89 }
90
91 /**
92 * Gets the map of the available Google Fonts
93 *
94 * @param array $google_fonts_data The collection data of the Google Fonts.
95 * @return array The map of the the available Google Fonts.
96 */
97 function jetpack_get_available_google_fonts_map( $google_fonts_data ) {
98 $jetpack_google_fonts_list = array_map(
99 function ( $font_family ) {
100 return $font_family['name'];
101 },
102 $google_fonts_data['fontFamilies']
103 );
104
105 /**
106 * Curated list of Google Fonts.
107 *
108 * @module google-fonts
109 *
110 * @since 10.8
111 *
112 * @param array $fonts_to_register Array of Google Font names to register.
113 */
114 $google_font_list = apply_filters( 'jetpack_google_fonts_list', $jetpack_google_fonts_list );
115 $available_google_fonts_map = array();
116
117 foreach ( $google_font_list as $google_font ) {
118 $available_google_fonts_map[ $google_font ] = true;
119 }
120
121 return $available_google_fonts_map;
122 }
123
124 /**
125 * Register google fonts to the theme json data
126 *
127 * @param WP_Theme_JSON_Data $theme_json The theme json data of core.
128 * @return WP_Theme_JSON_Data The theme json data with registered google fonts.
129 */
130 function jetpack_register_google_fonts_to_theme_json( $theme_json ) {
131 $google_fonts_data = jetpack_get_google_fonts_data();
132 if ( ! $google_fonts_data ) {
133 return $theme_json;
134 }
135
136 $available_google_fonts_map = jetpack_get_available_google_fonts_map( $google_fonts_data );
137 $google_fonts_families = array_values(
138 array_filter(
139 $google_fonts_data['fontFamilies'],
140 function ( $google_fonts_family ) use ( $available_google_fonts_map ) {
141 $name = $google_fonts_family['name'];
142 return $available_google_fonts_map[ $name ] ?? false;
143 }
144 )
145 );
146
147 $raw_data = $theme_json->get_data();
148 $origin = 'default';
149 if ( empty( $raw_data['settings']['typography']['fontFamilies'][ $origin ] ) ) {
150 $raw_data['settings']['typography']['fontFamilies'][ $origin ] = array();
151 }
152
153 foreach ( $google_fonts_families as $font_family ) {
154 $raw_data['settings']['typography']['fontFamilies'][ $origin ][] = $font_family;
155 }
156
157 $theme_json_class = get_class( $theme_json );
158 return new $theme_json_class( $raw_data, $origin );
159 }
160
161 add_filter( 'wp_theme_json_data_default', 'jetpack_register_google_fonts_to_theme_json' );
162
163 /**
164 * Filter out the deprecated font families that are from the jetpack-google-fonts provider.
165 *
166 * @param object[] $font_families The font families.
167 * @return object[] The filtered font families.
168 */
169 function jetpack_google_fonts_filter_out_deprecated_font_data( $font_families ) {
170 return array_values(
171 array_filter(
172 $font_families,
173 function ( $font_family ) {
174 $has_deprecated_google_fonts_data = false;
175
176 if ( isset( $font_family['fontFace'] ) ) {
177 foreach ( $font_family['fontFace'] as $font_face ) {
178 $provider = $font_face['provider'] ?? '';
179 if ( $provider === 'jetpack-google-fonts' ) {
180 $has_deprecated_google_fonts_data = true;
181 break;
182 }
183 }
184 }
185
186 return ! $has_deprecated_google_fonts_data;
187 }
188 )
189 );
190 }
191
192 /**
193 * Unregister the deprecated jetpack-google-fonts provider from theme json data that were stored
194 * before we moved to the Font Library.
195 *
196 * @param WP_Theme_JSON_Data $theme_json The theme json data.
197 * @return WP_Theme_JSON_Data The filtered theme json data.
198 */
199 function jetpack_unregister_deprecated_google_fonts_from_theme_json_data( $theme_json ) {
200 $raw_data = $theme_json->get_data();
201 $origin = 'theme';
202 if ( empty( $raw_data['settings']['typography']['fontFamilies'][ $origin ] ) ) {
203 return $theme_json;
204 }
205
206 // Filter out the font definitions that are from the jetpack-google-fonts provider.
207 $raw_data['settings']['typography']['fontFamilies'][ $origin ] = jetpack_google_fonts_filter_out_deprecated_font_data(
208 $raw_data['settings']['typography']['fontFamilies'][ $origin ]
209 );
210
211 $theme_json_class = get_class( $theme_json );
212 return new $theme_json_class( $raw_data, 'custom' );
213 }
214
215 add_filter( 'wp_theme_json_data_theme', 'jetpack_unregister_deprecated_google_fonts_from_theme_json_data' );
216 add_filter( 'wp_theme_json_data_user', 'jetpack_unregister_deprecated_google_fonts_from_theme_json_data' );
217
218 /**
219 * Clean up the Google Fonts data if either google fonts module is disabled or Jetpack is disabled.
220 */
221 function jetpack_unregister_google_fonts() {
222 $post_id = WP_Theme_JSON_Resolver::get_user_global_styles_post_id();
223
224 // Get user config
225 $user_config = WP_Theme_JSON_Resolver::get_user_data();
226 $user_config_raw_data = $user_config->get_raw_data();
227 $user_config_raw_data['isGlobalStylesUserThemeJSON'] = true;
228
229 // Prepare data for saving
230 if ( ! empty( $user_config_raw_data['settings']['typography']['fontFamilies']['default'] ) ) {
231 $user_config_raw_data['settings']['typography']['fontFamilies']['default'] = array();
232 }
233
234 if ( ! empty( $user_config_raw_data['settings']['typography']['fontFamilies']['theme'] ) ) {
235 $user_config_raw_data['settings']['typography']['fontFamilies']['theme'] = jetpack_google_fonts_filter_out_deprecated_font_data(
236 $user_config_raw_data['settings']['typography']['fontFamilies']['theme'] // @phan-suppress-current-line PhanTypeInvalidDimOffset, PhanTypeMismatchArgument
237 );
238 }
239
240 // Prepare changes
241 $changes = new stdClass();
242 $changes->ID = $post_id;
243 $changes->post_content = wp_json_encode( $user_config_raw_data, JSON_UNESCAPED_SLASHES );
244
245 // Update user config
246 wp_update_post( wp_slash( (array) $changes ), true );
247 }
248 add_action( 'jetpack_deactivate_module_google-fonts', 'jetpack_unregister_google_fonts' );
249
250 // Initialize Jetpack Google Font Face to avoid printing **ALL** google fonts provided by this module.
251 // See p1700040028362329-slack-C4GAQ900P and p7DVsv-jib-p2
252 new Jetpack_Google_Font_Face();
253