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;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
}
 |