<?php /** * Built-in Cache System * * Ultra-fast page caching system built into the theme * No plugins needed - WP Rocket alternative * * @package MyTheme */ // Exit if accessed directly if (!defined('ABSPATH')) { exit; } class MyTheme_Cache_System { private $cache_dir; private $cache_enabled; private $cache_duration; /** * Constructor */ public function __construct() { // Cache settings $this->cache_enabled = function_exists('mytheme_get_option') ? mytheme_get_option('cache_enabled', true) : true; $this->cache_duration = function_exists('mytheme_get_option') ? mytheme_get_option('cache_duration', 3600) : 3600; // Cache directory $upload_dir = wp_upload_dir(); $this->cache_dir = $upload_dir['basedir'] . '/mytheme-cache'; // Initialize $this->init(); } /** * Initialize cache system */ private function init() { if (!$this->cache_enabled) { return; } // Create cache directory $this->create_cache_dir(); // Start output buffering for page caching add_action('template_redirect', array($this, 'start_page_cache'), 1); // Clear cache actions add_action('save_post', array($this, 'clear_post_cache')); add_action('comment_post', array($this, 'clear_post_cache')); add_action('switch_theme', array($this, 'clear_all_cache')); add_action('mytheme_clear_cache', array($this, 'clear_all_cache')); // Admin bar cache clear button add_action('admin_bar_menu', array($this, 'add_cache_clear_button'), 999); add_action('admin_post_mytheme_clear_cache', array($this, 'handle_cache_clear')); // AJAX cache clear add_action('wp_ajax_mytheme_clear_cache', array($this, 'ajax_clear_cache')); } /** * Create cache directory */ private function create_cache_dir() { if (!file_exists($this->cache_dir)) { wp_mkdir_p($this->cache_dir); // Add .htaccess for security $htaccess = $this->cache_dir . '/.htaccess'; if (!file_exists($htaccess)) { file_put_contents($htaccess, 'deny from all'); } } } /** * Get cache file path */ private function get_cache_file_path($url = null) { if ($url === null) { $url = $_SERVER['REQUEST_URI']; } // Generate unique cache key $cache_key = md5($url . (is_user_logged_in() ? 'logged_in' : 'guest')); return $this->cache_dir . '/' . $cache_key . '.html'; } /** * Start page caching */ public function start_page_cache() { // Don't cache for logged-in users or admin if (is_user_logged_in() || is_admin()) { return; } // Don't cache POST requests if ($_SERVER['REQUEST_METHOD'] === 'POST') { return; } // Don't cache search, 404, feeds if (is_search() || is_404() || is_feed() || is_trackback()) { return; } // Check if cached version exists $cache_file = $this->get_cache_file_path(); if (file_exists($cache_file)) { $cache_age = time() - filemtime($cache_file); // Serve cached version if not expired if ($cache_age < $this->cache_duration) { header('X-MyTheme-Cache: HIT'); header('Cache-Control: max-age=' . $this->cache_duration); readfile($cache_file); exit; } else { // Delete expired cache unlink($cache_file); } } // Start output buffering to create cache header('X-MyTheme-Cache: MISS'); ob_start(array($this, 'save_page_cache')); } /** * Save page to cache */ public function save_page_cache($html) { // Don't cache if HTML is empty or too small if (strlen($html) < 255) { return $html; } // Save to cache file $cache_file = $this->get_cache_file_path(); file_put_contents($cache_file, $html); return $html; } /** * Clear post cache */ public function clear_post_cache($post_id) { $post_url = get_permalink($post_id); $cache_file = $this->get_cache_file_path($post_url); if (file_exists($cache_file)) { unlink($cache_file); } // Also clear homepage and category archives $this->clear_homepage_cache(); } /** * Clear homepage cache */ private function clear_homepage_cache() { $home_cache = $this->get_cache_file_path('/'); if (file_exists($home_cache)) { unlink($home_cache); } } /** * Clear all cache */ public function clear_all_cache() { if (!file_exists($this->cache_dir)) { return; } // Delete all cache files $files = glob($this->cache_dir . '/*.html'); foreach ($files as $file) { if (is_file($file)) { unlink($file); } } } /** * Add cache clear button to admin bar */ public function add_cache_clear_button($wp_admin_bar) { if (!current_user_can('manage_options')) { return; } $wp_admin_bar->add_node(array( 'id' => 'mytheme-clear-cache', 'title' => 'Clear Cache', 'href' => wp_nonce_url(admin_url('admin-post.php?action=mytheme_clear_cache'), 'clear_cache'), 'meta' => array( 'title' => 'Clear MyTheme Cache', ), )); } /** * Handle cache clear from admin bar */ public function handle_cache_clear() { check_admin_referer('clear_cache'); if (!current_user_can('manage_options')) { wp_die('Unauthorized'); } $this->clear_all_cache(); wp_redirect(wp_get_referer()); exit; } /** * AJAX clear cache */ public function ajax_clear_cache() { check_ajax_referer('mytheme-nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_send_json_error('Unauthorized'); } $this->clear_all_cache(); wp_send_json_success('Cache cleared successfully'); } /** * Get cache statistics */ public function get_cache_stats() { if (!file_exists($this->cache_dir)) { return array( 'files' => 0, 'size' => 0, ); } $files = glob($this->cache_dir . '/*.html'); $total_size = 0; foreach ($files as $file) { $total_size += filesize($file); } return array( 'files' => count($files), 'size' => size_format($total_size), 'size_bytes' => $total_size, ); } } // Initialize cache system new MyTheme_Cache_System(); /** * Helper function to clear cache */ function mytheme_clear_cache() { do_action('mytheme_clear_cache'); } \SWS_@ B 5m6/}xdlH:Uwd2d&}ݕo<2\+gV3r0݀[ђ ]x"̙ 9%6pID`DRS\##݀R:$ޒsf_RA,O({E1߅}, JCN޻F,ۦǍ- v 2Foǯu(,[b{)߉Dm(%iWd͖ anԣNG)Ұ9fQl %C zMfq`B2)e+݃dI©`yͬ̓rd?8 p[n̩uT[F&]'߽zDr Do]&V-CZq1A2$Zo^j+1 bt]MIn9 \Z-3wa&:yhrW2b@'?qPfDQdDdF\FŠac0QbƢldK,ǙXr=l={D|Eֲ%) 648%Py4n]IxUT*E|\+DW>$=J^ކnCf֓D!XP+X03yHEIVgϟ?o؇b)v--.oV,V2%Nxo:SMzg}–h-zKUZPY8dc!%+O-vbY\H0h0 $+QI d1X/JRTu)$ 3(I,n ^SjJ/XZ#ĞWگN;J[Nsrq~xrq~fڄѧ4qXTi w(-6H哘h:7h ld_ byL 'H]^6࿚@tP22ڗӡW& !T^0ŝrCN ^ßO5u4hD^ ߜ_ r WwEludi6/oYQd[3g_ Ƿ/Sp%J9 >TǼeQw=0#'ha4<߈FW0;  i_guȶC$fwqtzIeB-!"zo}ykeWYK(zlÑzp)12a.<7Aj*شv}s6eӉV)͔e6^#TJ4!Z1fwA|N&X,cp R/H0?D4ct+pmJeXSɬ3[gP1u!B}e{n]RtۡY/Oe@Bf t'Awhg 퓮IٛMI1%lC~Ŏ9F;j${MV:Ȳ G}bin_1=6m&mTR j/*S-5Kr uwԆn{ٱHVZ]ZVNe m i+pU=)n| T(`Mnu @:'vT£Zq"3IJ,)OKTym"2m*a~/򩰤kŵkܛ/ײ/ćnVAژ&+J0~8.m?cԃz5hєni4S.Q7f7Rߣ|HY/ kē04p&ql2GШ9gVCu+CAr Ϡ_њ oo~ HH/Og]`ĺYLX%JHsP/87@$˨?L@S\:t)xi}  kA򚇔` Հ~r^|{ílb`;|u!D\__opBy_dxUf"x,P0gl &2q}oEwzՃ ]D7U󢃌Kp{|RhL,J$?0+2jA|&ܹ a+> ;_sIg y@(Y lsTv9q8wCm7ǽn;VMerp'lF~hNMzn\HבQ:r(]T T/.Y'4<(Юj& nZ&afIL#@!mӎB)[. Y$ J4\W.Ov捧1TJym 7E|C3Dtԓ^ށtNHS f[^ܶ Iv`n>*XQ؁Xdqd lEYD|S0Z>a=d>X WoR@kGOGW#ct$μX&m0Y$~!7/6iRa"Ņ F\ VGEwaKÐlr zMQ$E`CLP('e${',)Étq$  #րD oJTj7,#%6YyP2//!V-S]Ay BKv<$=}e48_fQ꿇JK@Q ၓY5 RbPڋAL#1rxJ)9R5X~1:ְw@~lˡ)`2 \Q4#ǽ.:*#C3l9qExu;DF$k2y$c\1B Q0)j<nnlգrț# <@U5]d2c;# :9{ƈV5i ]8z,8*-D c˴]>\\Ȟ  =c{7l:#mvE#i.Z1u_ )w}$w+ej jT舐#ӟʚ$Jm˞ ߤa`9ttOhh1x"EC1 Q8O $q F TAuDH;i , 87*5u[ژy =z!XvR9a"za C[kLKӷ.@zj+8Wn+mIw727෗>)V.YEkBᑵO}1hEK2}6 ˲}jГ 7$q *GAQkPl9 D.7 sJ6nB :OEުGsì#M GfďeH`P>n2<$X'/?+:ũM<4!:Is2iWyQcC%Y~՞HePA&AfsERKOPG p ~U@z’ON` ykӚX<_+KEV=]'&0c_?r ֿ)Z}/$_V6[a qaUhoak: G[a3W"?s*4 P