) 2005-07-19: 2.0.9 - Better control of post_id and comment_id by refactoring the code (inspired by a Brian Dupuis patch). - Avoid cleaning cache twice due to WP bugs that wrongly calls two actions. 2005-07-12: 2.0.8 - Add paranoic control to make sure it only caches files with closing "body" and "html" tags. 2005-06-23: 2.0.7 - Add an extra control to make sure meta_mtime >= content_mtime (it could serves incomplete html because other process is re-generating content file and the meta file is the previous one). 2005-06-23: 2.0.6 - Delect cache _selectively_. If post_id is known it deletes only that cache and the general (indexes) ones. See: http://mnm.uib.es/gallir/wp-cache-2/#comment-4194 - Delete cache files (all) also after moderation. 2005-06-19: 2.0.5 - Added "#anchors" to refresh cache files' list (http://mnm.uib.es/gallir/wp-cache-2/#comment-4116) 2005-06-09: 2.0.4 - Avoid "fwrite() thrashing" at the begining of a connections storm - Send Content-Size header when generated dynamically too - Clean stats cache before deleting expired files - Optimized phase1, EVEN MORE! :-): removed random and extrachecks that were not useful in the context move checking for .meta at the begining 2005-05-27: 2.0.3 - Check for zero length of user agent and uri strings 2005-05-24: 2.0.2a - As a workaround for buggy apache installations, create Content-Type header if is not retrieved from Apache headers. 2005-05-23: 2.0.2 - Added mfunc sintax as in Staticize Reloaded 2.5, also keep tags but take out function calls - Check of numbers are really numbers in web forms. - Remove header_list function verification, its result are not the same. - wp-cache now verifies if gzipcompression is enabled 2005-05-08: 2.0.1 sanitize function names to aovid namespace collisions 2005-05-08: 2.0-beta6 ignore URI after #, it's sent by buggy clients print in red expired files's cache time if phase2 was compiled, reuse its function to remove files, it avoids race-conditions check html _and_ meta exist when listing/accesing files in cache 2005-05-06: 2.0-beta5 remove all expired files when one has expired POSTs are completely ignored only wordpress specific cookies are used for the md5 key 2005-05-06: 2.0-beta4 move wp_cache_microtime_diff to phase 2 normalize functions' name in phase2 workaround for nasty bug un PHP4(.3) that hits when cache fallbacks to flock() 2005-05-06: 2.0-beta3 include sample configuration file if the final one does not exist more verbose in errors change order of initial configuration to give better information stop if global cache is not enabled wp-cache-phase1 returns silently if no wp-cache-config.php is found 2005-05-06: 2.0-beta2 removed paranoic chmod's check for cache file consistency in Phase1 several times addded option to prevent cache based on user-agents added size in KB to every listed file in "cache listing" */ $wp_cache_config_file = ABSPATH . 'wp-content/wp-cache-config.php'; $wp_cache_config_file_sample = ABSPATH . 'wp-content/plugins/wp-cache/wp-cache-config-sample.php'; $wp_cache_link = ABSPATH . 'wp-content/advanced-cache.php'; $wp_cache_file = ABSPATH . 'wp-content/plugins/wp-cache/wp-cache-phase1.php'; if( !@include($wp_cache_config_file) ) { @include($wp_cache_config_file_sample); } function wp_cache_add_pages() { add_options_page('WP-Cache Manager', 'WP-Cache', 5, __FILE__, 'wp_cache_manager'); } function wp_cache_manager() { global $wp_cache_config_file, $valid_nonce; $valid_nonce = wp_verify_nonce($_REQUEST['_wpnonce'], 'wp-cache'); echo '
'; echo "

WP-Cache Manager

\n"; if(isset($_REQUEST['wp_restore_config']) && $valid_nonce) { unlink($wp_cache_config_file); echo 'Configuration file changed, some values might be wrong. Load the page again from the "Options" menu to reset them.'; } echo '
Main options'; if ( !wp_cache_check_link() || !wp_cache_verify_config_file() || !wp_cache_verify_cache_dir() ) { echo "
Cannot continue... fix previous problems and retry.
"; echo "
\n"; return; } if (!wp_cache_check_global_config()) { echo "\n"; return; } if ( $valid_nonce ) { if(isset($_REQUEST['wp_enable'])) { wp_cache_enable(); } elseif (isset($_REQUEST['wp_disable'])) { wp_cache_disable(); } } echo '
'; if (wp_cache_is_enabled()) { echo 'WP-Cache is Enabled'; echo ''; echo '
'; } else { echo 'WP-Cache is Disabled'; echo ''; echo '
'; } wp_nonce_field('wp-cache'); echo "
\n"; wp_cache_edit_max_time(); echo ''; echo '
Accepted filenames, rejected URIs'; wp_cache_edit_rejected(); echo "
\n"; wp_cache_edit_accepted(); echo '
'; wp_cache_edit_rejected_ua(); wp_cache_files(); wp_cache_restore(); echo "\n"; } function wp_cache_restore() { echo '
Configuration messed up?'; echo '
'; echo ''; echo '
'; wp_nonce_field('wp-cache'); echo "
\n"; echo '
'; } function wp_cache_edit_max_time () { global $cache_max_time, $wp_cache_config_file, $valid_nonce; if(isset($_REQUEST['wp_max_time']) && $valid_nonce) { $max_time = (int)$_REQUEST['wp_max_time']; if ($max_time > 0) { $cache_max_time = $max_time; wp_cache_replace_line('^ *\$cache_max_time', "\$cache_max_time = $cache_max_time;", $wp_cache_config_file); } } echo '
'; echo ''; echo ""; echo '
'; wp_nonce_field('wp-cache'); echo "
\n"; } function wp_cache_sanitize_value($text, & $array) { $text = wp_specialchars(strip_tags($text)); $array = preg_split("/[\s,]+/", chop($text)); $text = var_export($array, true); $text = preg_replace('/[\s]+/', ' ', $text); return $text; } function wp_cache_edit_rejected_ua() { global $cache_rejected_user_agent, $wp_cache_config_file, $valid_nonce; if (!function_exists('apache_request_headers')) return; if(isset($_REQUEST['wp_rejected_user_agent']) && $valid_nonce) { $text = wp_cache_sanitize_value($_REQUEST['wp_rejected_user_agent'], $cache_rejected_user_agent); wp_cache_replace_line('^ *\$cache_rejected_user_agent', "\$cache_rejected_user_agent = $text;", $wp_cache_config_file); } echo '
Rejected User Agents'; echo "

Strings in the HTTP 'User Agent' header that prevent WP-Cache from caching bot, spiders, and crawlers' requests. Note that cached files are still sent to these request if they already exists.

\n"; echo '
'; echo ''; echo ' '; echo '
'; wp_nonce_field('wp-cache'); echo '
'; echo "
\n"; } function wp_cache_edit_rejected() { global $cache_acceptable_files, $cache_rejected_uri, $wp_cache_config_file, $valid_nonce; if(isset($_REQUEST['wp_rejected_uri']) && $valid_nonce) { $text = wp_cache_sanitize_value($_REQUEST['wp_rejected_uri'], $cache_rejected_uri); wp_cache_replace_line('^ *\$cache_rejected_uri', "\$cache_rejected_uri = $text;", $wp_cache_config_file); } echo "

Add here strings (not a filename) that forces a page not to be cached. For example, if your URLs include year and you dont want to cache last year posts, it's enough to specify the year, i.e. '/2004/'. WP-Cache will search if that string is part of the URI and if so, it will no cache that page.

\n"; echo '
'; echo ''; echo ' '; echo '
'; wp_nonce_field('wp-cache'); echo "
\n"; } function wp_cache_edit_accepted() { global $cache_acceptable_files, $cache_rejected_uri, $wp_cache_config_file, $valid_nonce; if(isset($_REQUEST['wp_accepted_files']) && $valid_nonce) { $text = wp_cache_sanitize_value($_REQUEST['wp_accepted_files'], $cache_acceptable_files); wp_cache_replace_line('^ *\$cache_acceptable_files', "\$cache_acceptable_files = $text;", $wp_cache_config_file); } echo "

Add here those filenames that can be cached, even if they match one of the rejected substring specified above.

\n"; echo '
'; echo ''; echo ' '; echo '
'; wp_nonce_field('wp-cache'); echo "
\n"; } function wp_cache_enable() { global $wp_cache_config_file, $cache_enabled; if(get_settings('gzipcompression')) { echo "Error: GZIP compression is enabled, disable it if you want to enable wp-cache.

"; return false; } if( wp_cache_replace_line('^ *\$cache_enabled', '$cache_enabled = true;', $wp_cache_config_file) ) { $cache_enabled = true; } } function wp_cache_disable() { global $wp_cache_config_file, $cache_enabled; if (wp_cache_replace_line('^ *\$cache_enabled', '$cache_enabled = false;', $wp_cache_config_file)) { $cache_enabled = false; } } function wp_cache_is_enabled() { global $wp_cache_config_file; if(get_settings('gzipcompression')) { echo "Warning: GZIP compression is enabled in Wordpress, wp-cache will be bypassed until you disable gzip compression.
"; return false; } $lines = file($wp_cache_config_file); foreach($lines as $line) { if (preg_match('/^ *\$cache_enabled *= *true *;/', $line)) return true; } return false; } function wp_cache_replace_line($old, $new, $my_file) { if (!is_writable($my_file)) { echo "Error: file $my_file is not writeable.
\n"; return false; } $found = false; $lines = file($my_file); foreach($lines as $line) { if ( preg_match("/$old/", $line)) { $found = true; break; } } if ($found) { $fd = fopen($my_file, 'w'); foreach($lines as $line) { if ( !preg_match("/$old/", $line)) fputs($fd, $line); else { fputs($fd, "$new //Added by WP-Cache Manager\n"); } } fclose($fd); return true; } $fd = fopen($my_file, 'w'); $done = false; foreach($lines as $line) { if ( $done || !preg_match('/^define|\$|\?>/', $line)) fputs($fd, $line); else { fputs($fd, "$new //Added by WP-Cache Manager\n"); fputs($fd, $line); $done = true; } } fclose($fd); return true; /* copy($my_file, $my_file . "-prev"); rename($my_file . '-new', $my_file); */ } function wp_cache_verify_cache_dir() { global $cache_path; $dir = dirname($cache_path); if ( !file_exists($cache_path) ) { if ( !is_writable( $dir ) || !($dir = mkdir( $cache_path, 0777) ) ) { echo "Error: Your cache directory ($cache_path) did not exist and couldn't be created by the web server.
Check $dir permissions."; return false; } } if ( !is_writable($cache_path)) { echo "Error: Your cache directory ($cache_path) or $dir need to be writable for this plugin to work.
Double-check it."; return false; } if ( '/' != substr($cache_path, -1)) { $cache_path .= '/'; } return true; } function wp_cache_verify_config_file() { global $wp_cache_config_file, $wp_cache_config_file_sample; $new = false; $dir = dirname($wp_cache_config_file); if ( !is_writable($dir)) { echo "Error: wp-content directory ($dir) is not writable by the Web server.
Check its permissions."; return false; } if ( !file_exists($wp_cache_config_file) ) { if ( !file_exists($wp_cache_config_file_sample) ) { echo "Error: Sample WP-Cache config file ($wp_cache_config_file_sample) does not exist.
Verify you installation."; return false; } copy($wp_cache_config_file_sample, $wp_cache_config_file); $new = true; } if ( !is_writable($wp_cache_config_file)) { echo "Error: Your WP-Cache config file ($wp_cache_config_file) is not writable by the Web server.
Check its permissions."; return false; } require($wp_cache_config_file); return true; } function wp_cache_check_link() { global $wp_cache_link, $wp_cache_file; if ( basename(@readlink($wp_cache_link)) != basename($wp_cache_file)) { @unlink($wp_cache_link); if (!@symlink ($wp_cache_file, $wp_cache_link)) { echo "advanced-cache.php link does not exist
"; echo "Create it by executing:
ln -s $wp_cache_file $wp_cache_link
in your server
"; return false; } } return true; } function wp_cache_check_global_config() { $global = ABSPATH . 'wp-config.php'; $lines = file($global); foreach($lines as $line) { if (preg_match('/^ *define *\( *\'WP_CACHE\' *, *true *\) *;/', $line)) { return true; } } $line = 'define(\'WP_CACHE\', true);'; if (!is_writable($global) || !wp_cache_replace_line('define *\( *\'WP_CACHE\'', $line, $global) ) { echo "Error: WP_CACHE is not enabled in your wp-config.php file and I couldn't modified it.
"; echo "Edit $global and add the following line:
define('WP_CACHE', true);
Otherwise, WP-Cache will not be executed by Wordpress core.
"; return false; } return true; } function wp_cache_files() { global $cache_path, $file_prefix, $cache_max_time, $valid_nonce; if ( '/' != substr($cache_path, -1)) { $cache_path .= '/'; } if ( $valid_nonce ) { if(isset($_REQUEST['wp_delete_cache'])) { wp_cache_clean_cache($file_prefix); } if(isset($_REQUEST['wp_delete_cache_file'])) { wp_cache_clean_cache($_REQUEST['wp_delete_cache_file']); } if(isset($_REQUEST['wp_delete_expired'])) { wp_cache_clean_expired($file_prefix); } } if(isset($_REQUEST['wp_list_cache'])) { $list_files = true; $list_mess = "Update list"; } else $list_mess = "List files"; echo '
Cache contents'; echo '
'; echo ''; echo '
'; echo "
\n"; $count = 0; $expired = 0; $now = time(); if ( ($handle = opendir( $cache_path )) ) { if ($list_files) echo ""; while ( false !== ($file = readdir($handle))) { if ( preg_match("/^$file_prefix.*\.meta/", $file) ) { $this_expired = false; $content_file = preg_replace("/meta$/", "html", $file); $mtime = filemtime($cache_path.$file); if ( ! ($fsize = @filesize($cache_path.$content_file)) ) continue; // .meta does not exists $fsize = intval($fsize/1024); $age = $now - $mtime; if ( $age > $cache_max_time) { $expired++; $this_expired = true; } $count++; if ($list_files) { $meta = new CacheMeta; $meta = unserialize(file_get_contents($cache_path . $file)); echo $flip ? '' : ''; $flip = !$flip; echo '"; if ($this_expired) echo ""; else echo ""; echo ""; echo '\n"; } } } closedir($handle); if ($list_files) echo "
'; echo $meta->uri . "$age secs$age secs$fsize KB
'; echo ''; echo ''; echo '
'; wp_nonce_field('wp-cache'); echo "
"; } echo "

$count cached pages

"; echo "

$expired expired pages

"; echo '
'; echo ''; echo ''; echo '
'; wp_nonce_field('wp-cache'); echo "
\n"; echo '
'; echo ''; echo '
'; wp_nonce_field('wp-cache'); echo "
\n"; echo '
'; } function wp_cache_clean_cache($file_prefix) { global $cache_path; // If phase2 was compiled, use its function to avoid race-conditions if(function_exists('wp_cache_phase2_clean_cache')) return wp_cache_phase2_clean_cache($file_prefix); $expr = "/^$file_prefix/"; if ( ($handle = opendir( $cache_path )) ) { while ( false !== ($file = readdir($handle))) { if ( preg_match($expr, $file) ) { unlink($cache_path . $file); } } closedir($handle); } } function wp_cache_clean_expired($file_prefix) { global $cache_path, $cache_max_time; // If phase2 was compiled, use its function to avoid race-conditions if(function_exists('wp_cache_phase2_clean_expired')) return wp_cache_phase2_clean_expired($file_prefix); $expr = "/^$file_prefix/"; $now = time(); if ( ($handle = opendir( $cache_path )) ) { while ( false !== ($file = readdir($handle))) { if ( preg_match($expr, $file) && (filemtime($cache_path . $file) + $cache_max_time) <= $now) { unlink($cache_path . $file); } } closedir($handle); } } add_action('admin_menu', 'wp_cache_add_pages'); ?>