admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wp_recache_nonce'), ]); } /** * Add admin menu page. */ public function add_admin_menu() { add_options_page( 'WP Recache', 'WP Recache', 'manage_options', 'wp-recache', [$this, 'settings_page'] ); } /** * Register settings. */ public function register_settings() { register_setting('wp_recache_settings', 'wp_recache_cache_enabled', [ 'type' => 'boolean', 'sanitize_callback' => 'rest_sanitize_boolean', 'default' => true, ]); register_setting('wp_recache_settings', 'wp_recache_separate_mobile_cache', [ 'type' => 'boolean', 'sanitize_callback' => 'rest_sanitize_boolean', 'default' => false, ]); register_setting('wp_recache_settings', 'wp_recache_exclude_urls', [ 'type' => 'array', 'sanitize_callback' => [$this, 'sanitize_exclude_urls'], 'default' => ['/cart', '/checkout', '/my-account'], ]); register_setting('wp_recache_settings', 'wp_recache_minify_css', [ 'type' => 'boolean', 'sanitize_callback' => 'rest_sanitize_boolean', 'default' => false, ]); register_setting('wp_recache_settings', 'wp_recache_minify_js', [ 'type' => 'boolean', 'sanitize_callback' => 'rest_sanitize_boolean', 'default' => false, ]); register_setting('wp_recache_settings', 'wp_recache_lazyload_images', [ 'type' => 'boolean', 'sanitize_callback' => 'rest_sanitize_boolean', 'default' => false, ]); register_setting('wp_recache_settings', 'wp_recache_preload_enabled', [ 'type' => 'boolean', 'sanitize_callback' => 'rest_sanitize_boolean', 'default' => false, ]); } /** * Sanitize exclude URLs. * * @param mixed $input Input value. * @return array Sanitized URLs. */ public function sanitize_exclude_urls($input) { if (!is_array($input)) { return []; } return array_map('sanitize_text_field', $input); } /** * Render settings page. */ public function settings_page() { if (!current_user_can('manage_options')) { return; } $active_tab = isset($_GET['tab']) ? sanitize_text_field($_GET['tab']) : 'cache'; include WP_RECACHE_INC_PATH . 'Admin/views/settings.php'; } /** * Add admin bar purge button. * * @param WP_Admin_Bar $admin_bar Admin bar instance. */ public function add_admin_bar_button($admin_bar) { if (!is_user_logged_in()) { return; } $admin_bar->add_menu([ 'id' => 'wp-recache', 'title' => 'WP Recache', 'href' => admin_url('options-general.php?page=wp-recache'), ]); $admin_bar->add_menu([ 'id' => 'wp-recache-purge-all', 'parent' => 'wp-recache', 'title' => 'Purge All Cache', 'href' => '#', 'meta' => [ 'onclick' => 'wpRecachePurgeAll();', ], ]); } /** * AJAX handler for purging all cache. */ public function ajax_purge_all() { check_ajax_referer('wp_recache_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_send_json_error('Unauthorized'); } wp_recache_delete_all_cache(); wp_send_json_success('Cache purged successfully'); } /** * AJAX handler for purging URL cache. */ public function ajax_purge_url() { check_ajax_referer('wp_recache_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_send_json_error('Unauthorized'); } $url = isset($_POST['url']) ? esc_url_raw($_POST['url']) : ''; if (empty($url)) { wp_send_json_error('No URL provided'); } wp_recache_delete_cache($url); wp_send_json_success('URL cache purged successfully'); } /** * Display admin notices. */ public function admin_notices() { $screen = get_current_screen(); if (!$screen || $screen->id !== 'settings_page_wp-recache') { return; } if (isset($_GET['settings-updated'])) { echo '

Settings saved.

'; } } /** * Get cache statistics. * * @return array Cache statistics. */ public static function get_cache_stats() { $cache_path = WP_RECACHE_CACHE_PATH; if (!is_dir($cache_path)) { return [ 'files' => 0, 'size' => 0, 'size_formatted' => '0 B', ]; } $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($cache_path, RecursiveDirectoryIterator::SKIP_DOTS) ); $count = 0; $size = 0; foreach ($files as $file) { if ($file->isFile()) { $count++; $size += $file->getSize(); } } return [ 'files' => $count, 'size' => $size, 'size_formatted' => size_format($size), ]; } }