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
|