_plugins = array(
array('class_name' => 'W3_Plugin_DbCache', 'enable_options' => 'dbcache.enabled'),
array('class_name' => 'W3_Plugin_ObjectCache', 'enable_options' => 'objectcache.enabled'),
array('class_name' => 'W3_Pro_Plugin_FragmentCache', 'enable_options' => 'fragmentcache.enabled'),
array('class_name' => 'W3_Plugin_PgCache', 'enable_options' => 'pgcache.enabled'),
array('class_name' => 'W3_Plugin_Cdn', 'enable_options' => 'cdn.enabled'),
array('class_name' => 'W3_Plugin_CdnCache', 'enable_options' => array('cdn.enabled', 'cdncache.enabled')),
array('class_name' => 'W3_Plugin_CloudFlare', 'enable_options' => 'cloudflare.enabled'),
array('class_name' => 'W3_Plugin_BrowserCache', 'enable_options' => 'browsercache.enabled'),
array('class_name' => 'W3_Plugin_Minify', 'enable_options' => 'minify.enabled'),
array('class_name' => 'W3_Plugin_Varnish', 'enable_options' => 'varnish.enabled'),
array('class_name' => 'W3_Plugin_NewRelic', 'enable_options' => 'newrelic.enabled')
);
if (is_admin()) {
$this->_plugins[] = array('class_name' => 'W3_Plugin_CloudFlareAdmin', 'enable_options' => 'cloudflare.enabled');
$this->_plugins[] = array('class_name' => 'W3_Plugin_TotalCacheAdmin', 'enable_options' => null);
$this->_plugins[] = array('class_name' => 'W3_Plugin_NewRelicAdmin', 'enable_options' => null);
$this->_plugins[] = array('class_name' => 'W3_Widget_SpreadTheWord', 'enable_options' => null);
$this->_plugins[] = array('class_name' => 'W3_Widget_Services', 'enable_options' => null);
$this->_plugins[] = array('class_name' => 'W3_Widget_News', 'enable_options' => null);
$this->_plugins[] = array('class_name' => 'W3_Widget_Forum', 'enable_options' => null);
$this->_plugins[] = array('class_name' => 'W3_Widget_PageSpeed', 'enable_options' => 'widget.pagespeed.enabled');
$this->_plugins[] = array('class_name' => 'W3_Widget_NewRelic', 'enable_options' => null);
}
$this->_config = w3_instance('W3_Config');
$this->_load_plugins();
register_activation_hook(W3TC_FILE, array(
&$this,
'activate'
));
register_deactivation_hook(W3TC_FILE, array(
&$this,
'deactivate'
));
}
/**
* Run plugins
*/
function run() {
foreach ($this->_loaded_plugins as $plugin) {
$plugin->run();
}
}
/**
* Returns an array[filename]=rules of rules for .htaccess or nginx files
* @return array
*/
function get_required_rules() {
$rewrite_rules_descriptors = array();
$rules = array();
foreach ($this->_loaded_plugins as $plugin) {
$admin = $plugin->get_admin();
if ($admin) {
$required_rules = $admin->get_required_rules();
if ($required_rules) {
if ($plugin instanceof W3_Plugin_PgCache) {
$rules = array_merge($rules, $required_rules);
} else {
foreach ($required_rules as $descriptor) {
$filename = $descriptor['filename'];
$content = isset($rewrite_rules_descriptors[$filename]) ? $rewrite_rules_descriptors[$filename]['content'] : '';
$rewrite_rules_descriptors[$filename] = array('filename' => $filename, 'content' => $content . $descriptor['content']);
}
}
}
}
}
if ($rules) {
foreach ($rules as $descriptor) {
$filename = $descriptor['filename'];
$content = isset($rewrite_rules_descriptors[$filename]) ? $rewrite_rules_descriptors[$filename]['content'] : '';
$rewrite_rules_descriptors[$filename] = array('filename' => $filename, 'content' => $content . $descriptor['content']);
}
}
ksort($rewrite_rules_descriptors);
reset($rewrite_rules_descriptors);
return $rewrite_rules_descriptors;
}
/**
* Instantiate all plugins
*/
private function _load_plugins() {
foreach ($this->_plugins as $plugin) {
$this->_load_plugin($plugin);
}
}
/**
* Instantiate plugin
* @param $plugin_descriptor array('class_name' => '', 'enable_options' => '')
*/
private function _load_plugin($plugin_descriptor) {
$criteria = $plugin_descriptor['enable_options'];
if (is_array($criteria)){
$enabled = true;
foreach ($criteria as $val) {
$enabled = $enabled && $this->_config->get_boolean($val);
}
} else {
$enabled = is_null($criteria) || $this->_config->get_boolean($criteria);
}
if ($enabled) {
$plugin = w3_instance($plugin_descriptor['class_name']);
$this->_loaded_plugins[] = $plugin;
}
}
/**
* Run activate on loaded plugins
*/
public function activate() {
foreach ($this->_loaded_plugins as $plugin)
$plugin->activate();
}
/**
* Run deactivate on loaded plugins
*/
public function deactivate() {
w3_require_once(W3TC_INC_DIR . '/functions/activation.php');
$ftp_form = null;
try {
w3_enable_maintenance_mode();
} catch(Exception $ex){}
$errors = array('errors' => array());
try {
if (!$this->_config->get_boolean('pgcache.enabled')) {
$plugin = w3_instance('W3_Plugin_PgCache');
$this->_loaded_plugins[] = $plugin;
}
foreach ($this->_loaded_plugins as $plugin) {
$result = $plugin->deactivate();
if ($result) {
$plugin_errors = isset($result['errors_short_form']) ? $result['errors_short_form'] : $result['errors'];
$errors['errors'] = array_merge($errors['errors'], $plugin_errors);
if (isset($result['ftp_form']))
$errors['ftp_form'] = $result['ftp_form'];
}
}
} catch (Exception $ex) {
$errors['errors'][] = $ex->getMessage();
}
$result = $this->delete_files_and_folders();
try {
w3_disable_maintenance_mode();
} catch(Exception $ex){}
if ($result['errors']) {
$errors['errors'] = array_merge($errors['errors'], $result['errors']);
if (isset($result['ftp_form']))
$errors['ftp_form'] = $result['ftp_form'];
}
return $errors;
}
private function delete_files_and_folders() {
$ftp_form = null;
$errors = array();
$dirs = array(W3TC_CACHE_DIR);
$files = array(W3TC_ADDIN_FILE_DB, W3TC_ADDIN_FILE_OBJECT_CACHE, W3TC_ADDIN_FILE_ADVANCED_CACHE);
if (file_exists(W3TC_WP_LOADER))
$files[] = W3TC_WP_LOADER;
foreach ($files as $file) {
try {
w3_wp_delete_file($file);
} catch(Exception $e) {
if ($e instanceof FilesystemCredentialException)
$ftp_form = $e->ftp_form();
}
if (file_exists($file))
$errors[] = sprintf('Delete file: %s', $file);
}
try {
@set_time_limit(60);
w3_wp_delete_folders($dirs);
} catch(Exception $e) {
if ($e instanceof FilesystemCredentialException)
$ftp_form = $e->ftp_form();
}
foreach($dirs as $folder)
if (@is_dir($folder))
$errors[] = sprintf('Delete folder: %s',$folder);
return array('errors' => $errors, 'ftp_form' => $ftp_form);
}
}