PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.1
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 14.1.1 All 503 releases
jetpack / modules / google-fonts / current / load-google-fonts.php

load-google-fonts.php in Jetpack – WP Security, Backup, Speed, & Growth 16.3-a.1, at modules/google-fonts/current/load-google-fonts.php

253 lines 8.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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