316 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace ShortPixel\Helper;
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
|  exit; // Exit if accessed directly.
 | |
| }
 | |
| 
 | |
| use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | |
| use ShortPixel\Controller\OptimizeController as OptimizeController;
 | |
| use ShortPixel\Controller\BulkController as BulkController;
 | |
| use ShortPixel\Controller\FileSystemController as FileSystemController;
 | |
| use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
 | |
| use ShortPixel\Controller\StatsController as StatsController;
 | |
| use ShortPixel\Controller\ApiKeyController as ApiKeyController;
 | |
| use ShortPixel\Helper\UtilHelper as UtilHelper;
 | |
| 
 | |
| 
 | |
| class InstallHelper
 | |
| {
 | |
| 
 | |
|   public static function activatePlugin()
 | |
|   {
 | |
|       self::deactivatePlugin();
 | |
|       $settings = \wpSPIO()->settings();
 | |
| 
 | |
|       $env = wpSPIO()->env();
 | |
| 
 | |
|       if(\WPShortPixelSettings::getOpt('deliverWebp') == 3 && ! $env->is_nginx) {
 | |
|           UtilHelper::alterHtaccess(true,true); //add the htaccess lines. Both are true because even if one option is now off in the past both fileformats could have been generated.
 | |
|       }
 | |
| 
 | |
|       self::checkTables();
 | |
| 
 | |
|       AdminNoticesController::resetOldNotices();
 | |
|       \WPShortPixelSettings::onActivate();
 | |
| 
 | |
|       $optimizeController = new OptimizeController();
 | |
|       $q = $optimizeController->getQueue('media');
 | |
|       $q->getShortQ()->install(); // create table.
 | |
| 
 | |
| 			$settings->currentVersion = SHORTPIXEL_IMAGE_OPTIMISER_VERSION;
 | |
|   }
 | |
| 
 | |
|   public static function deactivatePlugin()
 | |
|   {
 | |
| 
 | |
|     $settings = \wpSPIO()->settings();
 | |
| 		$settings::onDeactivate();
 | |
| 
 | |
|     $env = wpSPIO()->env();
 | |
| 
 | |
|     if (! $env->is_nginx)
 | |
| 		{
 | |
|       UtilHelper::alterHtaccess(false, false);
 | |
| 		}
 | |
| 
 | |
|     // save remove.
 | |
|     $fs = new FileSystemController();
 | |
|     $log = $fs->getFile(SHORTPIXEL_BACKUP_FOLDER . "/shortpixel_log");
 | |
| 
 | |
|     if ($log->exists())
 | |
|      $log->delete();
 | |
| 
 | |
|     global $wpdb;
 | |
|     $sql = "delete from " . $wpdb->options . " where option_name like '%_transient_shortpixel%'";
 | |
|     $wpdb->query($sql); // remove transients.
 | |
| 
 | |
| 		// saved in settings object, reset all stats.
 | |
|  		StatsController::getInstance()->reset();
 | |
|   }
 | |
| 
 | |
|   public static function uninstallPlugin()
 | |
|   {
 | |
|     OptimizeController::uninstallPlugin();
 | |
| 		ApiKeyController::uninstallPlugin();
 | |
| 
 | |
| 		delete_transient('bulk-secret');
 | |
| 		delete_transient('othermedia_refresh_folder_delay');
 | |
| 		delete_transient('avif_server_check');
 | |
| 		delete_transient('quotaData');
 | |
| 
 | |
|   }
 | |
| 
 | |
|  // Removes everything  of SPIO 5.x .  Not recommended.
 | |
| 	public static function hardUninstall()
 | |
| 	{
 | |
| 		$env = \wpSPIO()->env();
 | |
| 		$settings = \wpSPIO()->settings();
 | |
| 
 | |
| 
 | |
| 		$nonce = (isset($_POST['tools-nonce'])) ? sanitize_key($_POST['tools-nonce']) : null;
 | |
| 		if ( ! wp_verify_nonce( $nonce, 'remove-all' ) ) {
 | |
|           wp_nonce_ays( '' );
 | |
|     }
 | |
| 
 | |
| 		self::deactivatePlugin(); // deactivate
 | |
| 		self::uninstallPlugin(); // uninstall
 | |
| 
 | |
| 		// Bulk Log
 | |
| 		BulkController::uninstallPlugin();
 | |
| 
 | |
| 		$settings::resetOptions();
 | |
| 
 | |
| 		if (! $env->is_nginx)
 | |
| 		{
 | |
| 			insert_with_markers( get_home_path() . '.htaccess', 'ShortPixelWebp', '');
 | |
| 		}
 | |
| 
 | |
| 		self::removeTables();
 | |
| 
 | |
| 		// Remove Backups
 | |
| 		$dir = \wpSPIO()->filesystem()->getDirectory(SHORTPIXEL_BACKUP_FOLDER);
 | |
| 		$dir->recursiveDelete();
 | |
| 
 | |
| 		$plugin = basename(SHORTPIXEL_PLUGIN_DIR) . '/' . basename(SHORTPIXEL_PLUGIN_FILE);
 | |
| 		deactivate_plugins($plugin);
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 
 | |
|   public static function deactivateConflictingPlugin()
 | |
|   {
 | |
|     if ( ! isset($_GET['_wpnonce']) || ! wp_verify_nonce( sanitize_key($_GET['_wpnonce']), 'sp_deactivate_plugin_nonce' ) ) {
 | |
|           wp_nonce_ays( 'Nononce' );
 | |
|     }
 | |
| 
 | |
|     $referrer_url = wp_get_referer();
 | |
|     $url = wp_get_referer();
 | |
| 		$plugin = (isset($_GET['plugin'])) ? sanitize_text_field(wp_unslash($_GET['plugin'])) : null; // our target.
 | |
| 
 | |
| 		if (! is_null($plugin))
 | |
| 	  	deactivate_plugins($plugin);
 | |
| 
 | |
|     wp_safe_redirect($url);
 | |
|     die();
 | |
| 
 | |
| 
 | |
|   }
 | |
| 
 | |
| 	/**
 | |
| 	* Check if TableName exists
 | |
| 	* @param $tableName The Name of the Table without Prefix.
 | |
| 	*/
 | |
| 	public static function checkTableExists($tableName)
 | |
| 	{
 | |
| 		      global $wpdb;
 | |
| 					$tableName = $wpdb->prefix . $tableName;
 | |
| 		      $sql = $wpdb->prepare("
 | |
| 		               SHOW TABLES LIKE %s
 | |
| 		               ", $tableName);
 | |
| 
 | |
| 		       $result = intval($wpdb->query($sql));
 | |
| 
 | |
| 		       if ($result == 0)
 | |
| 		         return false;
 | |
| 		       else {
 | |
| 		         return true;
 | |
| 		       }
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	public static function checkTables()
 | |
| 	{
 | |
| 			global $wpdb;
 | |
|     	require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
 | |
| 
 | |
| 			dbDelta(self::getFolderTableSQL());
 | |
| 	    dbDelta(self::getMetaTableSQL());
 | |
| 			dbDelta(self::getPostMetaSQL());
 | |
| 
 | |
| 			self::checkIndexes();
 | |
| 	}
 | |
| 
 | |
| 	private static function checkIndexes()
 | |
| 	{
 | |
| 			global $wpdb;
 | |
| 
 | |
| 			$definitions = array(
 | |
| 				 'shortpixel_meta' => array(
 | |
| 					 	'path' => 'path'
 | |
| 				 ),
 | |
| 				 'shortpixel_folders' => array(
 | |
| 					  'path' => 'path'
 | |
| 				 ),
 | |
| 				 'shortpixel_postmeta' => array(
 | |
| 					   'attach_id' => 'attach_id',
 | |
| 						 'parent' => 'parent',
 | |
| 						 'size' => 'size',
 | |
| 						 'status' => 'status',
 | |
| 						 'compression_type' => 'compression_type'
 | |
| 				 )
 | |
| 			);
 | |
| 
 | |
| 			foreach($definitions as $raw_tableName => $indexes)
 | |
| 			{
 | |
| 					$tableName = $wpdb->prefix . $raw_tableName;
 | |
| 					foreach($indexes as $indexName => $fieldName)
 | |
| 					{
 | |
| 							// Check exists
 | |
| 							$sql = 'SHOW INDEX FROM ' . $tableName . ' WHERE Key_name = %s';
 | |
| 							$sql = $wpdb->prepare($sql, $indexName);
 | |
| 
 | |
| 							$res = $wpdb->get_row($sql);
 | |
| 
 | |
| 							if (is_null($res))
 | |
| 							{
 | |
| 								// can't prepare for those, also not any user data here.
 | |
| 								 $sql = 'CREATE INDEX ' . $indexName . ' ON ' . $tableName . ' ( ' . $fieldName . ')';
 | |
| 								 $res = $wpdb->query($sql);
 | |
| 							}
 | |
| 
 | |
| 					}
 | |
| 			}
 | |
| 	}
 | |
| 
 | |
| 	private static function removeTables()
 | |
| 	{
 | |
| 		 global $wpdb;
 | |
| 			if (self::checkTableExists('shortpixel_folders') === true)
 | |
| 	    {
 | |
| 					$sql = 'DROP TABLE  ' . $wpdb->prefix . 'shortpixel_folders';
 | |
| 					$wpdb->query($sql);
 | |
| 			}
 | |
| 			if (self::checkTableExists('shortpixel_meta') === true)
 | |
| 			{
 | |
| 	 	    	$sql = 'DROP TABLE  ' . $wpdb->prefix . 'shortpixel_meta';
 | |
| 					$wpdb->query($sql);
 | |
| 			}
 | |
| 			if (self::checkTableExists('shortpixel_postmeta') === true)
 | |
| 			{
 | |
| 					$sql = 'DROP TABLE  ' . $wpdb->prefix . 'shortpixel_postmeta';
 | |
| 					error_log('Dropping postmeta' . $sql);
 | |
| 					$wpdb->query($sql);
 | |
| 			}
 | |
| 	}
 | |
| 
 | |
|   public static function getFolderTableSQL() {
 | |
| 		 global $wpdb;
 | |
| 		 $charsetCollate = $wpdb->get_charset_collate();
 | |
| 		 $prefix = $wpdb->prefix;
 | |
| 
 | |
|      return "CREATE TABLE {$prefix}shortpixel_folders (
 | |
|           id mediumint(9) NOT NULL AUTO_INCREMENT,
 | |
|           path varchar(512),
 | |
|           name varchar(150),
 | |
|           path_md5 char(32),
 | |
|           file_count int,
 | |
|           status SMALLINT NOT NULL DEFAULT 0,
 | |
|           parent SMALLINT DEFAULT 0,
 | |
|           ts_checked timestamp, 
 | |
|           ts_updated timestamp,
 | |
|           ts_created timestamp,
 | |
|           PRIMARY KEY id (id)
 | |
|         ) $charsetCollate;";
 | |
| 
 | |
|   }
 | |
| 
 | |
|   public static function getMetaTableSQL() {
 | |
| 		 	global $wpdb;
 | |
| 		 	$charsetCollate = $wpdb->get_charset_collate();
 | |
| 			$prefix = $wpdb->prefix;
 | |
| 
 | |
|      return "CREATE TABLE {$prefix}shortpixel_meta (
 | |
|           id mediumint(10) NOT NULL AUTO_INCREMENT,
 | |
|           folder_id mediumint(9) NOT NULL,
 | |
|           ext_meta_id int(10),
 | |
|           path varchar(512),
 | |
|           name varchar(150),
 | |
|           path_md5 char(32),
 | |
|           compressed_size int(10) NOT NULL DEFAULT 0,
 | |
|           compression_type tinyint,
 | |
|           keep_exif tinyint DEFAULT 0,
 | |
|           cmyk2rgb tinyint DEFAULT 0,
 | |
|           resize tinyint,
 | |
|           resize_width smallint,
 | |
|           resize_height smallint,
 | |
|           backup tinyint DEFAULT 0,
 | |
|           status SMALLINT NOT NULL DEFAULT 0,
 | |
|           retries tinyint NOT NULL DEFAULT 0,
 | |
|           message varchar(255),
 | |
|           ts_added timestamp,
 | |
|           ts_optimized timestamp,
 | |
| 					extra_info LONGTEXT,
 | |
|           PRIMARY KEY sp_id (id)
 | |
|         ) $charsetCollate;";
 | |
| 
 | |
|   }
 | |
| 
 | |
| 	public static function getPostMetaSQL()
 | |
| 	{
 | |
| 		 global $wpdb;
 | |
| 		 $charsetCollate = $wpdb->get_charset_collate();
 | |
| 		 $prefix = $wpdb->prefix;
 | |
| 
 | |
| 		 $sql = "CREATE TABLE {$prefix}shortpixel_postmeta (
 | |
| 			 id bigint unsigned NOT NULL AUTO_INCREMENT ,
 | |
| 			 attach_id bigint unsigned NOT NULL,
 | |
| 			 parent bigint unsigned NOT NULL,
 | |
| 			 image_type tinyint default 0,
 | |
| 			 size varchar(200),
 | |
| 			 status tinyint default 0,
 | |
| 			 compression_type tinyint,
 | |
| 			 compressed_size  int,
 | |
| 			 original_size int,
 | |
| 			 tsAdded timestamp,
 | |
| 			 tsOptimized  timestamp,
 | |
| 			 extra_info LONGTEXT,
 | |
| 			 PRIMARY KEY id (id)
 | |
| 		 ) $charsetCollate;";
 | |
| 
 | |
| 		 return $sql;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| } // InstallHelper
 |