diff --git a/includes/Extensions/Batch17.php b/includes/Extensions/Batch17.php new file mode 100644 index 0000000..aedce24 --- /dev/null +++ b/includes/Extensions/Batch17.php @@ -0,0 +1,100 @@ + 'object', 'properties' => $props]; + if ($required) $schema['required'] = $required; + return ['name' => $name, 'description' => $desc, 'scope' => $scope, + 'handler' => 'AskTamMCP\\Extensions\\Batch17::' . $method, 'inputSchema' => $schema]; + }; + + $registry->register($def('cache_detect', 'Detect active caching: page-cache plugins (LiteSpeed, W3TC, WP Rocket, WP Super Cache, WP Fastest Cache), Autoptimize, and whether a persistent object cache is in use.', + [], [], 'read', 'detect')); + + $registry->register($def('cache_status', 'Cache status summary: object-cache backend (if any), detected page-cache engine, and Autoptimize state.', + [], [], 'read', 'status')); + + $registry->register($def('cache_purge_all', 'Purge all caches across every detected engine (page cache + Autoptimize + object cache). Returns which engines were purged.', + [], [], 'write', 'purgeAll')); + + $registry->register($def('cache_purge_url', 'Purge the cache for a single URL where the engine supports it (LiteSpeed, WP Rocket). Falls back to reporting unsupported engines.', + ['url' => ['type' => 'string']], ['url'], 'write', 'purgeUrl')); + } + + private static function engines(): array { + return [ + 'litespeed' => defined('LSCWP_V') || defined('LSCWP_CUR_V') || has_action('litespeed_purge_all'), + 'w3tc' => function_exists('w3tc_flush_all'), + 'wp_rocket' => function_exists('rocket_clean_domain'), + 'wp_super_cache' => function_exists('wp_cache_clear_cache'), + 'wp_fastest_cache'=> class_exists('WpFastestCache'), + 'autoptimize' => class_exists('autoptimizeCache'), + 'object_cache' => wp_using_ext_object_cache(), + ]; + } + + public static function detect(array $args): array { + $e = self::engines(); + return ['engines' => $e, 'active' => array_values(array_keys(array_filter($e)))]; + } + + public static function status(array $args): array { + global $wp_object_cache; + $backend = 'none'; + if (wp_using_ext_object_cache()) { + if (class_exists('Redis') && stripos(get_class($wp_object_cache), 'redis') !== false) $backend = 'redis'; + elseif (stripos(get_class($wp_object_cache), 'memcach') !== false) $backend = 'memcached'; + else $backend = 'external(' . get_class($wp_object_cache) . ')'; + } + $e = self::engines(); + $page = array_values(array_keys(array_filter([ + 'litespeed' => $e['litespeed'], 'w3tc' => $e['w3tc'], 'wp_rocket' => $e['wp_rocket'], + 'wp_super_cache' => $e['wp_super_cache'], 'wp_fastest_cache' => $e['wp_fastest_cache'], + ]))); + return ['object_cache' => $backend, 'page_cache_engines' => $page, 'autoptimize' => $e['autoptimize']]; + } + + public static function purgeAll(array $args): array { + $did = []; + if (defined('LSCWP_V') || defined('LSCWP_CUR_V') || has_action('litespeed_purge_all')) { do_action('litespeed_purge_all'); $did[] = 'litespeed'; } + if (function_exists('w3tc_flush_all')) { w3tc_flush_all(); $did[] = 'w3tc'; } + if (function_exists('rocket_clean_domain')) { rocket_clean_domain(); $did[] = 'wp_rocket'; } + if (function_exists('wp_cache_clear_cache')) { wp_cache_clear_cache(); $did[] = 'wp_super_cache'; } + if (class_exists('WpFastestCache')) { + global $wp_fastest_cache; + if (is_object($wp_fastest_cache) && method_exists($wp_fastest_cache, 'deleteCache')) { $wp_fastest_cache->deleteCache(true); $did[] = 'wp_fastest_cache'; } + } + if (class_exists('autoptimizeCache') && method_exists('autoptimizeCache', 'clearall')) { \autoptimizeCache::clearall(); $did[] = 'autoptimize'; } + if (wp_using_ext_object_cache()) { wp_cache_flush(); $did[] = 'object_cache'; } + return ['purged' => $did, 'count' => count($did)]; + } + + public static function purgeUrl(array $args): array { + $url = esc_url_raw((string) ($args['url'] ?? '')); + if ($url === '') throw new \RuntimeException('url required.'); + $did = []; + $unsupported = []; + if (defined('LSCWP_V') || defined('LSCWP_CUR_V') || has_action('litespeed_purge_url')) { do_action('litespeed_purge_url', $url); $did[] = 'litespeed'; } + if (function_exists('rocket_clean_files')) { rocket_clean_files([$url]); $did[] = 'wp_rocket'; } + foreach (['w3tc', 'wp_super_cache', 'wp_fastest_cache'] as $e) { + if (self::engines()[$e]) $unsupported[] = $e; + } + if (!$did && !$unsupported) throw new \RuntimeException('No URL-capable cache engine detected.'); + return ['url' => $url, 'purged' => $did, 'no_per_url_support' => $unsupported]; + } +}