$css_folder['url'] . $sanitize_font_name . '.css', 'version' => time(), ]; $css_folder_path = $css_folder['path'] . $sanitize_font_name . '.css'; $is_font_file_saved = file_put_contents( $css_folder_path, $css_content ); if ( ! $is_font_file_saved ) { return false; } static::set_local_google_fonts( $sanitize_font_name, $font_data ); return true; } private static function get_folder( string $folder ): array { $folders = static::get_folders(); return $folders[ $folder ] ?? []; } private static function get_folders(): array { static::init_folders(); return static::$folders; } private static function init_folders(): void { if ( ! empty( static::$folders ) ) { return; } static::$folders = []; $upload_dir = wp_upload_dir(); foreach ( static::AVAILABLE_FOLDERS as $folder ) { $folder_path = $upload_dir['basedir'] . '/' . static::FOLDER_BASE . '/' . $folder; $folder_url = $upload_dir['baseurl'] . '/' . static::FOLDER_BASE . '/' . $folder; if ( ! file_exists( $folder_path ) ) { wp_mkdir_p( $folder_path ); } static::$folders[ $folder ] = [ 'path' => trailingslashit( $folder_path ), 'url' => trailingslashit( $folder_url ), ]; } } private static function get_css_content( string $font_name, $font_type ): string { $css_content = static::get_raw_css_content( $font_name, $font_type ); if ( empty( $css_content ) ) { return ''; } return static::download_fonts( $font_name, $css_content ); } private static function get_raw_css_content( string $font_name, string $font_type ): string { $font_url = static::get_google_fonts_remote_url( $font_name, $font_type ); $css_content_response = wp_remote_get( $font_url, [ 'headers' => [ 'User-Agent' => static::UA_STRING, ], ] ); if ( is_wp_error( $css_content_response ) || 200 !== (int) wp_remote_retrieve_response_code( $css_content_response ) ) { return ''; } return wp_remote_retrieve_body( $css_content_response ); } private static function get_google_fonts_remote_url( string $font, string $font_type ): string { if ( self::TYPE_EARLYACCESS === $font_type ) { return static::get_earlyaccess_google_fonts_url( $font ); } return Plugin::$instance->frontend->get_stable_google_fonts_url( [ $font ] ); } private static function get_earlyaccess_google_fonts_url( string $font ): string { return sprintf( 'https://fonts.googleapis.com/earlyaccess/%s.css', strtolower( str_replace( ' ', '', $font ) ) ); } private static function download_fonts( string $font_name, string $css_content ): string { preg_match_all( '/url\(([^)]+)\)/', $css_content, $font_urls ); if ( ! function_exists( 'download_url' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } if ( ! empty( $font_urls[1] ) ) { $font_urls = $font_urls[1]; $fonts_folder = static::get_folder( static::FOLDER_FONTS ); $sanitize_font_name = static::sanitize_font_name( $font_name ); foreach ( $font_urls as $current_font_url ) { $original_font_url = trim( $current_font_url, '\'"' ); $cleaned_url = set_url_scheme( $original_font_url, 'https' ); $cleaned_url = strtok( $cleaned_url, '?#' ); $tmp_font_file = download_url( $cleaned_url ); if ( is_wp_error( $tmp_font_file ) ) { return ''; } $current_font_basename = $sanitize_font_name . '-' . strtolower( sanitize_file_name( basename( $cleaned_url ) ) ); $dest_file = $fonts_folder['path'] . $current_font_basename; $dest_file_url = $fonts_folder['url'] . $current_font_basename; // Use copy and unlink because rename breaks streams. // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged $is_font_file_saved = @copy( $tmp_font_file, $dest_file ); @unlink( $tmp_font_file ); if ( ! $is_font_file_saved ) { return ''; } $css_content = str_replace( $original_font_url, $dest_file_url, $css_content ); } } return $css_content; } private static function enqueue_from_cdn( string $font_name, string $font_type ): void { $font_url = static::get_google_fonts_remote_url( $font_name, $font_type ); $sanitize_font_name = static::sanitize_font_name( $font_name ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion wp_enqueue_style( 'elementor-gf-' . $sanitize_font_name, $font_url, [], null ); } public static function clear_cache() { $folders = static::get_folders(); foreach ( $folders as $folder ) { $path = $folder['path'] . '*'; foreach ( glob( $path ) as $file_path ) { unlink( $file_path ); } } delete_option( '_elementor_local_google_fonts' ); } }