PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 4.7.0
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v4.7.0
4.7.0 4.6.1 4.6.0 4.5.5 4.5.4 4.5.3 4.5.2 3.2.20 3.2.21 3.2.22 3.2.3 3.2.5 3.2.6 3.2.7 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.7.0 3.7.1 All 111 releases
← All changes | cache/class-wpo-cache-config.php +92 -73 3.2.3 → 4.7.0 View file →
@@ -19,13 +19,18 @@
19 19
20 20 /**
21 21 * Instance of this class
22 22 *
23 - * @var mixed
23 + * @var WPO_Cache_Config | null
24 24 */
25 25 public static $instance;
26 26
27 + /**
28 + * @var array
29 + */
30 + public $config;
27 31
32 +
28 33 /**
29 34 * Set config defaults
30 35 */
31 36 public function __construct() {
@@ -39,14 +44,14 @@
39 44 */
40 45 public function get() {
41 46
42 47 if (is_multisite()) {
43 - $config = get_site_option('wpo_cache_config', $this->get_defaults());
48 + $config = get_site_option('wpo_cache_config', $this->defaults);
44 49 } else {
45 - $config = get_option('wpo_cache_config', $this->get_defaults());
50 + $config = get_option('wpo_cache_config', $this->defaults);
46 51 }
47 52
48 - return wp_parse_args($config, $this->get_defaults());
53 + return wp_parse_args($config, $this->defaults);
49 54 }
50 55
51 56 /**
52 57 * Get a specific configuration option
@@ -51,14 +56,14 @@
51 56 /**
52 57 * Get a specific configuration option
53 58 *
54 59 * @param string $option_key The option identifier
55 - * @param boolean $default Default value if the option doesn't exist (Default to false)
60 + * @param mixed $default Default value if the option doesn't exist (Default to false)
56 61 * @return mixed
57 62 */
58 63 public function get_option($option_key, $default = false) {
59 64 $options = $this->get();
60 - return isset($options[$option_key]) ? $options[$option_key] : $default;
65 + return apply_filters("wpo_option_key_{$option_key}", ($options[$option_key] ?? $default));
61 66 }
62 67
63 68 /**
64 69 * Updates the given config object in file and DB
@@ -65,15 +70,22 @@
65 70 *
66 71 * @param array $config - the cache configuration
67 72 * @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.
68 73 *
69 - * @return bool
74 + * @return true|WP_Error - returns true on success or WP_Error if the config cannot be written to disk
70 75 */
71 76 public function update($config, $skip_disk_if_not_yet_present = false) {
72 - $config = wp_parse_args($config, $this->get_defaults());
77 + $config = wp_parse_args($config, $this->defaults);
73 78
74 79 $config['page_cache_length_value'] = intval($config['page_cache_length_value']);
75 80 $config['page_cache_length'] = $this->calculate_page_cache_length($config['page_cache_length_value'], $config['page_cache_length_unit']);
81 +
82 + $fields_to_trim = array('cache_exception_conditional_tags', 'cache_exception_urls', 'cache_ignore_query_variables', 'cache_exception_cookies', 'cache_exception_browser_agents');
83 + foreach ($fields_to_trim as $field) {
84 + if (!empty($config[$field]) && is_array($config[$field])) {
85 + $config[$field] = array_map('trim', $config[$field]);
86 + }
87 + }
76 88
77 89 /**
78 90 * Filters the cookies used to set cache file names
79 91 *
@@ -93,9 +105,9 @@
93 105 sort($wpo_query_variables);
94 106
95 107 $config['wpo_cache_cookies'] = $wpo_cache_cookies;
96 108 $config['wpo_cache_query_variables'] = $wpo_query_variables;
97 -
109 +
98 110 $config = apply_filters('wpo_cache_update_config', $config);
99 111
100 112 if (is_multisite()) {
101 113 update_site_option('wpo_cache_config', $config);
@@ -151,22 +163,16 @@
151 163 *
152 164 * @param array $config - Configuration array.
153 165 * @param boolean $only_if_present - only writes to the disk if the configuration file already exists
154 166 *
155 - * @return boolean - returns false if an attempt to write failed
167 + * @return true|WP_Error - returns true on success or WP_Error if an attempt to write failed
156 168 */
157 - private function write($config, $only_if_present = false) {
169 + public function write($config, $only_if_present = false) {
158 170
159 - $url = parse_url(network_site_url());
171 + $config_file = $this->get_config_file_path();
160 172
161 - if (isset($url['port']) && '' != $url['port'] && 80 != $url['port']) {
162 - $config_file = WPO_CACHE_CONFIG_DIR.'/config-'.$url['host'].'-port'.$url['port'].'.php';
163 - } else {
164 - $config_file = WPO_CACHE_CONFIG_DIR.'/config-'.$url['host'].'.php';
165 - }
173 + $this->config = wp_parse_args($config, $this->defaults);
166 174
167 - $this->config = wp_parse_args($config, $this->get_defaults());
168 -
169 175 // from 3.0.17 we use more secure way to store cache config files.
170 176 $advanced_cache_version = WPO_Page_Cache::instance()->get_advanced_cache_version();
171 177 // if advanced-cache.php exists and has at least 3.0.17 version or
172 178 // advanced-cache.php doesn't exist then
@@ -171,17 +177,29 @@
171 177 // if advanced-cache.php exists and has at least 3.0.17 version or
172 178 // advanced-cache.php doesn't exist then
173 179 // we write the cache config in a new format.
174 180 if (($advanced_cache_version && (version_compare($advanced_cache_version, '3.0.17', '>='))) || !$advanced_cache_version) {
181 + // 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
182 + $json_encoded_string = str_replace(array('\\', "'"), array('\\\\', '\\\''), wp_json_encode($this->config));
183 +
175 184 $config_content = '<?php' . "\n"
176 185 . 'if (!defined(\'ABSPATH\')) die(\'No direct access allowed\');' . "\n\n"
177 - . '$GLOBALS[\'wpo_cache_config\'] = json_decode(\'' . json_encode($this->config) . '\', true);' . "\n";
186 + . '$GLOBALS[\'wpo_cache_config\'] = json_decode(\'' . $json_encoded_string . '\', true);' . "\n";
178 187 } else {
179 - $config_content = json_encode($this->config);
188 + $config_content = wp_json_encode($this->config);
180 189 }
181 190
182 - if ((!$only_if_present || file_exists($config_file)) && !file_put_contents($config_file, $config_content)) {
183 - 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));
191 + if ((!$only_if_present || file_exists($config_file)) && (!wp_is_writable(WPO_CACHE_CONFIG_DIR) || !file_put_contents($config_file, $config_content))) {
192 + // If translations are already loaded, use the translated string
193 + if (is_textdomain_loaded('wp-optimize')) {
194 + /* translators: %s is the path to the cache config file */
195 + $message = sprintf(__('The cache configuration file could not be saved to the disk; please check the file/folder permissions of %s .', 'wp-optimize'), $config_file);
196 + } else {
197 + // Fallback to plain English string to avoid triggering premature translation loading
198 + $message = sprintf('The cache configuration file could not be saved to the disk; please check the file/folder permissions of %s .', $config_file);
199 + }
200 +
201 + return new WP_Error('write_cache_config', $message);
184 202 }
185 203
186 204 return true;
187 205 }
@@ -186,47 +204,16 @@
186 204 return true;
187 205 }
188 206
189 207 /**
190 - * Verify we can write to the file system
208 + * Get config file name with full path.
191 209 *
192 - * @since 1.0
193 - * @return boolean
210 + * @return string
194 211 */
195 - public function verify_file_access() {
196 - if (function_exists('clearstatcache')) {
197 - clearstatcache();
198 - }
199 -
200 - // First check wp-config.php.
201 - if (!is_writable(ABSPATH . 'wp-config.php') && !is_writable(ABSPATH . '../wp-config.php')) {
202 - return false;
203 - }
204 -
205 - // Now check wp-content. We need to be able to create files of the same user as this file.
206 - if (!$this->_is_dir_writable(untrailingslashit(WP_CONTENT_DIR))) {
207 - return false;
208 - }
209 -
210 - // If the cache and config directories exist, make sure they're writeable
211 - if (file_exists(untrailingslashit(WP_CONTENT_DIR) . '/wpo-cache')) {
212 -
213 - if (file_exists(WPO_CACHE_DIR)) {
214 - if (!$this->_is_dir_writable(WPO_CACHE_DIR)) {
215 - return false;
216 - }
217 - }
218 -
219 - if (file_exists(WPO_CACHE_CONFIG_DIR)) {
220 - if (!$this->_is_dir_writable(WPO_CACHE_CONFIG_DIR)) {
221 - return false;
222 - }
223 - }
224 - }
225 -
226 - return true;
212 + public function get_config_file_path() {
213 + return WPO_CACHE_CONFIG_DIR . '/' . $this->get_cache_config_filename();
227 214 }
228 -
215 +
229 216 /**
230 217 * Return defaults
231 218 *
232 219 * @return array
@@ -233,25 +220,57 @@
233 220 */
234 221 public function get_defaults() {
235 222
236 223 $defaults = array(
237 - 'enable_page_caching' => false,
238 - 'page_cache_length_value' => 24,
239 - 'page_cache_length_unit' => 'hours',
240 - 'page_cache_length' => 86400,
241 - 'cache_exception_urls' => array(),
242 - 'cache_exception_cookies' => array(),
243 - 'cache_exception_browser_agents' => array(),
244 - 'enable_sitemap_preload' => false,
245 - 'enable_schedule_preload' => false,
246 - 'preload_schedule_type' => '',
247 - 'enable_mobile_caching' => false,
248 - 'enable_user_caching' => false,
249 - 'site_url' => network_site_url('/'),
250 - 'enable_cache_per_country' => false,
224 + 'enable_page_caching' => false,
225 + 'page_cache_length_value' => 24,
226 + 'page_cache_length_unit' => 'hours',
227 + 'page_cache_length' => 86400,
228 + 'cache_exception_conditional_tags' => array(),
229 + 'cache_specific_urls_only' => false,
230 + 'cache_include_urls' => array(),
231 + 'cache_exception_urls' => array(),
232 + 'cache_ignore_query_variables' => array(),
233 + 'cache_exception_cookies' => array(),
234 + 'cache_exception_browser_agents' => array(),
235 + 'enable_sitemap_preload' => false,
236 + 'enable_schedule_preload' => false,
237 + 'preload_schedule_type' => '',
238 + 'enable_mobile_caching' => false,
239 + 'enable_user_caching' => false,
240 + 'site_url' => network_home_url('/'),
241 + 'enable_cache_per_country' => false,
242 + 'enable_cache_aelia_currency' => false,
243 + 'permalink_structure' => get_option('permalink_structure'),
244 + 'uploads' => wp_normalize_path(wp_upload_dir()['basedir']),
245 + 'gmt_offset' => get_option('gmt_offset'),
246 + 'timezone_string' => get_option('timezone_string'),
247 + 'date_format' => get_option('date_format'),
248 + 'time_format' => get_option('time_format'),
249 + 'use_webp_images' => false,
250 + 'host_gravatars_locally' => 0,
251 + 'auto_preload_purged_contents' => true,
252 + 'enable_rest_caching' => false,
253 + 'last_cleared' => time(),
254 + 'lcp_preload_enable' => false,
251 255 );
252 256
253 257 return apply_filters('wpo_cache_defaults', $defaults);
258 + }
259 +
260 + /**
261 + * Get advanced-cache.php file name with full path.
262 + *
263 + * @return string
264 + */
265 + public function get_cache_config_filename() {
266 + $url = wp_parse_url(network_site_url());
267 +
268 + if (isset($url['port']) && '' !== (string) $url['port'] && 80 !== $url['port']) {
269 + return 'config-'.strtolower($url['host']).'-port'.$url['port'].'.php';
270 + } else {
271 + return 'config-'.strtolower($url['host']).'.php';
272 + }
254 273 }
255 274
256 275 /**
257 276 * Return an instance of the current class, create one if it doesn't exist