File "class-swis-performance.php"

Full Path: /home/theinspectionboy/public_html/suffolk/includes-20250622113618/class-swis-performance.php
File size: 11.71 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * Class and methods to defer JS/CSS and include critical CSS.
 *
 * @link https://ewww.io/swis/
 * @package SWIS_Performance
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Main SWIS_Performance Class.
 */
final class SWIS_Performance {
	/* Singleton */

	/**
	 * The one and only true SWIS_Performance
	 *
	 * @var SWIS_Performance The one and only true SWIS_Performance
	 */
	private static $instance;

	/**
	 * SWIS Settings object for option pages and related functions.
	 *
	 * @var object|\SWIS\Settings
	 */
	public $settings;

	/**
	 * SWIS Buffer object for HTML parsing.
	 *
	 * @var object|\SWIS\Buffer
	 */
	public $buffer;

	/**
	 * SWIS Element_Filter object for tag/element filtering.
	 *
	 * @var object|\SWIS\Element_Filter
	 */
	public $element_filter;

	/**
	 * SWIS Cache object.
	 *
	 * @var object|\SWIS\Cache
	 */
	public $cache;

	/**
	 * SWIS Cache Preload object.
	 *
	 * @var object|\SWIS\Cache_Preload
	 */
	public $cache_preload;

	/**
	 * SWIS CDN parser object.
	 *
	 * @var object|\SWIS\CDN
	 */
	public $cdn;

	/**
	 * SWIS Defer CSS object.
	 *
	 * @var object|\SWIS\Defer_CSS
	 */
	public $defer_css;

	/**
	 * SWIS Defer JS object.
	 *
	 * @var object|\SWIS\Defer_JS
	 */
	public $defer_js;

	/**
	 * SWIS Minify CSS object.
	 *
	 * @var object|\SWIS\Minify_CSS
	 */
	public $minify_css;

	/**
	 * SWIS Minify JS object.
	 *
	 * @var object|\SWIS\Minify_JS
	 */
	public $minify_js;

	/**
	 * SWIS GZIP object.
	 *
	 * @var object|\SWIS\GZIP
	 */
	public $gzip;

	/**
	 * SWIS Optimize_Fonts object.
	 *
	 * @var object|\SWIS\Optimize_Fonts
	 */
	public $fonts;

	/**
	 * SWIS Prefetch object.
	 *
	 * @var object|\SWIS\Prefetch
	 */
	public $prefetch;

	/**
	 * SWIS Slim object.
	 *
	 * @var object|\SWIS\Slim
	 */
	public $slim;

	/**
	 * Main SWIS_Performance instance.
	 *
	 * Ensures that only one instance of SWIS_Performance exists in memory at any given time.
	 *
	 * @static
	 */
	public static function instance() {
		if ( ! isset( self::$instance ) && ! ( self::$instance instanceof SWIS_Performance ) ) {
			global $wpdb;
			if ( ! isset( $wpdb->swis_queue ) ) {
				$wpdb->swis_queue = $wpdb->prefix . 'swis_queue';
			}
			self::$instance = new SWIS_Performance;
			self::$instance->setup_constants();

			add_action( 'plugins_loaded', array( self::$instance, 'load_textdomain' ), 9 );
			add_filter( 'sq_lateloading', '__return_true' );

			if ( self::$instance->php_supported() && self::$instance->wp_supported() ) {
				self::$instance->includes();
				self::$instance->settings = new \SWIS\Settings();
				add_action( 'plugins_loaded', array( self::$instance, 'init' ) );
				add_filter( 'update_option_swis_performance', array( self::$instance, 'options_updated' ), 10, 2 );
			}
		}

		return self::$instance;
	}

	/**
	 * Throw error on object clone.
	 *
	 * The whole idea of the singleton design pattern is that there is a single
	 * object. Therefore, we don't want the object to be cloned.
	 */
	public function __clone() {
		// Cloning instances of the class is forbidden.
		_doing_it_wrong( __METHOD__, esc_html__( 'Cannot clone core object.', 'swis-performance' ), esc_html( SWIS_PLUGIN_VERSION ) );
	}

	/**
	 * Disable unserializing of the class.
	 */
	public function __wakeup() {
		// Unserializing instances of the class is forbidden.
		_doing_it_wrong( __METHOD__, esc_html__( 'Cannot unserialize (wakeup) the core object.', 'swis-performance' ), esc_html( SWIS_PLUGIN_VERSION ) );
	}

	/**
	 * Class initialization for plugin.
	 */
	function init() {
		self::$instance->buffer         = new \SWIS\Buffer();
		self::$instance->element_filter = new \SWIS\Element_Filter();
		self::$instance->cache          = new \SWIS\Cache();
		self::$instance->cache_preload  = new \SWIS\Cache_Preload();
		self::$instance->cdn            = new \SWIS\CDN();
		self::$instance->defer_js       = new \SWIS\Defer_JS();
		self::$instance->defer_css      = new \SWIS\Defer_CSS();
		self::$instance->minify_js      = new \SWIS\Minify_JS();
		self::$instance->minify_css     = new \SWIS\Minify_CSS();
		self::$instance->gzip           = new \SWIS\GZIP();
		self::$instance->fonts          = new \SWIS\Optimize_Fonts();
		self::$instance->prefetch       = new \SWIS\Prefetch();
		self::$instance->slim           = new \SWIS\Slim();

		// Background/Async classes.
		self::$instance->cache_preload_async      = new \SWIS\Cache_Preload_Async();
		self::$instance->cache_preload_background = new \SWIS\Cache_Preload_Background();
		self::$instance->test_async               = new \SWIS\Test_Async_Request();
		register_deactivation_hook( SWIS_PLUGIN_FILE, array( self::$instance->gzip, 'remove_htaccess_rules' ) );
	}

	/**
	 * Make sure we are on a supported version of PHP.
	 *
	 * @access private
	 */
	private function php_supported() {
		if ( ! defined( 'PHP_VERSION_ID' ) || PHP_VERSION_ID < 70200 ) {
			add_action( 'network_admin_notices', array( self::$instance, 'unsupported_php_notice' ) );
			add_action( 'admin_notices', array( self::$instance, 'unsupported_php_notice' ) );
			return false;
		}
		return true;
	}

	/**
	 * Make sure we are on a supported version of WP.
	 *
	 * @access private
	 */
	private function wp_supported() {
		global $wp_version;
		if ( version_compare( $wp_version, '5.4' ) >= 0 ) {
			return true;
		}
		add_action( 'network_admin_notices', array( self::$instance, 'unsupported_wp_notice' ) );
		add_action( 'admin_notices', array( self::$instance, 'unsupported_wp_notice' ) );
		return false;
	}

	/**
	 * Display a notice that the PHP version is too old.
	 */
	public function unsupported_php_notice() {
		echo '<div id="swis-warning-php" class="notice notice-error"><p><a href="https://docs.ewww.io/article/55-upgrading-php" target="_blank">' . esc_html__( 'For performance and security reasons, SWIS Performance requires PHP 7.2 or greater. If you are unsure how to upgrade to a supported version, ask your webhost for instructions.', 'swis-performance' ) . '</a></p></div>';
	}

	/**
	 * Display a notice that the WP version is too old.
	 */
	public function unsupported_wp_notice() {
		echo '<div id="swis-warning-wp" class="notice notice-error"><p>' . esc_html__( 'SWIS Performance requires WordPress 5.0 or greater, please update your website.', 'swis-performance' ) . '</p></div>';
	}

	/**
	 * Setup plugin constants.
	 *
	 * @access private
	 */
	private function setup_constants() {
		// This is the full system path to the plugin folder.
		define( 'SWIS_PLUGIN_PATH', plugin_dir_path( SWIS_PLUGIN_FILE ) );
		// The directory where cached HTML pages are stored (if page caching is enabled ).
		define( 'SWIS_CACHE_DIR', WP_CONTENT_DIR . '/swis/cache/html' );
		// The site for auto-update checking.
		define( 'SWIS_SL_STORE_URL', 'https://ewww.io' );
		// Product ID for update checking.
		define( 'SWIS_SL_ITEM_ID', 1188482 );
	}

	/**
	 * Include required files.
	 *
	 * @access private
	 */
	private function includes() {
		// All the base functions for our plugins.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-base.php' );
		// All the parsing functions for our plugins.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-page-parser.php' );
		// Sets up the settings page and options.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-settings.php' );
		// Starts the HTML buffer for all other functions to parse.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-buffer.php' );
		// Parses the HTML buffer for elements that should be filtered by multiple classes.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-element-filter.php' );
		// The test async class and methods.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-test-async-request.php' );
		// The Caching class & methods.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-cache.php' );
		// The Cache Engine class & methods.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-cache-engine.php' );
		// The WebP Caching extension class & methods.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-cache-webp.php' );
		// The Disk Cache class & methods.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-disk-cache.php' );
		// The Cache Preloader class & methods.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-cache-preload.php' );
		// Async Request methods for Cache Preloader.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-cache-preload-async.php' );
		// Background Processing methods for Cache Preloader.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-cache-preload-background.php' );
		// The CDN-parsing class & functions.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-cdn.php' );
		// The JS deferring class & functions.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-defer-js.php' );
		// The CSS deferring class & functions.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-defer-css.php' );
		// The JS minify class & functions.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-minify-js.php' );
		// The CSS minify class & functions.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-minify-css.php' );
		// The class to auto-insert GZIP and other rules.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-gzip.php' );
		// The class to auto-detect Google Fonts, inline and pre-connect them.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-optimize-fonts.php' );
		// The class to auto-insert DNS prefetch hints.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-prefetch.php' );
		// The class to eliminate unused JS/CSS and related tools.
		require_once( SWIS_PLUGIN_PATH . 'includes/class-slim.php' );
	}

	/**
	 * Makes sure to load the language files.
	 */
	public function load_textdomain() {
		load_plugin_textdomain( 'swis-performance', false, SWIS_PLUGIN_PATH . 'languages/' );
	}

	/**
	 * Run any actions triggered by an update to the swis_performance options.
	 *
	 * @param mixed $old_settings The old value(s).
	 * @param mixed $new_settings The new value(s).
	 */
	public function options_updated( $old_settings, $new_settings ) {
		$network_wide = false;
		if ( ! function_exists( 'is_plugin_active_for_network' ) && is_multisite() ) {
			require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
		}
		if ( is_multisite() && is_plugin_active_for_network( plugin_basename( SWIS_PLUGIN_FILE ) ) ) {
			$network_wide = true;
		}
		if ( empty( $old_settings['cache'] ) && ! empty( $new_settings['cache'] ) ) {
			$this->cache->on_activation( $network_wide );
		}
		if ( ! empty( $old_settings['cache'] ) && empty( $new_settings['cache'] ) ) {
			remove_all_actions( 'swis_site_cache_cleared' );
			remove_all_actions( 'swis_cache_by_url_cleared' );
			$this->cache->on_deactivation( $network_wide );
		}
		if ( ! empty( $old_settings['cache'] ) && ! empty( $new_settings['cache'] ) ) {
			$cache_clear_settings = array( 'defer_css', 'defer_js', 'minify_css', 'minify_js', 'critical_css', 'optimize_fonts', 'cdn_domain' );
			foreach ( $cache_clear_settings as $key ) {
				if ( isset( $old_settings[ $key ] ) && isset( $new_settings[ $key ] ) && $old_settings[ $key ] !== $new_settings[ $key ] ) {
					$this->cache->clear_complete_cache();
				}
			}
		}
		if ( (bool) $old_settings['cache_settings']['webp'] !== (bool) $new_settings['cache_settings']['webp'] ) {
			$this->cache->clear_complete_cache();
		}
		if ( $this->settings->background_mode_enabled() ) {
			if ( empty( $old_settings['cache_preload'] ) && ! empty( $new_settings['cache_preload'] ) ) {
				// If cache preload is enabled, start the preloader.
				$this->cache_preload->start_preload();
			} elseif ( ! empty( $old_settings['cache_preload'] ) && empty( $new_settings['cache_preload'] ) ) {
				// If cache preload is disabled, cancel anything that is running.
				$this->cache_preload->stop_preload();
			} elseif ( ! empty( $new_settings['cache_preload'] ) && ! empty( $old_settings['cache'] ) && empty( $new_settings['cache'] ) ) {
				// If caching is disabled and preload is still enabled, also cancel.
				$this->cache_preload->stop_preload();
			}
		}
	}
}