setup(); } return $instance; } /** * Setup Hooks */ public function setup() { add_action( 'init', [ $this, 'check_version' ], 5 ); } /** * Check DB version and run the updater is required. */ public function check_version() { if ( defined( 'IFRAME_REQUEST' ) && IFRAME_REQUEST ) { return; } if ( version_compare( get_option( DB_VERSION_OPTION_NAME ), POWERED_CACHE_DB_VERSION, '<' ) ) { $this->install(); /** * Fires after plugin update. * * @hook powered_cache_updated * * @since 2.0 */ do_action( 'powered_cache_updated' ); } } /** * Perform Installation */ public function install() { if ( ! is_blog_installed() ) { return; } $lock_key = 'powered_cache_installing'; // Check if we are not already running if ( $this->has_lock( $lock_key ) ) { return; } // lets set the transient now. $this->set_lock( $lock_key ); if ( POWERED_CACHE_IS_NETWORK ) { $this->maybe_upgrade_network_wide(); } else { $this->maybe_upgrade(); } $this->remove_lock( $lock_key ); } /** * Upgrade routine for network wide activation */ public function maybe_upgrade_network_wide() { if ( version_compare( get_site_option( DB_VERSION_OPTION_NAME ), POWERED_CACHE_DB_VERSION, '<' ) ) { $this->upgrade_30( true ); $this->upgrade_32( true ); $this->upgrade_33( true ); $this->upgrade_34( true ); \PoweredCache\Utils\log( sprintf( '[Networkwide] Upgrade DB version: %s', POWERED_CACHE_DB_VERSION ) ); update_site_option( DB_VERSION_OPTION_NAME, POWERED_CACHE_DB_VERSION ); } } /** * Upgrade routine */ public function maybe_upgrade() { if ( version_compare( get_option( DB_VERSION_OPTION_NAME ), POWERED_CACHE_DB_VERSION, '<' ) ) { \PoweredCache\Utils\log( sprintf( 'Upgrade DB version: %s', POWERED_CACHE_DB_VERSION ) ); $this->maybe_migrate_from_1x(); $this->upgrade_30(); $this->upgrade_32(); $this->upgrade_33(); $this->upgrade_34(); update_option( DB_VERSION_OPTION_NAME, POWERED_CACHE_DB_VERSION ); } } /** * Changing "accepted query string" as "ignored query string" with version 3.x * * @param bool $network_wide whether plugin activated network-wide or not * * @return void * @since 3.0 */ public function upgrade_30( $network_wide = false ) { $current_version = $network_wide ? get_site_option( DB_VERSION_OPTION_NAME ) : get_option( DB_VERSION_OPTION_NAME ); if ( ! version_compare( $current_version, '3.0', '<' ) ) { return; } $settings = \PoweredCache\Utils\get_settings( $network_wide ); if ( empty( $settings['accepted_query_strings'] ) ) { return; } $settings['ignored_query_strings'] = $settings['accepted_query_strings']; unset( $settings['accepted_query_strings'] ); if ( $network_wide ) { update_site_option( SETTING_OPTION, $settings ); } else { update_option( SETTING_OPTION, $settings ); } Config::factory()->save_configuration( $settings, $network_wide ); \PoweredCache\Utils\log( 'Upgraded to version 3.0' ); } /** * Changing js execution method * * @param bool $network_wide whether plugin activated network-wide or not * * @return void * @since 3.2 */ public function upgrade_32( $network_wide = false ) { $current_version = $network_wide ? get_site_option( DB_VERSION_OPTION_NAME ) : get_option( DB_VERSION_OPTION_NAME ); if ( ! version_compare( $current_version, '3.2', '<' ) ) { return; } $settings = \PoweredCache\Utils\get_settings( $network_wide ); if ( ! empty( $settings['js_execution_method'] ) ) { if ( in_array( $settings['js_execution_method'], [ 'async', 'defer' ], true ) ) { $settings['js_defer'] = true; } if ( 'delayed' === $settings['js_execution_method'] ) { $settings['js_delay'] = true; $settings['combine_js'] = false; } unset( $settings['js_execution_method'] ); unset( $settings['js_execution_optimized_only'] ); } if ( $network_wide ) { update_site_option( SETTING_OPTION, $settings ); } else { update_option( SETTING_OPTION, $settings ); } Config::factory()->save_configuration( $settings, $network_wide ); \PoweredCache\Utils\log( 'Upgraded to version 3.2' ); } /** * Upgrade routine for version 3.3 * * @param bool $network_wide whether plugin activated network-wide or not * * @return void */ public function upgrade_33( $network_wide = false ) { $current_version = $network_wide ? get_site_option( DB_VERSION_OPTION_NAME ) : get_option( DB_VERSION_OPTION_NAME ); if ( ! version_compare( $current_version, '3.3', '<' ) ) { return; } $settings = \PoweredCache\Utils\get_settings( $network_wide ); // disable rewrite file optimizer if auto configure htaccess is disabled if ( ! $settings['auto_configure_htaccess'] && $settings['rewrite_file_optimizer'] ) { $settings['rewrite_file_optimizer'] = false; } if ( $network_wide ) { update_site_option( SETTING_OPTION, $settings ); } else { update_option( SETTING_OPTION, $settings ); } Config::factory()->save_configuration( $settings, $network_wide ); if ( $settings['auto_configure_htaccess'] && $settings['rewrite_file_optimizer'] ) { if ( $network_wide ) { \PoweredCache\Utils\clean_page_cache_dir(); } else { \PoweredCache\Utils\clean_site_cache_dir(); } } \PoweredCache\Utils\log( 'Upgraded to version 3.3' ); } /** * Upgrade routine for version 3.4 * * @param bool $network_wide whether plugin activated network-wide or not * * * @return void */ public function upgrade_34( $network_wide = false ) { $current_version = $network_wide ? get_site_option( DB_VERSION_OPTION_NAME ) : get_option( DB_VERSION_OPTION_NAME ); if ( ! version_compare( $current_version, '3.4', '<' ) ) { return; } $settings = \PoweredCache\Utils\get_settings( $network_wide ); $encryption = new Encryption(); if ( ! empty( $settings['cloudflare_api_key'] ) && false === $encryption->decrypt( $settings['cloudflare_api_key'] ) ) { $settings['cloudflare_api_key'] = $encryption->encrypt( $settings['cloudflare_api_key'] ); } if ( ! empty( $settings['cloudflare_api_token'] ) && false === $encryption->decrypt( $settings['cloudflare_api_token'] ) ) { $settings['cloudflare_api_token'] = $encryption->encrypt( $settings['cloudflare_api_token'] ); } if ( $network_wide ) { update_site_option( SETTING_OPTION, $settings ); } else { update_option( SETTING_OPTION, $settings ); } Config::factory()->save_configuration( $settings, $network_wide ); \PoweredCache\Utils\log( 'Upgraded to version 3.4' ); } /** * Check if a lock exists of the upgrade routine * * @param string $lock_name transient name * * @return bool */ private function has_lock( $lock_name ) { if ( POWERED_CACHE_IS_NETWORK ) { if ( 'yes' === get_site_transient( $lock_name ) ) { return true; } return false; } if ( 'yes' === get_transient( $lock_name ) ) { return true; } return false; } /** * Set the lock * * @param string $lock_name transient name for the lock * * @return bool */ private function set_lock( $lock_name ) { if ( POWERED_CACHE_IS_NETWORK ) { return set_site_transient( $lock_name, 'yes', MINUTE_IN_SECONDS ); } return set_transient( $lock_name, 'yes', MINUTE_IN_SECONDS ); } /** * Remove lock * * @param string $lock_name transient name for the lock * * @return bool */ private function remove_lock( $lock_name ) { if ( POWERED_CACHE_IS_NETWORK ) { return delete_site_transient( $lock_name ); } return delete_transient( $lock_name ); } /** * Migrate existing options and extension settings from 1.x */ public function maybe_migrate_from_1x() { if ( POWERED_CACHE_IS_NETWORK ) { // 1x wasn't support network wide activation return; } $db_version = get_option( DB_VERSION_OPTION_NAME ); $old_options = get_option( SETTING_OPTION ); $default_options = \PoweredCache\Utils\get_settings(); if ( empty( $db_version ) && ! empty( $old_options ) ) { \PoweredCache\Utils\log( 'Upgrading from version 1.x' ); $migrated_options = []; // migrate the settings with same key foreach ( $default_options as $key => $default_value ) { if ( isset( $old_options[ $key ] ) ) { $migrated_options[ $key ] = $old_options[ $key ]; } else { $migrated_options[ $key ] = $default_value; } } $changed_keys = [ 'enable_page_caching' => 'enable_page_cache', 'configure_htaccess' => 'auto_configure_htaccess', 'cdn_status' => 'enable_cdn', 'show_cache_message' => 'cache_footprint', ]; foreach ( $changed_keys as $old_key => $new_key ) { if ( isset( $old_options[ $old_key ] ) ) { $migrated_options[ $new_key ] = $old_options[ $old_key ]; } } $active_extensions = (array) $old_options['active_extensions']; $extension_settings = (array) $old_options['extension_settings']; $migrated_options['enable_cloudflare'] = in_array( 'cloudflare', $active_extensions, true ); if ( ! empty( $extension_settings['cloudflare'] ) ) { $migrated_options['cloudflare_email'] = $extension_settings['cloudflare']['email']; $migrated_options['cloudflare_api_key'] = $extension_settings['cloudflare']['api_key']; $migrated_options['cloudflare_zone'] = $extension_settings['cloudflare']['zone']; } $migrated_options['enable_lazy_load'] = in_array( 'lazy-load', $active_extensions, true ); if ( ! empty( $extension_settings['lazyload'] ) ) { $migrated_options['lazy_load_post_content'] = $extension_settings['lazyload']['post_content']; $migrated_options['lazy_load_images'] = $extension_settings['lazyload']['image']; $migrated_options['lazy_load_iframes'] = $extension_settings['lazyload']['iframe']; $migrated_options['lazy_load_widgets'] = $extension_settings['lazyload']['widget_text']; $migrated_options['lazy_load_post_thumbnail'] = $extension_settings['lazyload']['post_thumbnail']; $migrated_options['lazy_load_avatars'] = $extension_settings['lazyload']['avatar']; } $migrated_options['enable_cache_preload'] = in_array( 'preload', $active_extensions, true ); if ( ! empty( $extension_settings['preload'] ) ) { $migrated_options['preload_homepage'] = (bool) $extension_settings['preload']['homepage']; $migrated_options['preload_public_posts'] = (bool) $extension_settings['preload']['post_count']; $migrated_options['preload_public_tax'] = (bool) $extension_settings['preload']['taxonomies']; $migrated_options['enable_sitemap_preload'] = (bool) $extension_settings['preload']['sitemap_integration']; $migrated_options['preload_sitemap'] = $extension_settings['preload']['sitemaps']; } $migrated_options['enable_varnish'] = in_array( 'varnish', $active_extensions, true ); if ( ! empty( $extension_settings['varnish'] ) ) { $migrated_options['varnish_ip'] = $extension_settings['varnish']['varnish_ip']; } if ( in_array( 'minifier', $active_extensions, true ) && ! empty( $extension_settings['minifier'] ) ) { $migrated_options['minify_html'] = $extension_settings['minifier']['minify_html']; $migrated_options['minify_css'] = $extension_settings['minifier']['minify_css']; $migrated_options['combine_css'] = $extension_settings['minifier']['concat_css']; $migrated_options['minify_js'] = $extension_settings['minifier']['minify_js']; $migrated_options['combine_js'] = $extension_settings['minifier']['concat_js']; $migrated_options['excluded_css_files'] = $extension_settings['minifier']['excluded_css']; $migrated_options['excluded_js_files'] = $extension_settings['minifier']['excluded_js']; $migrated_options['js_execution_method'] = $extension_settings['minifier']['js_execution']; } update_option( SETTING_OPTION, $migrated_options ); Config::factory()->save_configuration( $migrated_options ); // make it current \PoweredCache\Utils\log( 'Upgraded from version 1.x' ); // remove old crons wp_clear_scheduled_hook( 'powered_cache_preload_hook' ); wp_clear_scheduled_hook( 'powered_cache_preload_child_process' ); wp_clear_scheduled_hook( 'powered_cache_purge_cache' ); } } }