343 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Smush installer (update/upgrade procedures): Installer class
 | |
|  *
 | |
|  * @package Smush\Core
 | |
|  * @since 2.8.0
 | |
|  *
 | |
|  * @author Anton Vanyukov <anton@incsub.com>
 | |
|  *
 | |
|  * @copyright (c) 2018, Incsub (http://incsub.com)
 | |
|  */
 | |
| 
 | |
| namespace Smush\Core;
 | |
| 
 | |
| use Smush\App\Abstract_Page;
 | |
| use WP_Smush;
 | |
| 
 | |
| if ( ! defined( 'WPINC' ) ) {
 | |
| 	die;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Class Installer for handling updates and upgrades of the plugin.
 | |
|  *
 | |
|  * @since 2.8.0
 | |
|  */
 | |
| class Installer {
 | |
| 
 | |
| 	/**
 | |
| 	 * Triggered on Smush deactivation.
 | |
| 	 *
 | |
| 	 * @since 3.1.0
 | |
| 	 */
 | |
| 	public static function smush_deactivated() {
 | |
| 		if ( ! class_exists( '\\Smush\\Core\\Modules\\CDN' ) ) {
 | |
| 			require_once __DIR__ . '/modules/class-cdn.php';
 | |
| 		}
 | |
| 
 | |
| 		Modules\CDN::unschedule_cron();
 | |
| 		Settings::get_instance()->delete_setting( 'wp-smush-cdn_status' );
 | |
| 
 | |
| 		if ( is_multisite() && is_network_admin() ) {
 | |
| 			/**
 | |
| 			 * Updating the option instead of removing it.
 | |
| 			 *
 | |
| 			 * @see https://incsub.atlassian.net/browse/SMUSH-350
 | |
| 			 */
 | |
| 			update_site_option( 'wp-smush-networkwide', 1 );
 | |
| 		}
 | |
| 
 | |
| 		delete_site_option( 'wp_smush_api_auth' );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Check if an existing install or new.
 | |
| 	 *
 | |
| 	 * @since 2.8.0  Moved to this class from wp-smush.php file.
 | |
| 	 */
 | |
| 	public static function smush_activated() {
 | |
| 		if ( ! defined( 'WP_SMUSH_ACTIVATING' ) ) {
 | |
| 			define( 'WP_SMUSH_ACTIVATING', true );
 | |
| 		}
 | |
| 
 | |
| 		$version = get_site_option( 'wp-smush-version' );
 | |
| 		self::maybe_mark_as_pre_3_12_6_site( $version );
 | |
| 
 | |
| 		if ( ! class_exists( '\\Smush\\Core\\Settings' ) ) {
 | |
| 			require_once __DIR__ . '/class-settings.php';
 | |
| 		}
 | |
| 
 | |
| 		Settings::get_instance()->init();
 | |
| 		$settings = Settings::get_instance()->get();
 | |
| 
 | |
| 		// If the version is not saved or if the version is not same as the current version,.
 | |
| 		if ( ! $version || WP_SMUSH_VERSION !== $version ) {
 | |
| 			global $wpdb;
 | |
| 			// Check if there are any existing smush stats.
 | |
| 			$results = $wpdb->get_var(
 | |
| 				$wpdb->prepare(
 | |
| 					"SELECT meta_id FROM {$wpdb->postmeta} WHERE meta_key=%s LIMIT 1",
 | |
| 					'wp-smpro-smush-data'
 | |
| 				)
 | |
| 			); // db call ok; no-cache ok.
 | |
| 
 | |
| 			if ( $results || ( isset( $settings['auto'] ) && false !== $settings['auto'] ) ) {
 | |
| 				update_site_option( 'wp-smush-install-type', 'existing' );
 | |
| 			}
 | |
| 
 | |
| 			// Create directory smush table.
 | |
| 			self::directory_smush_table();
 | |
| 
 | |
| 			// Store the plugin version in db.
 | |
| 			update_site_option( 'wp-smush-version', WP_SMUSH_VERSION );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Handle plugin upgrades.
 | |
| 	 *
 | |
| 	 * @since 2.8.0
 | |
| 	 */
 | |
| 	public static function upgrade_settings() {
 | |
| 		// Avoid executing this over an over in same thread.
 | |
| 		if ( defined( 'WP_SMUSH_ACTIVATING' ) || ( defined( 'WP_SMUSH_UPGRADING' ) && WP_SMUSH_UPGRADING ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$version = get_site_option( 'wp-smush-version' );
 | |
| 
 | |
| 		if ( false === $version ) {
 | |
| 			self::smush_activated();
 | |
| 		} else {
 | |
| 			self::maybe_mark_as_pre_3_12_6_site( $version );
 | |
| 		}
 | |
| 
 | |
| 		if ( false !== $version && WP_SMUSH_VERSION !== $version ) {
 | |
| 			if ( ! defined( 'WP_SMUSH_UPGRADING' ) ) {
 | |
| 				define( 'WP_SMUSH_UPGRADING', true );
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.7.0', '<' ) ) {
 | |
| 				self::upgrade_3_7_0();
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.8.0', '<' ) ) {
 | |
| 				// Delete the flag for hiding the BF modal because it was removed.
 | |
| 				delete_site_option( 'wp-smush-hide_blackfriday_modal' );
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.8.3', '<' ) ) {
 | |
| 				// Delete this unused setting, leftover from old smush.
 | |
| 				delete_option( 'wp-smush-transparent_png' );
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.9.0', '<' ) ) {
 | |
| 				// Hide the Local WebP wizard if Local WebP is enabled.
 | |
| 				if ( Settings::get_instance()->get( 'webp_mod' ) ) {
 | |
| 					add_site_option( 'wp-smush-webp_hide_wizard', true );
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.9.5', '<' ) ) {
 | |
| 				delete_site_option( 'wp-smush-show-black-friday' );
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.9.10', '<' ) ) {
 | |
| 				self::dir_smush_set_primary_key();
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.10.0', '<' ) ) {
 | |
| 				self::upgrade_3_10_0();
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.10.3', '<' ) ) {
 | |
| 				self::upgrade_3_10_3();
 | |
| 			}
 | |
| 
 | |
| 			if ( version_compare( $version, '3.14.0', '<' ) ) {
 | |
| 				self::upgrade_3_14_0();
 | |
| 			}
 | |
| 
 | |
| 			$hide_new_feature_highlight_modal = apply_filters( 'wpmudev_branding_hide_doc_link', false );
 | |
| 			if ( ! $hide_new_feature_highlight_modal && version_compare( $version, '3.14.0', '<' ) ) {
 | |
| 				// Add the flag to display the new feature background process modal.
 | |
| 				add_site_option( 'wp-smush-show_upgrade_modal', true );
 | |
| 			}
 | |
| 
 | |
| 			// Create/upgrade directory smush table.
 | |
| 			self::directory_smush_table();
 | |
| 
 | |
| 			// Store the latest plugin version in db.
 | |
| 			update_site_option( 'wp-smush-version', WP_SMUSH_VERSION );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Create or upgrade custom table for directory Smush.
 | |
| 	 *
 | |
| 	 * After creating or upgrading the custom table, update the path_hash
 | |
| 	 * column value and structure if upgrading from old version.
 | |
| 	 *
 | |
| 	 * @since 2.9.0
 | |
| 	 */
 | |
| 	public static function directory_smush_table() {
 | |
| 		if ( ! class_exists( '\\Smush\\Core\\Modules\\Abstract_Module' ) ) {
 | |
| 			require_once __DIR__ . '/modules/class-abstract-module.php';
 | |
| 		}
 | |
| 
 | |
| 		if ( ! class_exists( '\\Smush\\Core\\Modules\\Dir' ) ) {
 | |
| 			require_once __DIR__ . '/modules/class-dir.php';
 | |
| 		}
 | |
| 
 | |
| 		// No need to continue on sub sites.
 | |
| 		if ( ! Modules\Dir::should_continue() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Create a class object, if doesn't exists.
 | |
| 		if ( ! is_object( WP_Smush::get_instance()->core()->mod->dir ) ) {
 | |
| 			WP_Smush::get_instance()->core()->mod->dir = new Modules\Dir();
 | |
| 		}
 | |
| 
 | |
| 		// Create/upgrade directory smush table.
 | |
| 		WP_Smush::get_instance()->core()->mod->dir->create_table();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Set primary key for directory smush table on upgrade to 3.9.10.
 | |
| 	 *
 | |
| 	 * @since 3.9.10
 | |
| 	 */
 | |
| 	private static function dir_smush_set_primary_key() {
 | |
| 		global $wpdb;
 | |
| 
 | |
| 		// Only call it after creating table smush_dir_images. If the table doesn't exist, returns.
 | |
| 		if ( ! Modules\Dir::table_exist() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// If the table is already set the primary key, return.
 | |
| 		if ( $wpdb->query( $wpdb->prepare( "SHOW INDEXES FROM {$wpdb->base_prefix}smush_dir_images WHERE Key_name = %s;", 'PRIMARY' ) ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Set column ID as a primary key.
 | |
| 		$wpdb->query( "ALTER TABLE {$wpdb->base_prefix}smush_dir_images ADD PRIMARY KEY (id);" );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Check if table needs to be created and create if not exists.
 | |
| 	 *
 | |
| 	 * @since 3.8.6
 | |
| 	 */
 | |
| 	public static function maybe_create_table() {
 | |
| 		if ( ! function_exists( 'get_current_screen' ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( get_current_screen()->id ) && false === strpos( get_current_screen()->id, 'page_smush' ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		self::directory_smush_table();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Upgrade to 3.7.0
 | |
| 	 *
 | |
| 	 * @since 3.7.0
 | |
| 	 */
 | |
| 	private static function upgrade_3_7_0() {
 | |
| 		delete_site_option( 'wp-smush-run_recheck' );
 | |
| 
 | |
| 		// Fix the "None" animation in lazy-load options.
 | |
| 		$lazy = Settings::get_instance()->get_setting( 'wp-smush-lazy_load' );
 | |
| 
 | |
| 		if ( ! $lazy || ! isset( $lazy['animation'] ) || ! isset( $lazy['animation']['selected'] ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if ( '0' === $lazy['animation']['selected'] ) {
 | |
| 			$lazy['animation']['selected'] = 'none';
 | |
| 			Settings::get_instance()->set_setting( 'wp-smush-lazy_load', $lazy );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Upgrade to 3.10.0
 | |
| 	 *
 | |
| 	 * @since 3.10.0
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	private static function upgrade_3_10_0() {
 | |
| 		// Remove unused options.
 | |
| 		delete_site_option( 'wp-smush-hide_pagespeed_suggestion' );
 | |
| 		delete_site_option( 'wp-smush-hide_upgrade_notice' );
 | |
| 
 | |
| 		// Rename the default config.
 | |
| 		$stored_configs = get_site_option( 'wp-smush-preset_configs', false );
 | |
| 		if ( is_array( $stored_configs ) && isset( $stored_configs[0] ) && isset( $stored_configs[0]['name'] ) && 'Basic config' === $stored_configs[0]['name'] ) {
 | |
| 			$stored_configs[0]['name'] = __( 'Default config', 'wp-smushit' );
 | |
| 			update_site_option( 'wp-smush-preset_configs', $stored_configs );
 | |
| 		}
 | |
| 
 | |
| 		// Show new features modal for free users.
 | |
| 		if ( ! WP_Smush::is_pro() ) {
 | |
| 			if ( is_multisite() && ! Abstract_Page::should_render( 'bulk' ) ) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			add_site_option( 'wp-smush-show_upgrade_modal', true );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Upgrade 3.10.3
 | |
| 	 *
 | |
| 	 * @since 3.10.3
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	private static function upgrade_3_10_3() {
 | |
| 		delete_site_option( 'wp-smush-hide_smush_welcome' );
 | |
| 		// Logger options.
 | |
| 		delete_site_option( 'wdev_logger_wp-smush-pro' );
 | |
| 		delete_site_option( 'wdev_logger_wp-smushit' );
 | |
| 		// Clean old cronjob (missing callback).
 | |
| 		if ( wp_next_scheduled( 'wdev_logger_clear_logs' ) ) {
 | |
| 			wp_clear_scheduled_hook( 'wdev_logger_clear_logs' );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private static function maybe_mark_as_pre_3_12_6_site( $version ) {
 | |
| 		if ( ! $version || version_compare( $version, '3.12.0', '<' ) || false !== get_site_option( 'wp_smush_pre_3_12_6_site') ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		if ( version_compare( $version, '3.12.5', '>' ) ) {
 | |
| 			$version = 0;
 | |
| 		}
 | |
| 		update_site_option( 'wp_smush_pre_3_12_6_site', $version );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	private static function upgrade_3_14_0() {
 | |
| 		// Update Smush mode for display on Configs page.
 | |
| 		$stored_configs = get_site_option( 'wp-smush-preset_configs', array() );
 | |
| 		if ( empty( $stored_configs ) || ! is_array( $stored_configs ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$configs_handler = new Configs();
 | |
| 		foreach ( $stored_configs as $key => $preset_config ) {
 | |
| 			if ( empty( $preset_config['config']['configs']['settings'] ) ) {
 | |
| 				continue;
 | |
| 			}
 | |
| 			$preset_config['config'] = $configs_handler->sanitize_and_format_configs( $preset_config['config']['configs'] );
 | |
| 			$stored_configs[ $key ]  = $preset_config;
 | |
| 		}
 | |
| 		update_site_option( 'wp-smush-preset_configs', $stored_configs );
 | |
| 	}
 | |
| }
 |