203 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * File: Extension_ImageService_Environment.php
 | |
|  *
 | |
|  * @since 2.2.0
 | |
|  *
 | |
|  * @package W3TC
 | |
|  */
 | |
| 
 | |
| namespace W3TC;
 | |
| 
 | |
| /**
 | |
|  * Class: Extension_ImageService_Environment
 | |
|  */
 | |
| class Extension_ImageService_Environment {
 | |
| 	/**
 | |
| 	 * Fixes environment in each wp-admin request.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @param Config $config           Configuration.
 | |
| 	 * @param bool   $force_all_checks Force all checks.
 | |
| 	 * @throws Util_Environment_Exceptions Exceptions.
 | |
| 	 */
 | |
| 	public function fix_on_wpadmin_request( $config, $force_all_checks ) {
 | |
| 		$exs = new Util_Environment_Exceptions();
 | |
| 
 | |
| 		if ( $config->get_boolean( 'config.check' ) || $force_all_checks ) {
 | |
| 			$extensions_active = $config->get_array( 'extensions.active' );
 | |
| 
 | |
| 			if ( array_key_exists( 'imageservice', $extensions_active ) ) {
 | |
| 				$this->rules_add( $config, $exs );
 | |
| 			} else {
 | |
| 				$this->rules_remove( $exs );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( count( $exs->exceptions() ) > 0 ) {
 | |
| 			throw $exs;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Fixes environment once event occurs.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @param Config $config     Config object.
 | |
| 	 * @param mixed  $event      Event.
 | |
| 	 * @param Config $old_config Old config object.
 | |
| 	 */
 | |
| 	public function fix_on_event( $config, $event, $old_config = null ) {
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Fixes environment after plugin deactivation
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @throws Util_Environment_Exceptions Exceptions.
 | |
| 	 */
 | |
| 	public function fix_after_deactivation() {
 | |
| 		$exs = new Util_Environment_Exceptions();
 | |
| 
 | |
| 		$this->rules_remove( $exs );
 | |
| 
 | |
| 		if ( count( $exs->exceptions() ) > 0 ) {
 | |
| 			throw $exs;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns required rules for module.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @param Config $config Configuration object.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function get_required_rules( $config ) {
 | |
| 		return array(
 | |
| 			array(
 | |
| 				'filename' => Util_Rule::get_browsercache_rules_cache_path(),
 | |
| 				'content'  => $this->rules_generate(),
 | |
| 			),
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Write rewrite rules.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @param Config                      $config Configuration.
 | |
| 	 * @param Util_Environment_Exceptions $exs    Exceptions.
 | |
| 	 *
 | |
| 	 * @throws Util_WpFile_FilesystemOperationException S/FTP form if it can't get the required filesystem credentials.
 | |
| 	 */
 | |
| 	private function rules_add( $config, $exs ) {
 | |
| 		Util_Rule::add_rules(
 | |
| 			$exs,
 | |
| 			Util_Rule::get_browsercache_rules_cache_path(),
 | |
| 			$this->rules_generate(),
 | |
| 			W3TC_MARKER_BEGIN_WEBP,
 | |
| 			W3TC_MARKER_END_WEBP,
 | |
| 			array(
 | |
| 				W3TC_MARKER_BEGIN_BROWSERCACHE_CACHE => 0,
 | |
| 				W3TC_MARKER_BEGIN_WORDPRESS          => 0,
 | |
| 			)
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Generate rewrite rules.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @see Dispatcher::nginx_rules_for_browsercache_section()
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	private function rules_generate() {
 | |
| 		switch ( true ) {
 | |
| 			case Util_Environment::is_apache():
 | |
| 			case Util_Environment::is_litespeed():
 | |
| 				return '
 | |
| # BEGIN W3TC WEBP
 | |
| <IfModule mod_rewrite.c>
 | |
|     RewriteEngine On
 | |
|     RewriteCond %{HTTP_ACCEPT} image/webp
 | |
|     RewriteCond %{REQUEST_FILENAME} (.+)\.(jpe?g|png|gif)$
 | |
|     RewriteCond %1\.webp -f
 | |
|     RewriteCond %{QUERY_STRING} !type=original
 | |
|     RewriteRule (.+)\.(jpe?g|png|gif)$ $1.webp [NC,T=image/webp,E=webp,L]
 | |
| </IfModule>
 | |
| <IfModule mod_headers.c>
 | |
|     <FilesMatch "\.(jpe?g|png|gif)$">
 | |
|         Header append Vary Accept
 | |
|     </FilesMatch>
 | |
| </IfModule>
 | |
| AddType image/webp .webp
 | |
| # END W3TC WEBP
 | |
| 
 | |
| ';
 | |
| 
 | |
| 			case Util_Environment::is_nginx():
 | |
| 				$config = Dispatcher::config();
 | |
| 
 | |
| 				/*
 | |
| 				 * Add Nginx rules only if Browser Cache is disabled.
 | |
| 				 * Otherwise, the rules are added in "BrowserCache_Environment_Nginx.php".
 | |
| 				 * @see BrowserCache_Environment_Nginx::generate_section()
 | |
| 				 */
 | |
| 				if ( ! $config->get_boolean( 'browsercache.enabled' ) ) {
 | |
| 					if ( $config->get_boolean( 'browsercache.no404wp' ) ) {
 | |
| 						$fallback = '=404';
 | |
| 					} else {
 | |
| 						$fallback = '/index.php?$args';
 | |
| 					}
 | |
| 
 | |
| 					return '
 | |
| # BEGIN W3TC WEBP
 | |
| location ~* ^(?<path>.+)\.(jpe?g|png|gif)$ {
 | |
|     if ( $http_accept !~* "webp|\*/\*" ) {
 | |
|         break;
 | |
|     }
 | |
| 
 | |
|     ' . implode( "\n    ", Dispatcher::nginx_rules_for_browsercache_section( $config, 'other' ) ) . '
 | |
| 
 | |
|     add_header Vary Accept;
 | |
|     try_files ${path}.webp $uri ' . $fallback . ';
 | |
| }
 | |
| # END W3TC WEBP
 | |
| 
 | |
| ';
 | |
| 				} else {
 | |
| 					return '';
 | |
| 				}
 | |
| 
 | |
| 			default:
 | |
| 				return '';
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Removes cache directives
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @param Util_Environment_Exceptions $exs Exceptions.
 | |
| 	 *
 | |
| 	 * @throws Util_WpFile_FilesystemOperationException S/FTP form if it can't get the required filesystem credentials.
 | |
| 	 */
 | |
| 	private function rules_remove( $exs ) {
 | |
| 		Util_Rule::remove_rules(
 | |
| 			$exs,
 | |
| 			Util_Rule::get_pgcache_rules_core_path(),
 | |
| 			W3TC_MARKER_BEGIN_WEBP,
 | |
| 			W3TC_MARKER_END_WEBP
 | |
| 		);
 | |
| 	}
 | |
| }
 |