PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.3.3
Jetpack – WP Security, Backup, Speed, & Growth v13.3.3
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 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 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 / class-jetpack-google-font-face.php
jetpack / modules / google-fonts / current Last commit date
class-jetpack-google-font-face.php 2 years ago load-google-fonts.php 2 years ago
class-jetpack-google-font-face.php
250 lines
1 <?php
2 /**
3 * Jetpack_Google_Font_Face class
4 *
5 * @package automattic/jetpack
6 */
7
8 /**
9 * Jetpack Google Font Face disables Font Face hooks in Core that prints **ALL** font faces.
10 * Instead, it collects fonts that are used in global styles or block-level settings and
11 * print those fonts in use.
12 */
13 class Jetpack_Google_Font_Face {
14 /**
15 * The fonts that are used in global styles or block-level settings.
16 *
17 * @var array
18 */
19 private $fonts_in_use = array();
20
21 /**
22 * The constructor.
23 */
24 public function __construct() {
25 // Turns off hooks to print fonts
26 add_action( 'wp_loaded', array( $this, 'wp_loaded' ) );
27 add_action( 'current_screen', array( $this, 'current_screen' ), 10 );
28
29 // Collect and print fonts in use
30 add_action( 'wp_head', array( $this, 'print_font_faces' ), 50 );
31 add_filter( 'pre_render_block', array( $this, 'collect_block_fonts' ), 10, 2 );
32 }
33
34 /**
35 * Turn off hooks to print fonts on frontend
36 */
37 public function wp_loaded() {
38 remove_action( 'wp_head', 'wp_print_fonts', 50 );
39 remove_action( 'wp_head', 'wp_print_font_faces', 50 );
40 }
41
42 /**
43 * Turn off hooks to print fonts on wp-admin, except for GB editor pages.
44 */
45 public function current_screen() {
46 remove_action( 'admin_print_styles', 'wp_print_fonts', 50 );
47
48 if ( ! $this->is_block_editor() ) {
49 remove_action( 'admin_print_styles', 'wp_print_font_faces', 50 );
50 }
51 }
52
53 /**
54 * Print fonts that are used in global styles or block-level settings.
55 */
56 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 $fonts = WP_Font_Face_Resolver::get_fonts_from_theme_json();
60 $font_slug_aliases = $this->get_font_slug_aliases();
61 $fonts_to_print = array();
62
63 $this->collect_global_styles_fonts();
64 $fonts_in_use = array_values( array_unique( $this->fonts_in_use, SORT_STRING ) );
65 $fonts_in_use = array_map(
66 function ( $font_slug ) use ( $font_slug_aliases ) {
67 return $font_slug_aliases[ $font_slug ] ?? $font_slug;
68 },
69 $this->fonts_in_use
70 );
71
72 foreach ( $fonts as $font_faces ) {
73 $font_family = $font_faces[0]['font-family'] ?? '';
74 if ( in_array( $this->format_font( $font_family ), $fonts_in_use, true ) ) {
75 $fonts_to_print[ $font_family ] = $font_faces;
76 }
77 }
78
79 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 wp_print_font_faces( $fonts_to_print );
83 }
84 }
85
86 /**
87 * Collect fonts used for global styles settings.
88 */
89 public function collect_global_styles_fonts() {
90 $global_styles = wp_get_global_styles();
91
92 $global_styles_font_slug = $this->get_font_slug_from_setting( $global_styles );
93 if ( $global_styles_font_slug ) {
94 $this->add_font( $global_styles_font_slug );
95 }
96
97 if ( isset( $global_styles['blocks'] ) ) {
98 foreach ( $global_styles['blocks'] as $setting ) {
99 $font_slug = $this->get_font_slug_from_setting( $setting );
100
101 if ( $font_slug ) {
102 $this->add_font( $font_slug );
103 }
104 }
105 }
106
107 if ( isset( $global_styles['elements'] ) ) {
108 foreach ( $global_styles['elements'] as $setting ) {
109 $font_slug = $this->get_font_slug_from_setting( $setting );
110
111 if ( $font_slug ) {
112 $this->add_font( $font_slug );
113 }
114 }
115 }
116 }
117
118 /**
119 * Collect fonts used for block-level settings.
120 *
121 * @filter pre_render_block
122 *
123 * @param string|null $content The pre-rendered content. Default null.
124 * @param array $parsed_block The block being rendered.
125 */
126 public function collect_block_fonts( $content, $parsed_block ) {
127 if ( ! is_admin() && isset( $parsed_block['attrs']['fontFamily'] ) ) {
128 $block_font_family = $parsed_block['attrs']['fontFamily'];
129 $this->add_font( $block_font_family );
130 }
131
132 return $content;
133 }
134
135 /**
136 * Add the specify font to the fonts_in_use list.
137 *
138 * @param string $font_slug The font slug.
139 */
140 public function add_font( $font_slug ) {
141 $this->fonts_in_use[] = $this->format_font( $font_slug );
142 }
143
144 /**
145 * Format the given font slug.
146 *
147 * @example "ABeeZee" formats to "abeezee"
148 * @example "ADLaM Display" formats to "adlam-display"
149 * @param string $font_slug The font slug.
150 * @return string The formatted font slug.
151 */
152 public function format_font( $font_slug ) {
153 return _wp_to_kebab_case( strtolower( $font_slug ) );
154 }
155
156 /**
157 * Get the font slug aliases that maps the font slug to the font family if they are different.
158 *
159 * The font definition may define an alias slug name, so we have to add the map from the slug name to the font family.
160 * See https://github.com/WordPress/twentytwentyfour/blob/df92472089ede6fae5924c124a93c843b84e8cbd/theme.json#L215.
161 */
162 public function get_font_slug_aliases() {
163 $font_slug_aliases = array();
164
165 $theme_json = WP_Theme_JSON_Resolver::get_theme_data();
166 $raw_data = $theme_json->get_data();
167 if ( ! empty( $raw_data['settings']['typography']['fontFamilies'] ) ) {
168 foreach ( $raw_data['settings']['typography']['fontFamilies'] as $font ) {
169 $font_family_name = $this->format_font( $this->get_font_family_name( $font ) );
170 $font_slug = $font['slug'] ?? '';
171 if ( $font_slug && $font_slug !== $font_family_name && ! array_key_exists( $font_slug, $font_slug_aliases ) ) {
172 $font_slug_aliases[ $font_slug ] = $font_family_name;
173 }
174 }
175 }
176
177 return $font_slug_aliases;
178 }
179
180 /**
181 * Get the font family name from a font.
182 *
183 * @param array $font The font definition object.
184 */
185 public static function get_font_family_name( $font ) {
186 $font_family = $font['fontFamily'];
187 if ( str_contains( $font_family, ',' ) ) {
188 $font_family = explode( ',', $font_family )[0];
189 }
190
191 return trim( $font_family, "\"'" );
192 }
193
194 /**
195 * Get the font family slug from a settings array.
196 *
197 * @param array $setting The settings object.
198 *
199 * @return string|null
200 */
201 public function get_font_slug_from_setting( $setting ) {
202 if ( ! isset( $setting['typography']['fontFamily'] ) ) {
203 return null;
204 }
205
206 $font_family = $setting['typography']['fontFamily'];
207
208 // The font family may be a reference to a path to the value stored at that location,
209 // e.g.: { "ref": "styles.elements.heading.typography.fontFamily" }.
210 // Ignore it as we also get the value stored at that location from the setting.
211 if ( ! is_string( $font_family ) ) {
212 return null;
213 }
214
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 );
218
219 if ( isset( $matches['slug'] ) ) {
220 return $matches['slug'];
221 }
222
223 // Full string: var:preset|font-family|slug
224 // We do not care about the origin of the font, only its slug.
225 preg_match( '/font-family\|(?P<slug>.+)$/', $font_family, $matches );
226
227 if ( isset( $matches['slug'] ) ) {
228 return $matches['slug'];
229 }
230
231 return $font_family;
232 }
233
234 /**
235 * Check if the current screen is the block editor.
236 *
237 * @return bool
238 */
239 public function is_block_editor() {
240 if ( function_exists( 'get_current_screen' ) ) {
241 $current_screen = get_current_screen();
242 if ( ! empty( $current_screen ) && method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) {
243 return true;
244 }
245 }
246
247 return false;
248 }
249 }
250