_replace($google_font[2], $file_url, $google_font[0]); //async if(!empty(Config::$options['fonts']['async'])) { $new_google_font = preg_replace(array('#media=([\'"]).+?\1#', '#onload=([\'"]).+?\1#'), '', $new_google_font); $new_google_font = str_replace(' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36')); //check valid response if(wp_remote_retrieve_response_code($css_response) !== 200) { return false; } //css content $css = $css_response['body']; //find font files inside the css $regex = '/url\((https:\/\/fonts\.gstatic\.com\/.*?)\)/'; preg_match_all($regex, $css, $matches); $font_urls = array_unique($matches[1]); $font_requests = array(); foreach($font_urls as $font_url) { if(!file_exists(PERFMATTERS_CACHE_DIR . 'fonts/' . basename($font_url))) { $font_requests[] = array('url' => $font_url, 'type' => 'GET'); } $cached_font_url = self::$font_file_cache_url . 'fonts/' . basename($font_url); $css = str_replace($font_url, $cached_font_url, $css); } //download new font files to cache directory if(method_exists(WpOrg\Requests\Requests::class, 'request_multiple')) { //wp 6.2+ $font_responses = WpOrg\Requests\Requests::request_multiple($font_requests); } elseif(method_exists(RequestsOld::class, 'request_multiple')) { //deprecated $font_responses = RequestsOld::request_multiple($font_requests); } if(!empty($font_responses)) { foreach($font_responses as $font_response) { if(is_a($font_response, 'Requests_Response') || is_a($font_response, 'WpOrg\Requests\Response')) { $font_path = PERFMATTERS_CACHE_DIR . 'fonts/' . basename($font_response->url); //save font file file_put_contents($font_path, $font_response->body); } } } //save final css file file_put_contents($file_path, $css); return true; } //delete all files in the fonts cache directory public static function clear_local_fonts() { $files = glob(PERFMATTERS_CACHE_DIR . 'fonts/*'); foreach($files as $file) { if(is_file($file)) { unlink($file); } } } }