_blog_id = $blog_id; $this->_preview = $preview; include W3TC_DIR . '/ConfigKeys.php'; $this->_keys = $keys; // move _date to initial state foreach ( $this->_keys as $key => $value ) $this->_data[$key] = $value['default']; $this->_data['version'] = W3TC_VERSION; } public function load() { // apply data from master config $master_filename = Config::util_config_filename( 0, $this->_preview ); $data = Config::util_array_from_file( $master_filename ); if ( is_null( $data ) && $this->_preview ) { // try to read production data when preview not available $master_filename = Config::util_config_filename( 0, false ); $data = Config::util_array_from_file( $master_filename ); } // try to get legacy data if ( is_null( $data ) ) { $master_filename = Config::util_config_filename_legacy( 0, $this->_preview ); $data = self::util_array_from_file_legacy( $master_filename ); } if ( is_array( $data ) ) { $data = $this->upgrade( $data ); foreach ( $data as $key => $value ) $this->_data[$key] = $value; } if ( $this->is_master() ) return; // apply child config $child_filename = Config::util_config_filename( $this->_blog_id, $this->_preview ); $data = Config::util_array_from_file( $child_filename ); if ( is_null( $data ) && $this->_preview ) { // try to read production data when preview not available $child_filename = Config::util_config_filename( $this->_blog_id, false ); $data = Config::util_array_from_file( $child_filename ); } // try to get legacy data if ( is_null( $data ) ) { $child_filename = Config::util_config_filename_legacy( $this->_blog_id, $this->_preview ); $data = self::util_array_from_file_legacy( $child_filename ); } if ( is_array( $data ) ) { $data = $this->upgrade( $data ); foreach ( $data as $key => $value ) { if ( !ConfigCompiler::child_key_sealed( $key, $this->_data, $data ) ) $this->_data[$key] = $value; } } } public function apply_data( $data ) { foreach ( $data as $key => $value ) $this->_data[$key] = $value; } public function get_data() { return $this->_data; } public function save() { $data = array( 'version' => $this->_data['version'] ); if ( $this->is_master() ) { foreach ( $this->_data as $key => $value ) $data[$key] = $this->_data[$key]; } else { // write only overwrited keys $master = new ConfigCompiler( 0, $this->_preview ); $master->load(); foreach ( $this->_data as $key => $value ) { if ( !ConfigCompiler::child_key_sealed( $key, $master->_data, $this->_data ) ) $data[$key] = $this->_data[$key]; } } $filename = Config::util_config_filename( $this->_blog_id, $this->_preview ); if ( defined( 'JSON_PRETTY_PRINT' ) ) $config = json_encode( $data, JSON_PRETTY_PRINT ); else // for older php versions $config = json_encode( $data ); Util_File::file_put_contents_atomic( $filename, $config ); } /** * Returns true if we edit master config * * @return boolean */ private function is_master() { return $this->_blog_id <= 0; } /** * Apply new default values when version changes */ private function upgrade( $file_data ) { if ( !isset( $file_data['version'] ) ) $file_data['version'] = '0.0.0'; if ( !function_exists( 'bb2_start' ) ) { $file_data['pgcache.bad_behavior_path'] = ''; } else { if ( file_exists( WP_PLUGIN_DIR . '/bad-behavior/bad-behavior-generic.php' ) ) { $bb_file = WP_PLUGIN_DIR . '/bad-behavior/bad-behavior-generic.php'; } elseif ( file_exists( WP_PLUGIN_DIR . '/Bad-Behavior/bad-behavior-generic.php' ) ) { $bb_file = WP_PLUGIN_DIR . '/Bad-Behavior/bad-behavior-generic.php'; } else { $bb_file = false; } if ( $bb_file ) { $file_data['pgcache.bad_behavior_path'] = $bb_file; } } // // changes in 0.9.5 // if ( !isset( $file_data['extensions.active_frontend'] ) || !is_array( $file_data['extensions.active_frontend'] ) ) $file_data['extensions.active_frontend'] = array(); if ( version_compare( $file_data['version'], '0.9.5', '<' ) ) { // dont show minify tips if already enabled if ( isset( $file_data['minify.enabled'] ) && $file_data['minify.enabled'] == 'true' && function_exists( 'get_option' ) ) { $cs = Dispatcher::config_state(); $cs->set( 'minify.hide_minify_help', true ); $cs->save(); } $file_data['pgcache.mirrors.enabled'] = true; // map regions in rackspace if ( isset( $file_data['cdn.rscf.location'] ) ) { if ( $file_data['cdn.rscf.location'] == 'uk' ) $file_data['cdn.rscf.location'] = 'LON'; if ( $file_data['cdn.rscf.location'] == 'us' ) $file_data['cdn.rscf.location'] = 'ORD'; } // change filenames $active = array(); if ( isset( $file_data['extensions.active'] ) && is_array( $file_data['extensions.active'] ) ) { if ( isset( $file_data['extensions.active']['cloudflare'] ) ) $active['cloudflare'] = 'w3-total-cache/Extension_CloudFlare_Plugin.php'; if ( isset( $file_data['extensions.active']['feedburner'] ) ) $active['feedburner'] = 'w3-total-cache/Extension_FeedBurner_Plugin.php'; if ( isset( $file_data['extensions.active']['genesis.theme'] ) ) $active['genesis.theme'] = 'w3-total-cache/Extension_Genesis_Plugin.php'; if ( isset( $file_data['extensions.active']['wordpress-seo'] ) ) $active['wordpress-seo'] = 'w3-total-cache/Extension_WordPressSeo_Plugin.php'; } $file_data['extensions.active'] = $active; $active_frontend = array(); foreach ( $active as $key => $value ) $active_frontend[$key] = '*'; $file_data['extensions.active_frontend'] = $active_frontend; // keep those active by default $file_data['extensions.active']['newrelic'] = 'w3-total-cache/Extension_NewRelic_Plugin.php'; $file_data['extensions.active']['fragmentcache'] = 'w3-total-cache/Extension_FragmentCache_Plugin.php'; } // newrelic settings - migrate to extension if ( isset( $file_data['newrelic.enabled'] ) && $file_data['newrelic.enabled'] ) { // make new relic extension enabled if ( !isset( $file_data['extensions.active_frontend']['newrelic'] ) ) $file_data['extensions.active_frontend']['newrelic'] ='*'; } if ( !isset( $file_data['newrelic'] ) || !is_array( $file_data['newrelic'] ) ) $file_data['newrelic'] = array( 'monitoring_type' => 'apm' ); $this->_set_if_exists( $file_data, 'newrelic.api_key', 'newrelic', 'api_key' ); $this->_set_if_exists( $file_data, 'newrelic.appname', 'newrelic', 'apm.application_name' ); $this->_set_if_exists( $file_data, 'newrelic.accept.logged_roles', 'newrelic', 'accept.logged_roles' ); $this->_set_if_exists( $file_data, 'newrelic.accept.roles', 'newrelic', 'accept.roles' ); $this->_set_if_exists( $file_data, 'newrelic.use_php_function', 'newrelic', 'use_php_function' ); $this->_set_if_exists( $file_data, 'newrelic.cache_time', 'newrelic', 'cache_time' ); $this->_set_if_exists( $file_data, 'newrelic.enable_xmit', 'newrelic', 'enable_xmit' ); $this->_set_if_exists( $file_data, 'newrelic.include_rum', 'newrelic', 'include_rum' ); // extensions - kept in separate key now $this->_set_if_exists_extension( $file_data, 'cloudflare' ); $this->_set_if_exists_extension( $file_data, 'genesis.theme' ); $this->_set_if_exists_extension( $file_data, 'feedburner' ); // fragmentcache to extension if ( isset( $file_data['fragmentcache.enabled'] ) && $file_data['fragmentcache.enabled'] ) { // make new relic extension enabled if ( !isset( $file_data['extensions.active_frontend']['fragmentcache'] ) ) $file_data['extensions.active_frontend']['fragmentcache'] = '*'; } $this->_set_if_exists( $file_data, 'fragmentcache.debug', 'fragmentcache', 'debug' ); $this->_set_if_exists( $file_data, 'fragmentcache.engine', 'fragmentcache', 'engine' ); $this->_set_if_exists( $file_data, 'fragmentcache.file.gc', 'fragmentcache', 'file.gc' ); $this->_set_if_exists( $file_data, 'fragmentcache.file.locking', 'fragmentcache', 'file.locking' ); $this->_set_if_exists( $file_data, 'fragmentcache.memcached.servers', 'fragmentcache', 'memcached.servers' ); $this->_set_if_exists( $file_data, 'fragmentcache.memcached.persistent', 'fragmentcache', 'memcached.persistent' ); $this->_set_if_exists( $file_data, 'fragmentcache.memcached.aws_autodiscovery', 'fragmentcache', 'memcached.aws_autodiscovery' ); $this->_set_if_exists( $file_data, 'fragmentcache.memcached.username', 'fragmentcache', 'memcached.username' ); $this->_set_if_exists( $file_data, 'fragmentcache.memcached.password', 'fragmentcache', 'memcached.password' ); $this->_set_if_exists( $file_data, 'fragmentcache.redis.persistent', 'fragmentcache', 'redis.persistent' ); $this->_set_if_exists( $file_data, 'fragmentcache.redis.servers', 'fragmentcache', 'redis.servers' ); $this->_set_if_exists( $file_data, 'fragmentcache.redis.password', 'fragmentcache', 'redis.password' ); $this->_set_if_exists( $file_data, 'fragmentcache.redis.dbid', 'fragmentcache', 'redis.dbid' ); $this->_set_if_exists( $file_data, 'fragmentcache.lifetime', 'fragmentcache', 'lifetime' ); $file_data['version'] = W3TC_VERSION; return $file_data; } private function _set_if_exists_extension( &$a, $extension ) { if ( isset( $a['extensions.settings'] ) && isset( $a['extensions.settings'][$extension] ) ) { $a[$extension] = $a['extensions.settings'][$extension]; unset( $a['extensions.settings'][$extension] ); } } private function _set_if_exists( &$a, $old_key, $new_key0, $new_key1 ) { if ( isset( $a[$old_key] ) ) { $a[$new_key0][$new_key1] = $a[$old_key]; unset( $a[$old_key] ); } } }