create_required_files($config, $exs); // create folders $this->create_required_folders($exs); $this->add_index_to_folders(); // create wp-loader file $wp_loader = w3_instance('W3_Environment_WpLoader'); if ($wp_loader->should_create()) { try { $wp_loader->create(); } catch (FilesystemOperationException $ex) { $exs->push($ex); } } if (count($exs->exceptions()) <= 0) { $this->notify_no_config_present($config, $exs); $this->notify_config_cache_not_writeable($config, $exs); } if (count($exs->exceptions()) > 0) throw $exs; } /** * Fixes environment once event occurs * @throws SelfTestExceptions **/ public function fix_on_event($config, $event, $old_config = null) { if ($event == 'activate') { delete_option('w3tc_request_data'); add_option('w3tc_request_data', '', null, 'no'); } } /** * Fixes environment after plugin deactivation * @throws SelfTestExceptions * @return array */ public function fix_after_deactivation() { $exs = new SelfTestExceptions(); $this->delete_required_files($exs); delete_option('w3tc_request_data'); if (count($exs->exceptions()) > 0) throw $exs; } /** * Returns required rules for module * @var W3_Config $config * @return array */ function get_required_rules($config) { return null; } /** * Checks if addins in wp-content is available and correct version. * @param $config * @param SelfTestExceptions $exs */ private function create_required_files($config, $exs) { $src = W3TC_INSTALL_FILE_ADVANCED_CACHE; $dst = W3TC_ADDIN_FILE_ADVANCED_CACHE; if ($this->advanced_cache_installed()) { if ($this->is_advanced_cache_add_in()) { $script_data = @file_get_contents($dst); if ($script_data == @file_get_contents($src)) return; } else { w3_require_once(W3TC_INC_FUNCTIONS_DIR . '/other.php'); w3_require_once(W3TC_INC_FUNCTIONS_DIR . '/ui.php'); $remove_url = w3_admin_url('admin.php?page=w3tc_dashboard&w3tc_default_remove_add_in=pgcache'); $exs->push(new FilesystemOperationException( sprintf(__('The Page Cache add-in file advanced-cache.php is not a W3 Total Cache drop-in. It should be removed. %s', 'w3-total-cache'), w3tc_button_link(__('Yes, remove it for me', 'w3-total-cache'), wp_nonce_url($remove_url,'w3tc'))))); return; } } try { w3_wp_copy_file($src, $dst); } catch (FilesystemOperationException $ex) { $exs->push($ex); } } /** * Checks if addins in wp-content are available and deletes them. * @param SelfTestExceptions $exs */ private function delete_required_files($exs) { try { if ($this->is_advanced_cache_add_in()) w3_wp_delete_file(W3TC_ADDIN_FILE_ADVANCED_CACHE); } catch (FilesystemOperationException $ex) { $exs->push($ex); } } /** * Checks if addins in wp-content is available and correct version. * @param SelfTestExceptions $exs */ private function create_required_folders($exs) { // folders that we create if not exists $directories = array( W3TC_CACHE_DIR, W3TC_CONFIG_DIR ); foreach ($directories as $directory) { try{ w3_wp_create_writeable_folder($directory, WP_CONTENT_DIR); } catch (FilesystemOperationException $ex) { $exs->push($ex); } } // folders that we delete if exists and not writeable $directories = array( W3TC_CACHE_CONFIG_DIR, W3TC_CACHE_TMP_DIR, W3TC_CACHE_BLOGMAP_FILENAME, W3TC_CACHE_DIR . '/object', W3TC_CACHE_DIR . '/db' ); foreach ($directories as $directory) { try{ if (file_exists($directory) && !is_writeable($directory)) w3_wp_delete_folder($directory); } catch (FilesystemRmdirException $ex) { $exs->push($ex); } } } /** * Adds index files */ private function add_index_to_folders() { $directories = array( W3TC_CACHE_DIR, W3TC_CONFIG_DIR, W3TC_CACHE_CONFIG_DIR); $add_files = array(); foreach ($directories as $dir) { if (is_dir($dir) && !file_exists($dir . '/index.html')) @file_put_contents($dir . '/index.html', ''); } } /** * Check config file * @param W3_Config $config * @param SelfTestExceptions $exs */ private function notify_no_config_present($config, $exs) { if ($config->own_config_exists() && $config->get_integer('common.instance_id', 0) != 0) return; $onclick = 'document.location.href=\'' . addslashes(wp_nonce_url( 'admin.php?page=w3tc_general&w3tc_save_options')) . '\';'; $button = ''; $exs->push(new SelfTestFailedException('W3 Total Cache: ' . 'Default settings are in use. The configuration file could ' . 'not be read or doesn\'t exist. Please ' . $button . ' to create the file.')); } /** * Check config cache is in sync with config * @param W3_Config $config * @param SelfTestExceptions $exs **/ private function notify_config_cache_not_writeable($config, $exs) { try { $config->validate_cache_actual(); } catch (Exception $ex) { // we could just create cache folder, so try again $config->load(true); try { $config->validate_cache_actual(); } catch (Exception $ex) { $exs->push(new SelfTestFailedException( 'W3 Total Cache Error: ' . $ex->getMessage())); } } } /** * Returns true if advanced-cache.php is installed * * @return boolean */ public function advanced_cache_installed() { return file_exists(W3TC_ADDIN_FILE_ADVANCED_CACHE); } /** * Returns true if advanced-cache.php is old version. * @return boolean */ public function advanced_cache_check_old_add_in() { return (($script_data = @file_get_contents(W3TC_ADDIN_FILE_ADVANCED_CACHE)) && strstr($script_data, '& w3_instance') !== false); } /** * Checks if advanced-cache.php exists * * @return boolean */ public function is_advanced_cache_add_in() { return (($script_data = @file_get_contents(W3TC_ADDIN_FILE_ADVANCED_CACHE)) && strstr($script_data, 'W3_PgCache') !== false); } }