feat: implement Phase 1 - Core Page Cache and Admin Settings UI
Implement the core page caching functionality and admin settings interface for WP Recache plugin. This includes: - Plugin bootstrap with activation/deactivation handlers - Admin settings page with tabbed interface (Cache, Optimization, Advanced) - Admin bar integration for quick cache purging - Core page cache using output buffering - Cache file management with mobile device separation - Cache purge on post update/comment - Default URL exclusions (cart, checkout, account) - Cache statistics display - PHPUnit test suite setup - Docker-based development environment - PHPStan configuration for static analysis References: - Closes #1 (Core Page Cache) - Closes #8 (Admin Settings UI)
This commit is contained in:
@@ -0,0 +1,216 @@
|
||||
<?php
|
||||
/**
|
||||
* Common helper functions.
|
||||
*
|
||||
* @package WP_Recache
|
||||
*/
|
||||
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
/**
|
||||
* Check if cache is enabled.
|
||||
*/
|
||||
function wp_recache_is_cache_enabled() {
|
||||
return (bool) get_option('wp_recache_cache_enabled', true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a specific feature is enabled.
|
||||
*
|
||||
* @param string $feature Feature name.
|
||||
*/
|
||||
function wp_recache_is_feature_enabled($feature) {
|
||||
return (bool) get_option("wp_recache_{$feature}_enabled", false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get plugin option with default.
|
||||
*
|
||||
* @param string $option Option name.
|
||||
* @param mixed $default Default value.
|
||||
*/
|
||||
function wp_recache_get_option($option, $default = false) {
|
||||
return get_option("wp_recache_{$option}", $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set plugin option.
|
||||
*
|
||||
* @param string $option Option name.
|
||||
* @param mixed $value Option value.
|
||||
*/
|
||||
function wp_recache_set_option($option, $value) {
|
||||
return update_option("wp_recache_{$option}", $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if current user is logged in.
|
||||
*/
|
||||
function wp_recache_is_logged_in() {
|
||||
return is_user_logged_in();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if current request should be excluded from cache.
|
||||
*/
|
||||
function wp_recache_should_exclude() {
|
||||
if (wp_recache_is_logged_in()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (wp_recache_is_robots()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (is_preview()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (wp_recache_is_post_action()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$exclude_urls = wp_recache_get_option('exclude_urls', []);
|
||||
$request_uri = wp_parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
||||
|
||||
foreach ($exclude_urls as $url) {
|
||||
if (strpos($request_uri, trim($url)) !== false) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return apply_filters('wp_recache_exclude', false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if request is for a robot/crawler.
|
||||
*/
|
||||
function wp_recache_is_robots() {
|
||||
return isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'bot') !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if request is a POST action.
|
||||
*/
|
||||
function wp_recache_is_post_action() {
|
||||
return $_SERVER['REQUEST_METHOD'] === 'POST';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cache file path for URL.
|
||||
*
|
||||
* @param string $url URL to cache.
|
||||
*/
|
||||
function wp_recache_get_cache_path($url) {
|
||||
$path = wp_parse_url($url, PHP_URL_PATH);
|
||||
$path = trim($path, '/');
|
||||
|
||||
if (empty($path)) {
|
||||
$path = 'index';
|
||||
}
|
||||
|
||||
$path = sanitize_file_name($path);
|
||||
|
||||
return WP_RECACHE_CACHE_PATH . $path . '.html';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cache key for URL.
|
||||
*
|
||||
* @param string $url URL to cache.
|
||||
*/
|
||||
function wp_recache_get_cache_key($url) {
|
||||
$key = wp_parse_url($url, PHP_URL_PATH);
|
||||
|
||||
if (empty($key)) {
|
||||
$key = '/';
|
||||
}
|
||||
|
||||
return md5($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete cache file for URL.
|
||||
*
|
||||
* @param string $url URL to delete cache for.
|
||||
*/
|
||||
function wp_recache_delete_cache($url) {
|
||||
$path = wp_recache_get_cache_path($url);
|
||||
|
||||
if (file_exists($path)) {
|
||||
return unlink($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all cache files.
|
||||
*/
|
||||
function wp_recache_delete_all_cache() {
|
||||
$cache_path = WP_RECACHE_CACHE_PATH;
|
||||
|
||||
if (!is_dir($cache_path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$files = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator($cache_path, RecursiveDirectoryIterator::SKIP_DOTS),
|
||||
RecursiveIteratorIterator::CHILD_FIRST
|
||||
);
|
||||
|
||||
foreach ($files as $file) {
|
||||
if ($file->isDir()) {
|
||||
rmdir($file->getRealPath());
|
||||
} else {
|
||||
unlink($file->getRealPath());
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if URL is mobile.
|
||||
*/
|
||||
function wp_recache_is_mobile() {
|
||||
if (!isset($_SERVER['HTTP_USER_AGENT'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$mobile_agents = [
|
||||
'android',
|
||||
'iphone',
|
||||
'ipad',
|
||||
'ipod',
|
||||
'blackberry',
|
||||
'opera mini',
|
||||
'opera mobi',
|
||||
];
|
||||
|
||||
$user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
|
||||
|
||||
foreach ($mobile_agents as $agent) {
|
||||
if (strpos($user_agent, $agent) !== false) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cache file path for URL with mobile detection.
|
||||
*
|
||||
* @param string $url URL to cache.
|
||||
*/
|
||||
function wp_recache_get_cache_path_with_device($url) {
|
||||
$path = wp_recache_get_cache_path($url);
|
||||
|
||||
if (wp_recache_get_option('separate_mobile_cache', false)) {
|
||||
$device = wp_recache_is_mobile() ? 'mobile' : 'desktop';
|
||||
$path = str_replace('.html', "-{$device}.html", $path);
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
Reference in New Issue
Block a user