settings = $settings; } /** * Register hooks. * * @return void */ public function register() { add_filter( 'script_loader_src', array( $this, 'rewrite_url' ), 20 ); add_filter( 'style_loader_src', array( $this, 'rewrite_url' ), 20 ); add_filter( 'wp_get_attachment_url', array( $this, 'rewrite_url' ), 20 ); add_filter( 'the_content', array( $this, 'rewrite_content' ), 99 ); add_filter( 'acelora_site_accelerator_optimize_html', array( $this, 'rewrite_content' ), 90 ); } /** * Rewrite URLs in content. * * @param string $html HTML. * @return string */ public function rewrite_content( $html ) { if ( ! $this->enabled() ) { return $html; } $base = preg_quote( content_url(), '#' ); return preg_replace_callback( '#(["\'])(' . $base . '[^"\']+\.(?:css|js|jpe?g|png|gif|webp|svg|woff2?|ttf|eot))(["\'])#i', function ( $matches ) { return $matches[1] . esc_url( $this->rewrite_url( $matches[2] ) ) . $matches[3]; }, $html ); } /** * Rewrite a URL. * * @param string $url URL. * @return string */ public function rewrite_url( $url ) { if ( ! $this->enabled() || $this->is_excluded( $url ) ) { return $url; } $cdn = untrailingslashit( $this->settings->get( 'cdn.url', '' ) ); $content = untrailingslashit( content_url() ); $site = untrailingslashit( site_url() ); $home_host = wp_parse_url( home_url(), PHP_URL_HOST ); $url_host = wp_parse_url( $url, PHP_URL_HOST ); if ( $url_host && strtolower( $url_host ) !== strtolower( $home_host ) ) { return $url; } if ( 0 === strpos( $url, $content ) ) { return $cdn . substr( $url, strlen( $content ) ); } if ( 0 === strpos( $url, $site . '/wp-includes' ) ) { return $cdn . substr( $url, strlen( $site ) ); } return $url; } /** * Validate current CDN configuration. * * @return array */ public function verification() { $url = $this->settings->get( 'cdn.url', '' ); return array( 'enabled' => $this->enabled(), 'url' => $url, 'valid' => (bool) filter_var( $url, FILTER_VALIDATE_URL ), 'host' => $url ? wp_parse_url( $url, PHP_URL_HOST ) : '', ); } /** * Whether CDN rewriting is enabled. * * @return bool */ private function enabled() { return (bool) $this->settings->get( 'cdn.enabled', 0 ) && '' !== $this->settings->get( 'cdn.url', '' ); } /** * Exclusion check. * * @param string $url URL. * @return bool */ private function is_excluded( $url ) { foreach ( $this->settings->list_value( $this->settings->get( 'cdn.exclusions', '' ) ) as $pattern ) { if ( '' !== $pattern && false !== stripos( $url, $pattern ) ) { return true; } } return false; } }