PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.7
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.7
16.3-a.5 16.3-a.7 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 All 506 releases
← All changes | modules/google-fonts/current/load-google-fonts.php +146 -43 12.8.3 → 16.3-a.7 View file →
@@ -4,14 +4,43 @@
4 4 *
5 5 * @package automattic/jetpack
6 6 */
7 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 +
8 19 /**
9 20 * Gets the Google Fonts data
10 21 *
11 - * @return object[] The collection data of the Google Fonts.
22 + * @return array|null The collection data of the Google Fonts.
12 23 */
13 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 +
14 43 $default_google_fonts_api_url = 'https://fonts.gstatic.com';
15 44 $jetpack_google_fonts_collection_url = 'https://s0.wp.com/i/font-collections/jetpack-google-fonts.json';
16 45 $cache_key = 'jetpack_google_fonts_' . md5( $jetpack_google_fonts_collection_url );
17 46 $data = get_transient( $cache_key );
@@ -30,9 +59,17 @@
30 59 }
31 60
32 61 // Replace the google fonts api url if the custom one is provided.
33 62 $custom_google_fonts_api_url = \esc_url(
34 - /** This filter is documented in projects/packages/google-fonts-provider/src/class-google-fonts-provider.php */
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 + */
35 72 apply_filters( 'jetpack_google_fonts_api_url', $default_google_fonts_api_url )
36 73 );
37 74 if ( $custom_google_fonts_api_url !== $default_google_fonts_api_url ) {
38 75 foreach ( $data['fontFamilies'] as &$font_family ) {
@@ -45,16 +82,18 @@
45 82 }
46 83 }
47 84 }
48 85
49 - return $data;
86 + if ( is_array( $data ) && is_array( $data['fontFamilies'] ) ) {
87 + return $data;
88 + }
50 89 }
51 90
52 91 /**
53 92 * Gets the map of the available Google Fonts
54 93 *
55 - * @param object[] $google_fonts_data The collection data of the Google Fonts.
56 - * @return object[] The map of the the available Google Fonts.
94 + * @param array $google_fonts_data The collection data of the Google Fonts.
95 + * @return array The map of the the available Google Fonts.
57 96 */
58 97 function jetpack_get_available_google_fonts_map( $google_fonts_data ) {
59 98 $jetpack_google_fonts_list = array_map(
60 99 function ( $font_family ) {
@@ -62,9 +101,17 @@
62 101 },
63 102 $google_fonts_data['fontFamilies']
64 103 );
65 104
66 - /** This filter is documented in modules/google-fonts/wordpress-6.3/load-google-fonts.php */
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 + */
67 114 $google_font_list = apply_filters( 'jetpack_google_fonts_list', $jetpack_google_fonts_list );
68 115 $available_google_fonts_map = array();
69 116
70 117 foreach ( $google_font_list as $google_font ) {
@@ -74,34 +121,8 @@
74 121 return $available_google_fonts_map;
75 122 }
76 123
77 124 /**
78 - * Gets the font families of the active theme
79 - *
80 - * @return object[] The font families of the active theme.
81 - */
82 -function jetpack_get_theme_fonts_map() {
83 - if ( ! class_exists( 'WP_Theme_JSON_Resolver' ) ) {
84 - return array();
85 - }
86 -
87 - $theme_json = WP_Theme_JSON_Resolver::get_theme_data();
88 - $raw_data = $theme_json->get_data();
89 - if ( empty( $raw_data['settings']['typography']['fontFamilies'] ) ) {
90 - return array();
91 - }
92 -
93 - $theme_fonts_map = array();
94 - foreach ( $raw_data['settings']['typography']['fontFamilies'] as $font_family ) {
95 - if ( isset( $font_family['name'] ) ) {
96 - $theme_fonts_map[ $font_family['name'] ] = true;
97 - }
98 - }
99 -
100 - return $theme_fonts_map;
101 -}
102 -
103 -/**
104 125 * Register google fonts to the theme json data
105 126 *
106 127 * @param WP_Theme_JSON_Data $theme_json The theme json data of core.
107 128 * @return WP_Theme_JSON_Data The theme json data with registered google fonts.
@@ -112,23 +133,14 @@
112 133 return $theme_json;
113 134 }
114 135
115 136 $available_google_fonts_map = jetpack_get_available_google_fonts_map( $google_fonts_data );
116 - $theme_fonts_map = jetpack_get_theme_fonts_map();
117 137 $google_fonts_families = array_values(
118 138 array_filter(
119 139 $google_fonts_data['fontFamilies'],
120 - function ( $google_fonts_family ) use ( $available_google_fonts_map, $theme_fonts_map ) {
140 + function ( $google_fonts_family ) use ( $available_google_fonts_map ) {
121 141 $name = $google_fonts_family['name'];
122 -
123 - // Filter out the fonts that are provided by the active theme.
124 - if ( isset( $theme_fonts_map[ $name ] ) && $theme_fonts_map[ $name ] ) {
125 - return false;
126 - }
127 -
128 - return isset( $available_google_fonts_map[ $name ] )
129 - ? $available_google_fonts_map[ $name ]
130 - : false;
142 + return $available_google_fonts_map[ $name ] ?? false;
131 143 }
132 144 )
133 145 );
134 146
@@ -146,4 +158,95 @@
146 158 return new $theme_json_class( $raw_data, $origin );
147 159 }
148 160
149 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();