267 lines
7.7 KiB
PHP
267 lines
7.7 KiB
PHP
<?php
|
|
|
|
if (!defined('ABSPATH')) die('No direct access allowed');
|
|
|
|
/**
|
|
* Handles cache configuration and related I/O
|
|
*/
|
|
|
|
if (!class_exists('WPO_Cache_Config')) :
|
|
|
|
class WPO_Cache_Config {
|
|
|
|
/**
|
|
* Defaults
|
|
*
|
|
* @var array
|
|
*/
|
|
public $defaults;
|
|
|
|
/**
|
|
* Instance of this class
|
|
*
|
|
* @var mixed
|
|
*/
|
|
public static $instance;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
public $config;
|
|
|
|
|
|
/**
|
|
* Set config defaults
|
|
*/
|
|
public function __construct() {
|
|
$this->defaults = $this->get_defaults();
|
|
}
|
|
|
|
/**
|
|
* Get config from file or cache
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get() {
|
|
|
|
if (is_multisite()) {
|
|
$config = get_site_option('wpo_cache_config', $this->get_defaults());
|
|
} else {
|
|
$config = get_option('wpo_cache_config', $this->get_defaults());
|
|
}
|
|
|
|
return wp_parse_args($config, $this->get_defaults());
|
|
}
|
|
|
|
/**
|
|
* Get a specific configuration option
|
|
*
|
|
* @param string $option_key The option identifier
|
|
* @param boolean $default Default value if the option doesn't exist (Default to false)
|
|
* @return mixed
|
|
*/
|
|
public function get_option($option_key, $default = false) {
|
|
$options = $this->get();
|
|
return apply_filters("wpo_option_key_{$option_key}", (isset($options[$option_key]) ? $options[$option_key] : $default));
|
|
}
|
|
|
|
/**
|
|
* Updates the given config object in file and DB
|
|
*
|
|
* @param array $config - the cache configuration
|
|
* @param boolean $skip_disk_if_not_yet_present - only write the configuration file to disk if it already exists. This presents PHP notices if the cache has never been on, and settings are saved.
|
|
*
|
|
* @return true|WP_Error - returns true on success or WP_Error if the config cannot be written to disk
|
|
*/
|
|
public function update($config, $skip_disk_if_not_yet_present = false) {
|
|
$config = wp_parse_args($config, $this->get_defaults());
|
|
|
|
$config['page_cache_length_value'] = intval($config['page_cache_length_value']);
|
|
$config['page_cache_length'] = $this->calculate_page_cache_length($config['page_cache_length_value'], $config['page_cache_length_unit']);
|
|
|
|
/**
|
|
* Filters the cookies used to set cache file names
|
|
*
|
|
* @param array $cookies - The cookies
|
|
* @param array $config - The new config
|
|
*/
|
|
$wpo_cache_cookies = apply_filters('wpo_cache_cookies', array(), $config);
|
|
sort($wpo_cache_cookies);
|
|
|
|
/**
|
|
* Filters the query variables used to set cache file names
|
|
*
|
|
* @param array $wpo_query_variables - The variables
|
|
* @param array $config - The new config
|
|
*/
|
|
$wpo_query_variables = apply_filters('wpo_cache_query_variables', array(), $config);
|
|
sort($wpo_query_variables);
|
|
|
|
$config['wpo_cache_cookies'] = $wpo_cache_cookies;
|
|
$config['wpo_cache_query_variables'] = $wpo_query_variables;
|
|
|
|
$config = apply_filters('wpo_cache_update_config', $config);
|
|
|
|
if (is_multisite()) {
|
|
update_site_option('wpo_cache_config', $config);
|
|
} else {
|
|
update_option('wpo_cache_config', $config);
|
|
}
|
|
|
|
do_action('wpo_cache_config_updated', $config);
|
|
|
|
return $this->write($config, $skip_disk_if_not_yet_present);
|
|
}
|
|
|
|
/**
|
|
* Calculate cache expiration value in seconds.
|
|
*
|
|
* @param int $value
|
|
* @param string $unit ( hours | days | months )
|
|
*
|
|
* @return int
|
|
*/
|
|
private function calculate_page_cache_length($value, $unit) {
|
|
$cache_length_units = array(
|
|
'hours' => 3600,
|
|
'days' => 86400,
|
|
'months' => 2629800, // 365.25 * 86400 / 12
|
|
);
|
|
|
|
return $value * $cache_length_units[$unit];
|
|
}
|
|
|
|
/**
|
|
* Deletes config files and options
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function delete() {
|
|
|
|
if (is_multisite()) {
|
|
delete_site_option('wpo_cache_config');
|
|
} else {
|
|
delete_option('wpo_cache_config');
|
|
}
|
|
|
|
if (!WPO_Page_Cache::delete(WPO_CACHE_CONFIG_DIR)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Writes config to file
|
|
*
|
|
* @param array $config - Configuration array.
|
|
* @param boolean $only_if_present - only writes to the disk if the configuration file already exists
|
|
*
|
|
* @return true|WP_Error - returns true on success or WP_Error if an attempt to write failed
|
|
*/
|
|
public function write($config, $only_if_present = false) {
|
|
|
|
$config_file = $this->get_config_file_path();
|
|
|
|
$this->config = wp_parse_args($config, $this->get_defaults());
|
|
|
|
// from 3.0.17 we use more secure way to store cache config files.
|
|
$advanced_cache_version = WPO_Page_Cache::instance()->get_advanced_cache_version();
|
|
// if advanced-cache.php exists and has at least 3.0.17 version or
|
|
// advanced-cache.php doesn't exist then
|
|
// we write the cache config in a new format.
|
|
if (($advanced_cache_version && (version_compare($advanced_cache_version, '3.0.17', '>='))) || !$advanced_cache_version) {
|
|
// Apply the encoding required for placing within PHP single quotes - https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.single
|
|
$json_encoded_string = str_replace(array('\\', "'"), array('\\\\', '\\\''), json_encode($this->config));
|
|
|
|
$config_content = '<?php' . "\n"
|
|
. 'if (!defined(\'ABSPATH\')) die(\'No direct access allowed\');' . "\n\n"
|
|
. '$GLOBALS[\'wpo_cache_config\'] = json_decode(\'' . $json_encoded_string . '\', true);' . "\n";
|
|
} else {
|
|
$config_content = json_encode($this->config);
|
|
}
|
|
|
|
if ((!$only_if_present || file_exists($config_file)) && (!is_writable(WPO_CACHE_CONFIG_DIR) || !file_put_contents($config_file, $config_content))) {
|
|
return new WP_Error('write_cache_config', sprintf(__('The cache configuration file could not be saved to the disk; please check the file/folder permissions of %s .', 'wp-optimize'), $config_file));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get config file name with full path.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_config_file_path() {
|
|
return WPO_CACHE_CONFIG_DIR . '/' . $this->get_cache_config_filename();
|
|
}
|
|
|
|
/**
|
|
* Return defaults
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_defaults() {
|
|
|
|
$defaults = array(
|
|
'enable_page_caching' => false,
|
|
'page_cache_length_value' => 24,
|
|
'page_cache_length_unit' => 'hours',
|
|
'page_cache_length' => 86400,
|
|
'cache_exception_conditional_tags' => array(),
|
|
'cache_exception_urls' => array(),
|
|
'cache_exception_cookies' => array(),
|
|
'cache_exception_browser_agents' => array(),
|
|
'enable_sitemap_preload' => false,
|
|
'enable_schedule_preload' => false,
|
|
'preload_schedule_type' => '',
|
|
'enable_mobile_caching' => false,
|
|
'enable_user_caching' => false,
|
|
'site_url' => network_home_url('/'),
|
|
'enable_cache_per_country' => false,
|
|
'enable_cache_aelia_currency' => false,
|
|
'permalink_structure' => get_option('permalink_structure'),
|
|
'uploads' => wp_normalize_path(wp_upload_dir()['basedir']),
|
|
'gmt_offset' => get_option('gmt_offset'),
|
|
'timezone_string' => get_option('timezone_string'),
|
|
'date_format' => get_option('date_format'),
|
|
'time_format' => get_option('time_format'),
|
|
'use_webp_images' => false,
|
|
'auto_preload_purged_contents' => true
|
|
);
|
|
|
|
return apply_filters('wpo_cache_defaults', $defaults);
|
|
}
|
|
|
|
/**
|
|
* Get advanced-cache.php file name with full path.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_cache_config_filename() {
|
|
$url = parse_url(network_site_url());
|
|
|
|
if (isset($url['port']) && '' != $url['port'] && 80 != $url['port']) {
|
|
return 'config-'.strtolower($url['host']).'-port'.$url['port'].'.php';
|
|
} else {
|
|
return 'config-'.strtolower($url['host']).'.php';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return an instance of the current class, create one if it doesn't exist
|
|
*
|
|
* @since 1.0
|
|
* @return WPO_Cache_Config
|
|
*/
|
|
public static function instance() {
|
|
|
|
if (!self::$instance) {
|
|
self::$instance = new self();
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
}
|
|
endif;
|