329 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			329 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace ShortPixel\Model;
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
|  exit; // Exit if accessed directly.
 | |
| }
 | |
| 
 | |
| use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | |
| 
 | |
| /** Loads a few environment variables handy to have nearby
 | |
| *
 | |
| * Notice - This is meant to be loaded via the plugin class. Easy access with wpSPIO()->getEnv().
 | |
| */
 | |
| class EnvironmentModel extends \ShortPixel\Model
 | |
| {
 | |
|     // Server and PHP
 | |
|     public $is_nginx;
 | |
|     public $is_apache;
 | |
|     public $is_gd_installed;
 | |
|     public $is_curl_installed;
 | |
|     private $disabled_functions = array();
 | |
| 
 | |
|     // MultiSite
 | |
|     public $is_multisite;
 | |
|     public $is_mainsite;
 | |
| 
 | |
|     // Integrations
 | |
|     public $has_nextgen;
 | |
| 
 | |
|     // WordPress
 | |
|     public $is_front = false;
 | |
|     public $is_admin = false;
 | |
|     public $is_ajaxcall = false;
 | |
| 
 | |
|     private $screen_is_set = false;
 | |
|     public $is_screen_to_use = false; // where shortpixel optimizer loads
 | |
|     public $is_our_screen = false; // where shortpixel hooks in more complicated functions.
 | |
| 		public $is_gutenberg_editor = false;
 | |
|     public $is_bulk_page = false; // ShortPixel bulk screen.
 | |
|     public $screen_id = false;
 | |
| 
 | |
|     // Debug flag
 | |
|     public $is_debug = false;
 | |
| 		// Is the plugin configured to automatically optimize on upload hook?
 | |
|     public $is_autoprocess = false;
 | |
| 
 | |
|     protected static $instance;
 | |
| 
 | |
| 
 | |
|   public function __construct()
 | |
|   {
 | |
|      $this->setServer();
 | |
|      $this->setWordPress();
 | |
|      add_action('plugins_loaded', array($this, 'setIntegrations') ); // not set on construct.
 | |
|      add_action('current_screen', array($this, 'setScreen') );  // Not set on construct
 | |
|   }
 | |
| 
 | |
|   public static function getInstance()
 | |
|   {
 | |
|     if (is_null(self::$instance))
 | |
|         self::$instance = new EnvironmentModel();
 | |
| 
 | |
|     /*if (! self::$instance->screen_is_set)
 | |
|       self::$instance->setScreen(); */
 | |
| 
 | |
|     return self::$instance;
 | |
|   }
 | |
| 
 | |
|   /** Check ENV is a specific function is allowed. Use this with functions that might be turned off on configurations
 | |
|   * @param $function String  The name of the function being tested
 | |
|   * Note: In future this function can be extended with other function edge cases.
 | |
|   */
 | |
|   public function is_function_usable($function)
 | |
|   {
 | |
|     if (count($this->disabled_functions) == 0)
 | |
|     {
 | |
|       $disabled = ini_get('disable_functions');
 | |
|       $this->disabled_functions = explode(',', $disabled);
 | |
|     }
 | |
| 
 | |
|     if (isset($this->disabled_functions[$function]))
 | |
|       return false;
 | |
| 
 | |
|     if (function_exists($function))
 | |
|       return true;
 | |
| 
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
| 	public function checkPHPVersion($needed)
 | |
| 	{
 | |
| 
 | |
| 		 if (version_compare(PHP_VERSION, $needed) >= 0 )
 | |
| 		 {
 | |
| 			 return true;
 | |
| 		 }
 | |
| 		 return false;
 | |
| 	}
 | |
| 
 | |
| 	public function plugin_active($name)
 | |
| 	{
 | |
| 		 switch($name)
 | |
| 		 {
 | |
| 			  case 'wpml':
 | |
| 					$plugin = 'sitepress-multilingual-cms/sitepress.php';
 | |
| 				break;
 | |
| 				case 'polylang':
 | |
| 					$plugin = 'polylang/polylang.php';
 | |
| 				break;
 | |
| 				case 'spai':
 | |
| 					$plugin = 'shortpixel-adaptive-images/short-pixel-ai.php';
 | |
| 				break;
 | |
| 				case 's3-offload':
 | |
| 				  $plugin = 'amazon-s3-and-cloudfront/wordpress-s3.php';
 | |
| 				break;
 | |
| 				case 'woocommerce':
 | |
| 					 $plugin = 'woocommerce/woocommerce.php';
 | |
| 				break;
 | |
| 				default:
 | |
| 				 	$plugin = 'none';
 | |
| 				break;
 | |
| 		 }
 | |
| 
 | |
| 		 if (!function_exists('is_plugin_active')) {
 | |
|     	include_once(ABSPATH . 'wp-admin/includes/plugin.php');
 | |
| 		 }
 | |
| 
 | |
| 		 return \is_plugin_active($plugin);
 | |
| 	}
 | |
| 
 | |
|   //https://www.php.net/manual/en/function.sys-getloadavg.php
 | |
|   public function getSystemLoad()
 | |
|   {
 | |
|       $load = sys_getloadavg();
 | |
| 
 | |
|   }
 | |
| 
 | |
|   /* https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-image-editor-imagick.php */
 | |
|   public function hasImagick()
 | |
|   {
 | |
|     $editor = wp_get_image_editor(\wpSPIO()->plugin_path('res/img/test.jpg'));
 | |
|     $className = get_class($editor);
 | |
| 
 | |
|     if ($className == 'WP_Image_Editor_Imagick')
 | |
|       return true;
 | |
|     else
 | |
|       return false;
 | |
|   }
 | |
| 
 | |
| 	public function hasOffload()
 | |
| 	{
 | |
| 			$off = \ShortPixel\External\Offload\Offloader::getInstance();
 | |
| 			$name = $off->getOffloadName();
 | |
| 			if (is_null($name))
 | |
| 				return false;
 | |
| 			else
 | |
| 				return true;
 | |
| 	}
 | |
| 
 | |
|   public function getOffloadName()
 | |
|   {
 | |
|     $off = \ShortPixel\External\Offload\Offloader::getInstance();
 | |
|     $name = $off->getOffloadName();
 | |
|     return $name;
 | |
|   }
 | |
| 
 | |
|   public function useVirtualHeavyFunctions()
 | |
|   {
 | |
|       $bool = apply_filters('shortpixel/file/virtual/heavy_features', true);
 | |
|       return $bool;
 | |
|   }
 | |
| 
 | |
|   private function setServer()
 | |
|   {
 | |
|     $this->is_nginx = ! empty($_SERVER["SERVER_SOFTWARE"]) && strpos(strtolower(wp_unslash($_SERVER["SERVER_SOFTWARE"])), 'nginx') !== false ? true : false;
 | |
|     $this->is_apache = ! empty($_SERVER["SERVER_SOFTWARE"]) && strpos(strtolower(wp_unslash($_SERVER["SERVER_SOFTWARE"])), 'apache') !== false ? true : false;
 | |
|     $this->is_gd_installed = function_exists('imagecreatefrompng') && function_exists('imagejpeg');
 | |
|     $this->is_curl_installed = function_exists('curl_init');
 | |
|   }
 | |
| 
 | |
| 
 | |
|   private function setWordPress()
 | |
|   {
 | |
|     $this->is_multisite = (function_exists("is_multisite") && is_multisite()) ? true : false;
 | |
|     $this->is_mainsite = (function_exists('is_main_site') && true === is_main_site()) ? true : false; 
 | |
| 
 | |
|     $this->determineFrontBack();
 | |
| 
 | |
|     if (wp_doing_ajax())
 | |
|     {
 | |
|       $this->is_ajaxcall = true;
 | |
|     }
 | |
| 
 | |
|     $this->is_debug = Log::debugIsActive();
 | |
| 
 | |
|     if (\wpSPIO()->settings()->autoMediaLibrary == 1)
 | |
|       $this->is_autoprocess = true;
 | |
| 
 | |
|   }
 | |
| 
 | |
|   // check if this request is front or back.
 | |
|   protected function determineFrontBack()
 | |
|   {
 | |
|     if ( is_admin() || wp_doing_ajax() )
 | |
|       $this->is_admin = true;
 | |
|     else
 | |
|       $this->is_front = true;
 | |
| 
 | |
|   }
 | |
| 
 | |
|   public function setScreen($screen)
 | |
|   {
 | |
|     // WordPress pages where we'll be active on.
 | |
|     // https://codex.wordpress.org/Plugin_API/Admin_Screen_Reference
 | |
|     $use_screens = array(
 | |
|         'edit-post_tag', // edit tags
 | |
|         'upload', // media library
 | |
|         'attachment', // edit media
 | |
|         'post', // post screen
 | |
|         'page', // page editor
 | |
|         'edit-post', // edit post
 | |
|         'new-post',  // new post
 | |
|         'edit-page', // all pages
 | |
|         'media', // add new item screen
 | |
|     );
 | |
|     $use_screens = apply_filters('shortpixel/init/optimize_on_screens', $use_screens);
 | |
| 
 | |
|     $this->screen_id = $screen->id;
 | |
|     if(is_array($use_screens) && in_array($screen->id, $use_screens)) {
 | |
|           $this->is_screen_to_use = true;
 | |
|     }
 | |
| 
 | |
|     // Our pages.
 | |
|     $pages = \wpSPIO()->get_admin_pages();
 | |
|     // the main WP pages where SPIO hooks a lot of functions into, our operating area.
 | |
|     $wp_pages = array('upload', 'attachment');
 | |
|     $pages = array_merge($pages, $wp_pages);
 | |
| 
 | |
|     /* pages can be null in certain cases i.e. plugin activation.
 | |
|     * treat those cases as improper screen set.
 | |
|     */
 | |
|     if (is_null($pages))
 | |
|     {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     if ( in_array($screen->id, $pages))
 | |
|     {
 | |
|        $this->is_screen_to_use = true;
 | |
|        $this->is_our_screen = true;
 | |
| 
 | |
| 			 // Strpos instead of full screen id, because the first page (media_page) is not reliable and can change.
 | |
|        if ( strpos($screen->id, 'wp-short-pixel-bulk') !== false)
 | |
|         $this->is_bulk_page = true;
 | |
|     }
 | |
| 		elseif (is_object($screen) && method_exists( $screen, 'is_block_editor' ) && $screen->is_block_editor() ) {
 | |
| 			  $this->is_screen_to_use = true;
 | |
| 				$this->is_gutenberg_editor = true;
 | |
| 	  }
 | |
| 
 | |
|     $this->screen_is_set = true;
 | |
|   }
 | |
| 
 | |
|   public function setIntegrations()
 | |
|   {
 | |
|     $ng = \ShortPixel\NextGenController::getInstance();
 | |
|     $this->has_nextgen = $ng->has_nextgen();
 | |
|   }
 | |
| 
 | |
|   //set default move as "list". only set once, it won't try to set the default mode again.
 | |
|   public function setDefaultViewModeList()
 | |
|   {
 | |
|       $settings = \wpSPIO()->settings();
 | |
|       if( $settings->mediaLibraryViewMode == false)
 | |
|       {
 | |
|           $settings->mediaLibraryViewMode = 1;
 | |
|           $currentUserID = false;
 | |
|           if ( function_exists('wp_get_current_user') ) {
 | |
|               $current_user = wp_get_current_user();
 | |
|               $currentUserID = $current_user->ID;
 | |
|               update_user_meta($currentUserID, "wp_media_library_mode", "list");
 | |
|           }
 | |
|       }
 | |
| 
 | |
|   }
 | |
| 
 | |
|   public function getRelativePluginSlug()
 | |
|   {
 | |
|       $dir = SHORTPIXEL_PLUGIN_DIR;
 | |
|       $file = SHORTPIXEL_PLUGIN_FILE;
 | |
| 
 | |
|       $fs = \wpSPIO()->filesystem();
 | |
| 
 | |
|       $plugins_dir = $fs->getDirectory($dir)->getParent();
 | |
| 
 | |
|       $slug = str_replace($plugins_dir->getPath(), '', $file);
 | |
| 
 | |
|       return $slug;
 | |
|   }
 | |
| 
 | |
|   public function useDoubleWebpExtension()
 | |
|   {
 | |
|       if (defined('SHORTPIXEL_USE_DOUBLE_WEBP_EXTENSION') && SHORTPIXEL_USE_DOUBLE_WEBP_EXTENSION)
 | |
|         return true;
 | |
| 
 | |
|       return false;
 | |
|   }
 | |
| 
 | |
| 	public function useDoubleAvifExtension()
 | |
|   {
 | |
|       if (defined('SHORTPIXEL_USE_DOUBLE_AVIF_EXTENSION') && SHORTPIXEL_USE_DOUBLE_AVIF_EXTENSION)
 | |
|         return true;
 | |
| 
 | |
|       return false;
 | |
|   }
 | |
| 
 | |
| 	public function useTrustedMode()
 | |
| 	{
 | |
| 		 if (defined('SHORTPIXEL_TRUSTED_MODE') && true === SHORTPIXEL_TRUSTED_MODE)
 | |
| 		 {
 | |
| 			 	return true;
 | |
| 		 }
 | |
| 		 return false;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 
 | |
| }
 |