set_converter_status(); $this->set_server_info_instance(); $this->set_rewrite_status(); $this->set_webp_serve_method(); } /** * Returns singleton instance * * @return WP_Optimize_WebP */ public static function get_instance() { static $instance = null; if (null === $instance) { $instance = new WP_Optimize_WebP(); } return $instance; } /** * Test Run and find converter status */ public function set_converter_status() { include_once WPO_PLUGIN_MAIN_PATH . 'webp/class-wpo-webp-test-run.php'; $converters = WP_Optimize()->get_options()->get_option('webp_converters', false); if (empty($converters)) { $converter_status = WPO_WebP_Test_Run::get_converter_status(); WP_Optimize()->get_options()->update_option('webp_converters', $converter_status['working_converters']); } } /** * Sets server info instance variable */ private function set_server_info_instance() { if (!class_exists('WPO_Server_Info')) { require_once(WPO_PLUGIN_MAIN_PATH . 'webp/class-wpo-server-info.php'); } $this->_server_info_instance = WPO_Server_Info::get_instance(); } /** * Sets server's rewrite status */ private function set_rewrite_status() { $this->_rewrite_status = $this->_server_info_instance->get_rewrite_status(); } /** * Sets how webp images are served */ private function set_webp_serve_method() { if (true === $this->_rewrite_status) { $this->use_htaccess(); } else { $this->use_alter_html(); } } /** * Setup .htaccess method */ private function use_htaccess() { $options = Updraft_Smush_Manager()->get_smush_options(); $webp_conversion_enabled = isset($options['webp_conversion']) ? $options['webp_conversion'] : false; $this->save_htaccess_rules($webp_conversion_enabled); } /** * Setup alter html method */ private function use_alter_html() { // To be continued in another part // add_action('template_direct', array('')); } /** * Save .htaccess rules * * @return bool */ public function save_htaccess_rules($webp_conversion_enabled = false) { $wp_uploads = wp_get_upload_dir(); $htaccess_file = $wp_uploads['basedir'] . '/.htaccess'; if (!file_exists($htaccess_file)) { file_put_contents($htaccess_file, ''); } $htaccess_comment_section = 'WP-Optimize WebP Rules'; $this->_htaccess = new WP_Optimize_Htaccess($htaccess_file); if ($this->_htaccess->is_exists() && !$webp_conversion_enabled) { $this->_htaccess->remove_commented_section($htaccess_comment_section); $this->_htaccess->write_file(); return true; } if ($this->_htaccess->is_commented_section_exists($htaccess_comment_section)) return false; $this->_htaccess->update_commented_section($this->prepare_webp_htaccess_rules(), $htaccess_comment_section); $this->_htaccess->write_file(); return true; } /** * Prepare array of htaccess rules to use webp images. * * @return array */ private function prepare_webp_htaccess_rules() { return array( array( '', 'RewriteEngine On', '', '# Redirect to existing converted image in same dir (if browser supports webp)', 'RewriteCond %{HTTP_ACCEPT} image/webp', 'RewriteCond %{REQUEST_FILENAME} (?i)(.*)(\.jpe?g|\.png)$', 'RewriteCond %1%2\.webp -f', 'RewriteRule (?i)(.*)(\.jpe?g|\.png)$ %1%2\.webp [T=image/webp,E=EXISTING:1,E=ADDVARY:1,L]', '', '# Make sure that browsers which does not support webp also gets the Vary:Accept header', '# when requesting images that would be redirected to webp on browsers that does.', array( '', array( '', 'Header append "Vary" "Accept"', '', ), '', ), '', '', '', ), array( '# Rules for handling requests for webp images', '# ---------------------------------------------', '', '# Set Vary:Accept header if we came here by way of our redirect, which set the ADDVARY environment variable', '# The purpose is to make proxies and CDNs aware that the response varies with the Accept header', '', array( '', '# Apache appends "REDIRECT_" in front of the environment variables defined in mod_rewrite, but LiteSpeed does not', '# So, the next lines are for Apache, in order to set environment variables without "REDIRECT_"', 'SetEnvIf REDIRECT_EXISTING 1 EXISTING=1', 'SetEnvIf REDIRECT_ADDVARY 1 ADDVARY=1', '', 'Header append "Vary" "Accept" env=ADDVARY', '', '# Set X-WPO-WebP header for diagnose purposes', 'Header set "X-WPO-WebP" "Redirected directly to existing webp" env=EXISTING', '', ), '', ), array( '# Register webp mime type', '', 'AddType image/webp .webp', '', ), ); } } endif;