bibhamrokhanpin/wp-content/__plugins/wp-optimize/cache/class-wpo-cache-config.php
2024-04-10 17:46:06 +05:45

272 lines
7.2 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;
/**
* 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 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 bool
*/
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 boolean - returns false if an attempt to write failed
*/
private function write($config, $only_if_present = false) {
$url = parse_url(network_site_url());
if (isset($url['port']) && '' != $url['port'] && 80 != $url['port']) {
$config_file = WPO_CACHE_CONFIG_DIR.'/config-'.$url['host'].'-port'.$url['port'].'.php';
} else {
$config_file = WPO_CACHE_CONFIG_DIR.'/config-'.$url['host'].'.php';
}
$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) {
$config_content = '<?php' . "\n"
. 'if (!defined(\'ABSPATH\')) die(\'No direct access allowed\');' . "\n\n"
. '$GLOBALS[\'wpo_cache_config\'] = json_decode(\'' . json_encode($this->config) . '\', true);' . "\n";
} else {
$config_content = json_encode($this->config);
}
if ((!$only_if_present || file_exists($config_file)) && !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;
}
/**
* Verify we can write to the file system
*
* @since 1.0
* @return boolean
*/
public function verify_file_access() {
if (function_exists('clearstatcache')) {
clearstatcache();
}
// First check wp-config.php.
if (!is_writable(ABSPATH . 'wp-config.php') && !is_writable(ABSPATH . '../wp-config.php')) {
return false;
}
// Now check wp-content. We need to be able to create files of the same user as this file.
if (!$this->_is_dir_writable(untrailingslashit(WP_CONTENT_DIR))) {
return false;
}
// If the cache and config directories exist, make sure they're writeable
if (file_exists(untrailingslashit(WP_CONTENT_DIR) . '/wpo-cache')) {
if (file_exists(WPO_CACHE_DIR)) {
if (!$this->_is_dir_writable(WPO_CACHE_DIR)) {
return false;
}
}
if (file_exists(WPO_CACHE_CONFIG_DIR)) {
if (!$this->_is_dir_writable(WPO_CACHE_CONFIG_DIR)) {
return false;
}
}
}
return true;
}
/**
* 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_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_site_url('/'),
'enable_cache_per_country' => false,
);
return apply_filters('wpo_cache_defaults', $defaults);
}
/**
* 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;