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/class-jetpack-google-font-face.php +23 -13 13.3.3 → 16.3-a.7 View file →
@@ -8,8 +8,10 @@
8 8 /**
9 9 * Jetpack Google Font Face disables Font Face hooks in Core that prints **ALL** font faces.
10 10 * Instead, it collects fonts that are used in global styles or block-level settings and
11 11 * print those fonts in use.
12 + *
13 + * @phan-constructor-used-for-side-effects
12 14 */
13 15 class Jetpack_Google_Font_Face {
14 16 /**
15 17 * The fonts that are used in global styles or block-level settings.
@@ -26,9 +28,14 @@
26 28 add_action( 'wp_loaded', array( $this, 'wp_loaded' ) );
27 29 add_action( 'current_screen', array( $this, 'current_screen' ), 10 );
28 30
29 31 // Collect and print fonts in use
30 - add_action( 'wp_head', array( $this, 'print_font_faces' ), 50 );
32 + if ( wp_is_block_theme() ) {
33 + add_action( 'wp_head', array( $this, 'print_font_faces' ), 50 );
34 + } else {
35 + // In classic themes wp_head runs before the blocks are processed to collect the block fonts.
36 + add_action( 'wp_footer', array( $this, 'print_font_faces' ), 50 );
37 + }
31 38 add_filter( 'pre_render_block', array( $this, 'collect_block_fonts' ), 10, 2 );
32 39 }
33 40
34 41 /**
@@ -36,8 +43,11 @@
36 43 */
37 44 public function wp_loaded() {
38 45 remove_action( 'wp_head', 'wp_print_fonts', 50 );
39 46 remove_action( 'wp_head', 'wp_print_font_faces', 50 );
47 + // Gutenberg 22.4+ overrides Core's font printing with its own function
48 + // for classic theme support. Remove it so we can print only fonts in use.
49 + remove_action( 'wp_head', 'gutenberg_print_font_faces', 50 );
40 50 }
41 51
42 52 /**
43 53 * Turn off hooks to print fonts on wp-admin, except for GB editor pages.
@@ -53,10 +63,8 @@
53 63 /**
54 64 * Print fonts that are used in global styles or block-level settings.
55 65 */
56 66 public function print_font_faces() {
57 - // @todo Remove suppression when we drop support for core versions without the Font library.
58 - // @phan-suppress-next-line PhanUndeclaredClassMethod -- This file is only loaded (via modules/google-fonts/load.php) when core's new Font library exists. @phan-suppress-current-line UnusedPluginSuppression
59 67 $fonts = WP_Font_Face_Resolver::get_fonts_from_theme_json();
60 68 $font_slug_aliases = $this->get_font_slug_aliases();
61 69 $fonts_to_print = array();
62 70
@@ -65,21 +73,19 @@
65 73 $fonts_in_use = array_map(
66 74 function ( $font_slug ) use ( $font_slug_aliases ) {
67 75 return $font_slug_aliases[ $font_slug ] ?? $font_slug;
68 76 },
69 - $this->fonts_in_use
77 + $fonts_in_use
70 78 );
71 79
72 80 foreach ( $fonts as $font_faces ) {
73 81 $font_family = $font_faces[0]['font-family'] ?? '';
74 82 if ( in_array( $this->format_font( $font_family ), $fonts_in_use, true ) ) {
75 - $fonts_to_print[ $font_family ] = $font_faces;
83 + $fonts_to_print[] = $font_faces;
76 84 }
77 85 }
78 86
79 87 if ( ! empty( $fonts_to_print ) ) {
80 - // @todo Remove suppression when we drop support for core versions without the Font library.
81 - // @phan-suppress-next-line PhanUndeclaredFunction -- This file is only loaded (via modules/google-fonts/load.php) when core's new Font library exists. @phan-suppress-current-line UnusedPluginSuppression
82 88 wp_print_font_faces( $fonts_to_print );
83 89 }
84 90 }
85 91
@@ -137,9 +143,11 @@
137 143 *
138 144 * @param string $font_slug The font slug.
139 145 */
140 146 public function add_font( $font_slug ) {
141 - $this->fonts_in_use[] = $this->format_font( $font_slug );
147 + if ( is_string( $font_slug ) ) {
148 + $this->fonts_in_use[] = $this->format_font( $font_slug );
149 + }
142 150 }
143 151
144 152 /**
145 153 * Format the given font slug.
@@ -165,8 +173,11 @@
165 173 $theme_json = WP_Theme_JSON_Resolver::get_theme_data();
166 174 $raw_data = $theme_json->get_data();
167 175 if ( ! empty( $raw_data['settings']['typography']['fontFamilies'] ) ) {
168 176 foreach ( $raw_data['settings']['typography']['fontFamilies'] as $font ) {
177 + if ( ! isset( $font['fontFamily'] ) ) {
178 + continue;
179 + }
169 180 $font_family_name = $this->format_font( $this->get_font_family_name( $font ) );
170 181 $font_slug = $font['slug'] ?? '';
171 182 if ( $font_slug && $font_slug !== $font_family_name && ! array_key_exists( $font_slug, $font_slug_aliases ) ) {
172 183 $font_slug_aliases[ $font_slug ] = $font_family_name;
@@ -211,11 +222,10 @@
211 222 if ( ! is_string( $font_family ) ) {
212 223 return null;
213 224 }
214 225
215 - // Full string: var(--wp--preset--font-family--slug).
216 - // We do not care about the origin of the font, only its slug.
217 - preg_match( '/font-family--(?P<slug>.+)\)$/', $font_family, $matches );
226 + // A preset reference can include a var() fallback and a trailing font stack.
227 + preg_match( '/^\s*var\(\s*--wp--preset--font-family--(?P<slug>[^\s,()]+)\s*[,)]/', $font_family, $matches );
218 228
219 229 if ( isset( $matches['slug'] ) ) {
220 230 return $matches['slug'];
221 231 }
@@ -221,15 +231,15 @@
221 231 }
222 232
223 233 // Full string: var:preset|font-family|slug
224 234 // We do not care about the origin of the font, only its slug.
225 - preg_match( '/font-family\|(?P<slug>.+)$/', $font_family, $matches );
235 + preg_match( '/^\s*var:preset\|font-family\|(?P<slug>[^\s,]+)/', $font_family, $matches );
226 236
227 237 if ( isset( $matches['slug'] ) ) {
228 238 return $matches['slug'];
229 239 }
230 240
231 - return $font_family;
241 + return self::get_font_family_name( $setting['typography'] );
232 242 }
233 243
234 244 /**
235 245 * Check if the current screen is the block editor.