hide_comments( $html ); $fonts = $this->find( '])+)?(?:\s+href\s*=\s*([\'"])(?(?:https?:)?\/\/fonts\.googleapis\.com\/css[^\d](?:(?!\1).)+)\1)(?:\s+[^>]*)?>', $html_nocomments ); if ( ! $fonts ) { Logger::debug( 'No Google Fonts found.', [ 'GF combine process' ] ); $this->has_google_fonts = false; return $html; } $this->has_google_fonts = true; $num_fonts = count( $fonts ); Logger::debug( "Found {$num_fonts} Google Fonts.", [ 'GF combine process', 'tags' => $fonts, ] ); $this->parse( $fonts ); if ( empty( $this->fonts ) ) { Logger::debug( 'No Google Fonts left to combine.', [ 'GF combine process' ] ); return $html; } $html = preg_replace( '@<\/title>@i', '$0' . $this->get_optimized_markup( $this->get_combined_url() ), $html, 1 ); foreach ( $fonts as $font ) { $html = str_replace( $font[0], '', $html ); } Logger::info( 'Google Fonts successfully combined.', [ 'GF combine process', 'url' => $this->fonts . $this->subsets, ] ); return $html; } /** * Parses found matches to extract fonts and subsets. * * @since 3.1 * * @param array $matches Found matches for the pattern. * * @return void */ private function parse( array $matches ) { $fonts_array = []; $subsets_array = []; foreach ( $matches as $match ) { $url = html_entity_decode( $match[2] ); $query = wp_parse_url( $url, PHP_URL_QUERY ); if ( empty( $query ) ) { return; } $font = wp_parse_args( $query ); if ( isset( $font['family'] ) ) { $font_family = $font['family']; $font_family = rtrim( $font_family, '%7C' ); $font_family = rtrim( $font_family, '|' ); // Add font to the collection. $fonts_array[] = rawurlencode( htmlentities( $font_family ) ); } // Add subset to collection. if ( isset( $font['subset'] ) ) { $subsets_array[] = rawurlencode( htmlentities( $font['subset'] ) ); } } // Concatenate fonts tag. $this->subsets = ! empty( $subsets_array ) ? '&subset=' . implode( ',', array_filter( array_unique( $subsets_array ) ) ) : ''; $this->fonts = ! empty( $fonts_array ) ? implode( '%7C', array_filter( array_unique( $fonts_array ) ) ) : ''; } /** * Returns the combined Google fonts URL * * @since 3.9.1 * * @return string */ private function get_combined_url(): string { $display = $this->get_font_display_value(); return esc_url( "https://fonts.googleapis.com/css?family={$this->fonts}{$this->subsets}&display={$display}" ); } }