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