278 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace ShortPixel\Helper;
 | |
| 
 | |
| use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | |
| 
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
|  exit; // Exit if accessed directly.
 | |
| }
 | |
| 
 | |
| // Our newest Tools class
 | |
| class UtilHelper
 | |
| {
 | |
| 
 | |
| 		public static function getPostMetaTable()
 | |
| 		{
 | |
| 			 global $wpdb;
 | |
| 
 | |
| 			 return $wpdb->prefix . 'shortpixel_postmeta';
 | |
| 		}
 | |
| 
 | |
| 		public static function shortPixelIsPluginActive($plugin) {
 | |
|         $activePlugins = apply_filters( 'active_plugins', get_option( 'active_plugins', array()));
 | |
|         if ( is_multisite() ) {
 | |
|             $activePlugins = array_merge($activePlugins, get_site_option( 'active_sitewide_plugins'));
 | |
|         }
 | |
|         return in_array( $plugin, $activePlugins);
 | |
|     }
 | |
| 
 | |
| 		static public function timestampToDB($timestamp)
 | |
| 		{
 | |
| 				return date("Y-m-d H:i:s", $timestamp);
 | |
| 		}
 | |
| 
 | |
| 		static public function DBtoTimestamp($date)
 | |
| 		{
 | |
| 				return strtotime($date);
 | |
| 		}
 | |
| 
 | |
| 		public static function getWordPressImageSizes()
 | |
| 		{
 | |
| 			global $_wp_additional_image_sizes;
 | |
| 
 | |
| 			$sizes_names = get_intermediate_image_sizes();
 | |
| 			$sizes = array();
 | |
| 			foreach ( $sizes_names as $size ) {
 | |
| 					$sizes[ $size ][ 'width' ] = intval( get_option( "{$size}_size_w" ) );
 | |
| 					$sizes[ $size ][ 'height' ] = intval( get_option( "{$size}_size_h" ) );
 | |
| 					$sizes[ $size ][ 'crop' ] = get_option( "{$size}_crop" ) ? get_option( "{$size}_crop" ) : false;
 | |
|           $sizes[ $size ][ 'nice-name'] = ucfirst($size);
 | |
| 			}
 | |
| 			if(function_exists('wp_get_additional_image_sizes')) {
 | |
| 					$sizes = array_merge($sizes, wp_get_additional_image_sizes());
 | |
| 			} elseif(is_array($_wp_additional_image_sizes)) {
 | |
| 					$sizes = array_merge($sizes, $_wp_additional_image_sizes);
 | |
| 			}
 | |
| 
 | |
| 			$sizes = apply_filters('shortpixel/settings/image_sizes', $sizes);
 | |
| 			return $sizes;
 | |
| 		}
 | |
| 
 | |
| 		// wp_normalize_path doesn't work for windows installs in some situations, so we can use it, but we still want some of the functions.
 | |
| 		public static function spNormalizePath($path)
 | |
| 		{
 | |
| 				$path = preg_replace( '|(?<=.)/+|', '/', $path );
 | |
| 				return $path;
 | |
| 		}
 | |
| 
 | |
| 		// Copy of private https://developer.wordpress.org/reference/functions/_wp_relative_upload_path/
 | |
| 		public static function getRelativeUploadPath($path)
 | |
| 		{
 | |
| 				$new_path = $path;
 | |
| 						$uploads = wp_get_upload_dir();
 | |
| 				if ( 0 === strpos( $new_path, $uploads['basedir'] ) ) {
 | |
| 						$new_path = str_replace( $uploads['basedir'], '', $new_path );
 | |
| 						$new_path = ltrim( $new_path, '/' );
 | |
| 				}
 | |
| 			return $new_path;
 | |
| 		}
 | |
| 
 | |
| 		public static function getExclusions($args = array())
 | |
| 		{
 | |
|        $defaults = array(
 | |
|           'filter' => false,
 | |
|           'thumbname' => null,
 | |
|           'is_thumbnail' => false,
 | |
|           'is_custom' => false,
 | |
|        );
 | |
| 
 | |
|        $args = wp_parse_args($args, $defaults);
 | |
| 
 | |
| 			 $patterns = \wpSPIO()->settings()->excludePatterns;
 | |
|        $matches = array();
 | |
| 
 | |
|        if (false === is_array($patterns))
 | |
|        {
 | |
|           return array();
 | |
|        }
 | |
| 
 | |
| 			 foreach($patterns as $index => $pattern)
 | |
| 			 {
 | |
| 				  if (! isset($pattern['apply']))
 | |
| 					{
 | |
| 						 $patterns[$index]['apply'] = 'all';
 | |
| 					}
 | |
| 
 | |
|           if (true === $args['filter'])
 | |
|           {
 | |
|              if (true === self::matchExclusion($patterns[$index], $args))
 | |
|              {
 | |
|                $matches[] = $pattern;
 | |
|              }
 | |
|           }
 | |
| 			 }
 | |
| 
 | |
|        if (true === $args['filter'])
 | |
|        {
 | |
|         return $matches;
 | |
|        }
 | |
|        else
 | |
| 			    return $patterns;
 | |
| 		}
 | |
| 
 | |
|     protected static function matchExclusion($pattern, $options)
 | |
|     {
 | |
|       $apply = $pattern['apply'];
 | |
|       $thumblist = isset($pattern['thumblist']) ? $pattern['thumblist'] : array();
 | |
|       $bool = false;
 | |
| 
 | |
|       if ($apply === 'all')
 | |
|       {
 | |
|         $bool = true;
 | |
|       }
 | |
|       elseif ($apply == 'only-thumbs' && true === $options['is_thumbnail'])
 | |
|       {
 | |
|          $bool = true;
 | |
|       }
 | |
|       elseif ($apply == 'only-custom' && true === $options['is_custom'])
 | |
|       {
 | |
|          $bool = true;
 | |
|       }
 | |
|       elseif (count($thumblist) > 0 && ! is_null($options['thumbname']))
 | |
|       {
 | |
|          $thumbname = $options['thumbname'];
 | |
|          if (in_array($thumbname, $thumblist))
 | |
|          {
 | |
|             $bool = true;
 | |
|          }
 | |
|       }
 | |
|       return $bool;
 | |
|     }
 | |
| 
 | |
| 
 | |
| 		public static function alterHtaccess($webp = false, $avif = false)
 | |
| 		{
 | |
|          // [BS] Backward compat. 11/03/2019 - remove possible settings from root .htaccess
 | |
|          /* Plugin init is before loading these admin scripts. So it can happen misc.php is not yet loaded */
 | |
|          if (! function_exists('insert_with_markers'))
 | |
|          {
 | |
|            Log::addWarn('AlterHtaccess Called before WP init');
 | |
|            return;
 | |
|            //require_once( ABSPATH . 'wp-admin/includes/misc.php' );
 | |
|          }
 | |
|            $upload_dir = wp_upload_dir();
 | |
|            $upload_base = trailingslashit($upload_dir['basedir']);
 | |
| 
 | |
|            if (false === $webp && false === $avif ) {
 | |
|                insert_with_markers( get_home_path() . '.htaccess', 'ShortPixelWebp', '');
 | |
| 
 | |
| 							 // Only empty these tags if the file actually exist, they are created by SPIO.
 | |
| 							if (file_exists($upload_base . '.htaccess'))
 | |
| 							{
 | |
| 								 insert_with_markers( $upload_base . '.htaccess', 'ShortPixelWebp', '');
 | |
| 							}
 | |
| 
 | |
| 
 | |
| 							if (file_exists(trailingslashit(WP_CONTENT_DIR) . '.htaccess'))
 | |
| 							{
 | |
|                insert_with_markers( trailingslashit(WP_CONTENT_DIR) . '.htaccess', 'ShortPixelWebp', '');
 | |
| 						 	}
 | |
| 
 | |
|            } else {
 | |
| 
 | |
|            $avif_rules = '
 | |
|            <IfModule mod_rewrite.c>
 | |
|            RewriteEngine On
 | |
|            ##### Directives for delivering AVIF files, if they exist #####
 | |
|            # Does the browser support avif?
 | |
|            RewriteCond %{HTTP_ACCEPT} image/avif
 | |
|            # AND is the request a jpg or png? (also grab the basepath %1 to match in the next rule)
 | |
|            RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
 | |
|            # AND does a .avif image exist?
 | |
|            RewriteCond %{DOCUMENT_ROOT}/%1.avif -f
 | |
|            # THEN send the avif image and set the env var avif
 | |
|            RewriteRule (.+)\.(?:jpe?g|png)$ $1.avif [NC,T=image/avif,E=avif,L]
 | |
| 
 | |
| 					 # Does the browser support avif?
 | |
| 					 RewriteCond %{HTTP_ACCEPT} image/avif
 | |
| 					 # AND is the request a jpg or png? (also grab the basepath %1 to match in the next rule)
 | |
| 					 RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
 | |
| 					 # AND does a .jpg.avif image exist?
 | |
| 					 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.avif -f
 | |
| 					 # THEN send the avif image and set the env var avif
 | |
| 					 RewriteRule ^(.+)$ $1.avif [NC,T=image/avif,E=avif,L]
 | |
| 
 | |
|            </IfModule>
 | |
|            <IfModule mod_headers.c>
 | |
|            # If REDIRECT_avif env var exists, append Accept to the Vary header
 | |
|            Header append Vary Accept env=REDIRECT_avif
 | |
|            </IfModule>
 | |
|            <IfModule mod_mime.c>
 | |
|            AddType image/avif .avif
 | |
|            </IfModule>
 | |
|                  ';
 | |
| 
 | |
|                $webp_rules = '
 | |
|            <IfModule mod_rewrite.c>
 | |
|              RewriteEngine On
 | |
|              ##### TRY FIRST the file appended with .webp (ex. test.jpg.webp) #####
 | |
|              # Is the browser Chrome?
 | |
|              RewriteCond %{HTTP_USER_AGENT} Chrome [OR]
 | |
|              # OR Is request from Page Speed
 | |
|              RewriteCond %{HTTP_USER_AGENT} "Google Page Speed Insights" [OR]
 | |
|              # OR does this browser explicitly support webp
 | |
|              RewriteCond %{HTTP_ACCEPT} image/webp
 | |
|              # AND NOT MS EDGE 42/17 - doesnt work.
 | |
|              RewriteCond %{HTTP_USER_AGENT} !Edge/17
 | |
|              # AND is the request a jpg, png or gif?
 | |
|              RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
 | |
|              # AND does a .ext.webp image exist?
 | |
|              RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.webp -f
 | |
|              # THEN send the webp image and set the env var webp
 | |
|              RewriteRule ^(.+)$ $1.webp [NC,T=image/webp,E=webp,L]
 | |
|              ##### IF NOT, try the file with replaced extension (test.webp) #####
 | |
|              RewriteCond %{HTTP_USER_AGENT} Chrome [OR]
 | |
|              RewriteCond %{HTTP_USER_AGENT} "Google Page Speed Insights" [OR]
 | |
|              RewriteCond %{HTTP_ACCEPT} image/webp
 | |
|              RewriteCond %{HTTP_USER_AGENT} !Edge/17
 | |
|              # AND is the request a jpg, png or gif? (also grab the basepath %1 to match in the next rule)
 | |
|              RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
 | |
|              # AND does a .webp image exist?
 | |
|              RewriteCond %{DOCUMENT_ROOT}/%1.webp -f
 | |
|              # THEN send the webp image and set the env var webp
 | |
|              RewriteRule (.+)\.(?:jpe?g|png|gif)$ $1.webp [NC,T=image/webp,E=webp,L]
 | |
|            </IfModule>
 | |
|            <IfModule mod_headers.c>
 | |
|              # If REDIRECT_webp env var exists, append Accept to the Vary header
 | |
|              Header append Vary Accept env=REDIRECT_webp
 | |
|            </IfModule>
 | |
|            <IfModule mod_mime.c>
 | |
|              AddType image/webp .webp
 | |
|            </IfModule>
 | |
|            ' ;
 | |
| 
 | |
|              $rules = '';
 | |
|          //    if ($avif)
 | |
|              $rules .= $avif_rules;
 | |
|            //  if ($webp)
 | |
|              $rules .= $webp_rules;
 | |
| 
 | |
|              insert_with_markers( get_home_path() . '.htaccess', 'ShortPixelWebp', $rules);
 | |
| 
 | |
|     /** In uploads and on, it needs Inherit. Otherwise things such as the 404 error page will not be loaded properly
 | |
|    * since the WP rewrite will not be active at that point (overruled) **/
 | |
|     $rules = str_replace('RewriteEngine On', 'RewriteEngine On' . PHP_EOL . 'RewriteOptions Inherit', $rules);
 | |
| 
 | |
| 							// Can shortcircuit (return false) the creation of subdirectory Htaccess files if this causes issues and is not needed.
 | |
| 							 $bool = apply_filters('shortpixel/install/write_deep_htaccess', true);
 | |
| 
 | |
| 							 if (true === $bool)
 | |
| 							 {
 | |
|                	insert_with_markers( $upload_base . '.htaccess', 'ShortPixelWebp', $rules);
 | |
|                	insert_with_markers( trailingslashit(WP_CONTENT_DIR) . '.htaccess', 'ShortPixelWebp', $rules);
 | |
| 							 }
 | |
|            }
 | |
|     }
 | |
| } // class
 |