get_col($wpdb->prepare( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- one-time uninstall cleanup requires direct query to find all matching transients; no caching needed. "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", '_transient_fastless_cache_%', '_transient_timeout_fastless_cache_%' )); if (is_array($fastless_cache_transients)) { foreach ($fastless_cache_transients as $fastless_cache_transient) { delete_transient(preg_replace('/^_transient_(timeout_)?/', '', $fastless_cache_transient)); } } } // Initialize WP_Filesystem for safe file operations. // // WP_Filesystem() returns a boolean and exposes the filesystem through the // $wp_filesystem global — its return value is NOT the filesystem object. $fastless_cache_filesystem = null; require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); global $wp_filesystem; if (isset($wp_filesystem) && is_object($wp_filesystem)) { $fastless_cache_filesystem = $wp_filesystem; } if (! $fastless_cache_filesystem) { // If WP_Filesystem fails, we can't safely proceed with file operations. return; } // Remove cache and settings directories. $fastless_cache_cache_dir = WP_CONTENT_DIR . '/cache/fastless-cache'; $fastless_cache_settings_dir = WP_CONTENT_DIR . '/cache/fastless-cache-settings'; if ($fastless_cache_filesystem->is_dir($fastless_cache_cache_dir)) { $fastless_cache_filesystem->delete($fastless_cache_cache_dir, true); } if ($fastless_cache_filesystem->is_dir($fastless_cache_settings_dir)) { $fastless_cache_filesystem->delete($fastless_cache_settings_dir, true); } // Remove our advanced-cache.php drop-in only if it belongs to us. $fastless_cache_advanced_cache_file = WP_CONTENT_DIR . '/advanced-cache.php'; if ($fastless_cache_filesystem->is_readable($fastless_cache_advanced_cache_file)) { $fastless_cache_contents = $fastless_cache_filesystem->get_contents($fastless_cache_advanced_cache_file); if (is_string($fastless_cache_contents) && strpos($fastless_cache_contents, 'FASTLESS_CACHE_DROPIN') !== false) { $fastless_cache_filesystem->delete($fastless_cache_advanced_cache_file); } } // Remove WP_CACHE constant from wp-config.php if we added it. if (file_exists(ABSPATH . 'wp-config.php')) { $fastless_cache_wp_config_file = ABSPATH . 'wp-config.php'; } elseif (file_exists(dirname(ABSPATH) . '/wp-config.php') && ! file_exists(dirname(ABSPATH) . '/wp-settings.php')) { $fastless_cache_wp_config_file = dirname(ABSPATH) . '/wp-config.php'; } else { $fastless_cache_wp_config_file = false; } if ($fastless_cache_wp_config_file && $fastless_cache_filesystem->is_readable($fastless_cache_wp_config_file) && $fastless_cache_filesystem->is_writable($fastless_cache_wp_config_file)) { $fastless_cache_contents = $fastless_cache_filesystem->get_contents($fastless_cache_wp_config_file); if (is_string($fastless_cache_contents)) { if (strpos($fastless_cache_contents, '/** Enables page caching for Fastless Cache. */') !== false) { $fastless_cache_new_contents = preg_replace('#/\*\* Enables page caching for Fastless Cache\. \*/\r?\n.+\r?\n.+\r?\n\}\r?\n(\r?\n)?#', '', $fastless_cache_contents); if (is_string($fastless_cache_new_contents) && ! empty($fastless_cache_new_contents)) { $fastless_cache_filesystem->put_contents($fastless_cache_wp_config_file, $fastless_cache_new_contents, FS_CHMOD_FILE); } } elseif (strpos($fastless_cache_contents, '// Added by Fastless Cache') !== false) { $fastless_cache_new_contents = preg_replace('#.+Added by Fastless Cache\r?\n#', '', $fastless_cache_contents); if (is_string($fastless_cache_new_contents) && ! empty($fastless_cache_new_contents)) { $fastless_cache_filesystem->put_contents($fastless_cache_wp_config_file, $fastless_cache_new_contents, FS_CHMOD_FILE); } } } } // Remove our .htaccess rules. $fastless_cache_htaccess_file = ABSPATH . '.htaccess'; if ($fastless_cache_filesystem->exists($fastless_cache_htaccess_file) && $fastless_cache_filesystem->is_readable($fastless_cache_htaccess_file) && $fastless_cache_filesystem->is_writable($fastless_cache_htaccess_file)) { $fastless_cache_contents = $fastless_cache_filesystem->get_contents($fastless_cache_htaccess_file); if (is_string($fastless_cache_contents)) { $fastless_cache_new_contents = preg_replace('/# BEGIN FastlessCache.*?# END FastlessCache(?:\r?\n)*/s', '', $fastless_cache_contents); if (is_string($fastless_cache_new_contents)) { $fastless_cache_filesystem->put_contents($fastless_cache_htaccess_file, $fastless_cache_new_contents, FS_CHMOD_FILE); } } }