Initial commit: TigerStyle Dash v1.0.0

WordPress Performance at Lightning Speed.

Advanced optimization with Brotli compression, smart caching, and
cat-like speed bursts that dash past the competition.

- Brotli and Gzip compression with configurable levels
- WP Rocket-inspired smart caching
- Bandwidth monitoring
- Automatic optimization
- Performance status dashboard

Includes build.sh and .distignore for WordPress-installable release ZIPs.
This commit is contained in:
Ryan Malloy 2026-05-27 14:32:00 -06:00
commit 31ce71dac0
12 changed files with 3909 additions and 0 deletions

14
.distignore Normal file
View File

@ -0,0 +1,14 @@
# Files excluded from the release ZIP.
# Follows the wp-cli dist-archive convention (one pattern per line).
# Dev artifacts
.git
.gitignore
.distignore
node_modules
*.log
# Operator-private context (never publish)
CLAUDE.md
.env
.env.local

18
.gitignore vendored Normal file
View File

@ -0,0 +1,18 @@
# Build artifacts
build/
dist/
*.zip
# Editor / OS
.DS_Store
*.swp
*~
.vscode/
.idea/
# Logs
*.log
# Environment
.env
.env.local

225
README.md Normal file
View File

@ -0,0 +1,225 @@
# ⚡ TigerStyle Dash
**WordPress Performance at Lightning Speed**
*Dash past the competition with advanced Brotli compression, smart caching, and cat-like reflexes that make your website load faster than you can blink.*
---
## 🏃‍♀️ Why TigerStyle Dash?
**Because your website should be as fast as a cat's reflexes!**
TigerStyle Dash delivers **enterprise-grade performance optimization** with the simplicity your development workflow deserves. No complex configurations, no bloated interfaces - just lightning-fast results.
### ⚡ **Key Features**
- **🚀 Advanced Compression**: Brotli + Gzip fallbacks with automatic method selection
- **🧠 Smart Caching**: Intelligent cache warming and purging
- **📊 Performance Analytics**: Real-time metrics and optimization scoring
- **🎯 Core Web Vitals**: Optimize for Google's ranking factors
- **💾 Massive Savings**: Reduce file sizes by 60-80%
- **🔧 WP Rocket-Inspired**: Modern compression techniques, simplified
---
## 📈 **Performance Impact**
```
Before TigerStyle Dash:
📄 HTML: 125KB → ⚡ After: 31KB (75% reduction)
🎨 CSS: 89KB → ⚡ After: 22KB (75% reduction)
📜 JS: 156KB → ⚡ After: 47KB (70% reduction)
🎯 Core Web Vitals: Significant LCP and FCP improvements
💰 Bandwidth Costs: Reduced by up to 80%
🏆 Google Rankings: Better performance = higher SEO scores
```
---
## 🚀 **Quick Start**
### Installation
1. **Copy plugin to WordPress**:
```bash
cp -r src/tigerstyle-dash wp-content/plugins/
```
2. **Activate in WordPress Admin**:
- Go to `Plugins → Installed Plugins`
- Find "TigerStyle Dash"
- Click **Activate**
3. **Configure settings**:
- Navigate to `Dash Performance` in admin menu
- Enable compression and smart caching
- **Done!** Your site is now lightning-fast ⚡
### Basic Configuration
```php
// Default settings (recommended for most sites)
Compression: Auto (Brotli + Gzip fallback)
Level: 6 (optimal balance)
Cache: Enabled
TTL: 3600 seconds (1 hour)
```
---
## 🛠️ **Advanced Configuration**
### Compression Methods
| Method | Best For | Compression Ratio | Speed |
|--------|----------|-------------------|-------|
| **Auto** ✅ | Most sites | 70-75% | Fast |
| **Brotli** | Modern browsers | 75-80% | Fast |
| **Gzip** | Legacy support | 65-70% | Fastest |
### Cache Strategy
- **Smart Warming**: Pre-compresses popular content
- **Intelligent Purging**: Clears cache on content updates
- **Analytics Integration**: Tracks performance improvements
---
## 🔧 **Developer API**
### Programmatic Access
```php
// Get Dash instance
$dash = tigerstyle_dash();
// Manual compression
$result = TigerStyle_Dash_Compression::compress($content, 'auto', 6);
// Cache operations
$cache = $dash->get_cache();
$cache->store('key', $content, 'brotli');
// Performance analytics
$analytics = $dash->get_analytics();
$score = $analytics->analyze_site_performance();
```
### Hooks & Filters
```php
// Customize compression settings
add_filter('tigerstyle_dash_compression_level', function($level) {
return 8; // Higher compression
});
// Skip compression for specific content
add_filter('tigerstyle_dash_should_compress', function($should_compress, $content) {
// Your custom logic
return $should_compress;
}, 10, 2);
```
---
## 📊 **Performance Monitoring**
### Built-in Analytics Dashboard
- **Real-time Statistics**: Files compressed, bandwidth saved
- **Performance Score**: A+ to F grading system
- **Optimization Recommendations**: Actionable improvements
- **Core Web Vitals Tracking**: Monitor Google ranking factors
### Integration with Popular Tools
- **Google PageSpeed Insights**: Improved scores
- **GTmetrix**: Better performance grades
- **WebPageTest**: Faster load times
- **Search Console**: Core Web Vitals reporting
---
## 🎯 **Optimization Recommendations**
### Automatic Analysis
TigerStyle Dash analyzes your site and provides **prioritized recommendations**:
- **High Priority**: Enable compression, activate caching
- **Medium Priority**: Optimize compression method
- **Low Priority**: Fine-tune compression levels
### Performance Scoring
```
A+ (90-100%): Lightning fast! 🏆
A (80-89%): Excellent performance ⚡
B (70-79%): Good, room for improvement 👍
C (60-69%): Average, needs optimization ⚠️
D (50-59%): Slow, requires attention 🐌
F (0-49%): Critical performance issues 🚨
```
---
## 🐾 **TigerStyle Ecosystem**
TigerStyle Dash is part of the **TigerStyle WordPress Plugin Suite**:
- **🔍 TigerStyle Heat**: Comprehensive SEO optimization
- **🔒 TigerStyle Life9**: Secure backup & restore
- **⚡ TigerStyle Dash**: Performance optimization (this plugin)
- **🎯 TigerStyle Pounce**: *Coming soon - Security monitoring*
*Each plugin excels in its specialized domain while working seamlessly together.*
---
## 🛟 **Support & Development**
### System Requirements
- **WordPress**: 5.0+
- **PHP**: 7.4+
- **Extensions**: `zlib`, `json` (standard in most hosting)
- **Optional**: `brotli` extension for maximum compression
### Browser Compatibility
- **Brotli**: Chrome 50+, Firefox 44+, Safari 11+
- **Gzip**: Universal support (automatic fallback)
- **Smart Detection**: Automatically serves best format per browser
### Performance Tips
1. **Level 6 compression**: Best balance of speed vs. size
2. **Auto method**: Maximizes browser compatibility
3. **1-hour cache TTL**: Optimal for most content update frequencies
4. **Monitor analytics**: Use built-in dashboard for optimization
---
## 🚀 **Roadmap**
### Upcoming Features
- **Image Optimization**: WebP conversion, lazy loading
- **CDN Integration**: Automatic CDN setup and management
- **Database Optimization**: Query caching, table cleanup
- **Critical CSS**: Above-the-fold optimization
- **HTTP/3 Support**: Latest protocol optimizations
---
## 💡 **Fun Facts**
- **Cat Reflexes**: Cats react in 20-70ms - that's our target for cache response times!
- **Speed Inspiration**: Just like cats can dash at 30mph in short bursts, your site gets speed bursts when needed
- **"Dash past the competition"**: More than a tagline - it's a performance promise
---
*Built with 🐾 by the TigerStyle team. Making WordPress faster, one dash at a time.*

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

49
build.sh Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env bash
# Build a clean WordPress-installable release ZIP for this plugin.
# Reads .distignore to decide what gets excluded.
# Usage: ./build.sh [version-override]
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PLUGIN_SLUG="$(basename "$SCRIPT_DIR")"
MAIN_FILE="$SCRIPT_DIR/${PLUGIN_SLUG}.php"
OUT_DIR="$SCRIPT_DIR/build"
if [[ ! -f "$MAIN_FILE" ]]; then
echo "ERROR: main plugin file $MAIN_FILE not found" >&2
exit 1
fi
VERSION="${1:-$(grep -E "^\s*\*\s*Version:" "$MAIN_FILE" | head -1 | awk '{print $NF}')}"
if [[ -z "$VERSION" ]]; then
echo "ERROR: could not determine version" >&2
exit 1
fi
ZIP_NAME="${PLUGIN_SLUG}-${VERSION}.zip"
OUT_ZIP="$OUT_DIR/$ZIP_NAME"
STAGE="$(mktemp -d -t "${PLUGIN_SLUG}-build-XXXXXX")"
trap "rm -rf '$STAGE'" EXIT
echo "Building $PLUGIN_SLUG v$VERSION$OUT_ZIP"
EXCLUDE_ARGS=(--exclude='.git')
if [[ -f "$SCRIPT_DIR/.distignore" ]]; then
while IFS= read -r line; do
[[ "$line" =~ ^[[:space:]]*# ]] && continue
[[ -z "${line// }" ]] && continue
EXCLUDE_ARGS+=(--exclude="$line")
done < "$SCRIPT_DIR/.distignore"
fi
mkdir -p "$STAGE/$PLUGIN_SLUG"
rsync -a "${EXCLUDE_ARGS[@]}" "$SCRIPT_DIR/" "$STAGE/$PLUGIN_SLUG/"
mkdir -p "$OUT_DIR"
rm -f "$OUT_ZIP"
( cd "$STAGE" && zip -rq "$OUT_ZIP" "$PLUGIN_SLUG" )
SIZE=$(numfmt --to=iec --suffix=B "$(stat -c '%s' "$OUT_ZIP")")
COUNT=$(unzip -Z1 "$OUT_ZIP" | wc -l)
echo "✓ Built: $ZIP_NAME ($SIZE, $COUNT files)"

1291
includes/class-admin.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,282 @@
<?php
/**
* Analytics Engine for TigerStyle Dash
* Performance metrics and optimization analysis
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
class TigerStyle_Dash_Analytics {
/**
* Plugin instance
*
* @var TigerStyle_Dash
*/
private $plugin;
/**
* Constructor
*
* @param TigerStyle_Dash $plugin Main plugin instance
*/
public function __construct($plugin) {
$this->plugin = $plugin;
}
/**
* Analyze site performance
*/
public function analyze_site_performance() {
$analysis = array(
'timestamp' => time(),
'site_url' => home_url(),
'cache_stats' => $this->get_cache_analysis(),
'compression_opportunities' => $this->find_compression_opportunities(),
'performance_score' => $this->calculate_performance_score(),
'recommendations' => $this->get_recommendations()
);
return $analysis;
}
/**
* Get cache analysis
*/
private function get_cache_analysis() {
$cache = $this->plugin->get_cache();
$stats = $cache->get_cache_stats();
return array(
'total_cached_files' => $stats['total_files'],
'total_cache_size' => $this->format_bytes($stats['total_size']),
'cache_directory' => $stats['cache_dir'],
'cache_enabled' => get_option('tigerstyle_dash_cache_enabled', true)
);
}
/**
* Find compression opportunities
*/
private function find_compression_opportunities() {
// Analyze common WordPress assets that could benefit from compression
$opportunities = array();
// Check theme CSS files
$theme_dir = get_template_directory();
$css_files = glob($theme_dir . '/*.css');
$css_files = array_merge($css_files, glob($theme_dir . '/css/*.css'));
foreach ($css_files as $file) {
$size = filesize($file);
if ($size > 1024) { // Only analyze files larger than 1KB
$opportunities[] = array(
'file' => basename($file),
'type' => 'CSS',
'size' => $size,
'potential_savings' => $size * 0.7, // Estimate 70% compression
'recommendation' => 'Enable CSS compression and minification'
);
}
}
// Check JavaScript files
$js_files = glob($theme_dir . '/*.js');
$js_files = array_merge($js_files, glob($theme_dir . '/js/*.js'));
foreach ($js_files as $file) {
$size = filesize($file);
if ($size > 1024) {
$opportunities[] = array(
'file' => basename($file),
'type' => 'JavaScript',
'size' => $size,
'potential_savings' => $size * 0.6, // Estimate 60% compression
'recommendation' => 'Enable JavaScript compression and minification'
);
}
}
return $opportunities;
}
/**
* Calculate performance score
*/
private function calculate_performance_score() {
$score = 0;
$max_score = 100;
// Compression enabled (30 points)
if (get_option('tigerstyle_dash_compression_enabled', false)) {
$score += 30;
}
// Cache enabled (25 points)
if (get_option('tigerstyle_dash_cache_enabled', false)) {
$score += 25;
}
// Optimal compression method (20 points)
$method = get_option('tigerstyle_dash_compression_method', 'auto');
if ($method === 'auto' || $method === 'brotli') {
$score += 20;
} elseif ($method === 'gzip') {
$score += 15;
}
// Reasonable compression level (15 points)
$level = get_option('tigerstyle_dash_compression_level', 6);
if ($level >= 5 && $level <= 7) {
$score += 15;
} elseif ($level >= 3 && $level <= 9) {
$score += 10;
}
// Cache TTL optimization (10 points)
$ttl = get_option('tigerstyle_dash_cache_ttl', 3600);
if ($ttl >= 1800 && $ttl <= 7200) { // 30 min to 2 hours
$score += 10;
} elseif ($ttl >= 300 && $ttl <= 86400) { // 5 min to 24 hours
$score += 5;
}
return array(
'score' => $score,
'max_score' => $max_score,
'percentage' => round(($score / $max_score) * 100),
'grade' => $this->get_performance_grade($score, $max_score)
);
}
/**
* Get performance grade
*/
private function get_performance_grade($score, $max_score) {
$percentage = ($score / $max_score) * 100;
if ($percentage >= 90) return 'A+';
if ($percentage >= 80) return 'A';
if ($percentage >= 70) return 'B';
if ($percentage >= 60) return 'C';
if ($percentage >= 50) return 'D';
return 'F';
}
/**
* Get optimization recommendations
*/
private function get_recommendations() {
$recommendations = array();
if (!get_option('tigerstyle_dash_compression_enabled', false)) {
$recommendations[] = array(
'priority' => 'high',
'title' => 'Enable Compression',
'description' => 'Activate TigerStyle Dash compression to reduce file sizes by 60-80%',
'action' => 'Enable compression in Dash settings'
);
}
if (!get_option('tigerstyle_dash_cache_enabled', false)) {
$recommendations[] = array(
'priority' => 'high',
'title' => 'Enable Smart Caching',
'description' => 'Turn on intelligent cache warming to pre-compress popular content',
'action' => 'Enable cache in Dash settings'
);
}
$method = get_option('tigerstyle_dash_compression_method', 'auto');
if ($method === 'gzip') {
$recommendations[] = array(
'priority' => 'medium',
'title' => 'Upgrade to Brotli Compression',
'description' => 'Switch to Auto mode for 15-25% better compression than Gzip',
'action' => 'Change compression method to Auto in settings'
);
}
$level = get_option('tigerstyle_dash_compression_level', 6);
if ($level < 5) {
$recommendations[] = array(
'priority' => 'low',
'title' => 'Optimize Compression Level',
'description' => 'Increase compression level to 6 for better size reduction',
'action' => 'Adjust compression level in settings'
);
} elseif ($level > 7) {
$recommendations[] = array(
'priority' => 'low',
'title' => 'Balance Compression vs Speed',
'description' => 'Consider reducing compression level to 6 for faster processing',
'action' => 'Adjust compression level in settings'
);
}
return $recommendations;
}
/**
* Format bytes into human readable format
*/
private function format_bytes($bytes, $precision = 2) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) {
$bytes /= 1024;
}
return round($bytes, $precision) . ' ' . $units[$i];
}
/**
* Track compression statistics
*/
public function track_compression($original_size, $compressed_size, $method) {
// Update running statistics
$files_compressed = get_option('tigerstyle_dash_files_compressed', 0) + 1;
$bandwidth_saved = get_option('tigerstyle_dash_bandwidth_saved', 0) + ($original_size - $compressed_size);
// Calculate running average compression ratio
$total_original = get_option('tigerstyle_dash_total_original_size', 0) + $original_size;
$total_compressed = get_option('tigerstyle_dash_total_compressed_size', 0) + $compressed_size;
$avg_ratio = $total_original > 0 ? round((($total_original - $total_compressed) / $total_original) * 100, 1) : 0;
// Update options
update_option('tigerstyle_dash_files_compressed', $files_compressed);
update_option('tigerstyle_dash_bandwidth_saved', $bandwidth_saved);
update_option('tigerstyle_dash_total_original_size', $total_original);
update_option('tigerstyle_dash_total_compressed_size', $total_compressed);
update_option('tigerstyle_dash_avg_compression_ratio', $avg_ratio);
// Log compression event for analysis
$this->log_compression_event($original_size, $compressed_size, $method);
}
/**
* Log compression event
*/
private function log_compression_event($original_size, $compressed_size, $method) {
// Simple logging - in production, this might use a more sophisticated system
$log_entry = array(
'timestamp' => time(),
'original_size' => $original_size,
'compressed_size' => $compressed_size,
'method' => $method,
'ratio' => round((($original_size - $compressed_size) / $original_size) * 100, 1)
);
// Store in transient (simple approach)
$recent_compressions = get_transient('tigerstyle_dash_recent_compressions') ?: array();
$recent_compressions[] = $log_entry;
// Keep only last 100 entries
$recent_compressions = array_slice($recent_compressions, -100);
set_transient('tigerstyle_dash_recent_compressions', $recent_compressions, WEEK_IN_SECONDS);
}
}

134
includes/class-cache.php Normal file
View File

@ -0,0 +1,134 @@
<?php
/**
* Cache Manager for TigerStyle Dash
* Lightning-fast cache operations
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
class TigerStyle_Dash_Cache {
/**
* Cache directory
*/
private $cache_dir;
/**
* Constructor
*/
public function __construct() {
$upload_dir = wp_upload_dir();
$this->cache_dir = $upload_dir['basedir'] . '/tigerstyle-dash-cache/';
// Ensure cache directory exists
if (!file_exists($this->cache_dir)) {
wp_mkdir_p($this->cache_dir);
}
}
/**
* Get cache key for URL
*/
public function get_cache_key($url) {
return md5($url);
}
/**
* Store compressed content in cache
*/
public function store($key, $content, $compression_method, $metadata = array()) {
$cache_file = $this->cache_dir . $key . '.' . $compression_method;
$meta_file = $this->cache_dir . $key . '.meta';
// Store compressed content
file_put_contents($cache_file, $content);
// Store metadata
$metadata['created'] = time();
$metadata['compression_method'] = $compression_method;
$metadata['size'] = strlen($content);
file_put_contents($meta_file, json_encode($metadata));
return true;
}
/**
* Retrieve cached content
*/
public function get($key, $compression_method) {
$cache_file = $this->cache_dir . $key . '.' . $compression_method;
$meta_file = $this->cache_dir . $key . '.meta';
if (!file_exists($cache_file) || !file_exists($meta_file)) {
return false;
}
$metadata = json_decode(file_get_contents($meta_file), true);
if (!$metadata) {
return false;
}
// Check if cache is expired
$ttl = get_option('tigerstyle_dash_cache_ttl', 3600);
if (time() - $metadata['created'] > $ttl) {
$this->delete($key);
return false;
}
return array(
'content' => file_get_contents($cache_file),
'metadata' => $metadata
);
}
/**
* Delete cached content
*/
public function delete($key) {
$files = glob($this->cache_dir . $key . '.*');
foreach ($files as $file) {
if (is_file($file)) {
unlink($file);
}
}
return true;
}
/**
* Clear all cache
*/
public function clear_all_cache() {
$files = glob($this->cache_dir . '*');
foreach ($files as $file) {
if (is_file($file)) {
unlink($file);
}
}
return true;
}
/**
* Get cache statistics
*/
public function get_cache_stats() {
$files = glob($this->cache_dir . '*.meta');
$total_files = count($files);
$total_size = 0;
foreach ($files as $file) {
$metadata = json_decode(file_get_contents($file), true);
if ($metadata && isset($metadata['size'])) {
$total_size += $metadata['size'];
}
}
return array(
'total_files' => $total_files,
'total_size' => $total_size,
'cache_dir' => $this->cache_dir
);
}
}

372
includes/class-cdn.php Normal file
View File

@ -0,0 +1,372 @@
<?php
/**
* CDN Engine for TigerStyle Dash
* Global content delivery at cat-like speed with Vultr CDN integration
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
class TigerStyle_Dash_CDN {
private static $instance = null;
/**
* CDN settings from database
* @var array
*/
private static $settings;
public static function instance() {
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
$this->init_cdn();
}
/**
* Initialize CDN functionality
*/
public function init_cdn() {
// Load CDN settings
self::$settings = $this->get_cdn_settings();
// Admin hooks
if (is_admin()) {
add_action('admin_post_update_cdn_settings', array($this, 'handle_cdn_form_submission'));
add_action('wp_ajax_tigerstyle_test_cdn', array($this, 'ajax_test_cdn_connection'));
add_action('wp_ajax_tigerstyle_purge_cdn', array($this, 'ajax_purge_cdn_cache'));
}
// Only start URL rewriting if CDN is enabled and configured
if ($this->is_cdn_enabled() && !empty(self::$settings['cdn_url'])) {
$this->start_url_rewriting();
}
}
/**
* Start CDN URL rewriting
* Integrates with existing TigerStyle Dash performance buffer
*/
private function start_url_rewriting() {
// Hook into the performance engine's output buffer
add_filter('tigerstyle_dash_output_buffer', array($this, 'rewrite_urls_for_cdn'), 20);
// Also handle direct output if performance buffer isn't active
if (!get_option('tigerstyle_dash_compression_enabled', false)) {
add_action('template_redirect', array($this, 'start_cdn_buffer'), 5);
}
}
/**
* Start output buffering for CDN URL rewriting
*/
public function start_cdn_buffer() {
if ($this->should_process_request()) {
ob_start(array($this, 'process_cdn_output'));
}
}
/**
* Process output for CDN URL rewriting
* @param string $content
* @return string
*/
public function process_cdn_output($content) {
return $this->rewrite_urls_for_cdn($content);
}
/**
* Rewrite URLs to point to CDN endpoints
* @param string $content
* @return string
*/
public function rewrite_urls_for_cdn($content) {
if (empty($content) || empty(self::$settings['cdn_url'])) {
return $content;
}
// Get site URL without protocol for flexible matching
$site_url = preg_replace('#^https?://#', '', home_url());
$cdn_url = rtrim(self::$settings['cdn_url'], '/');
// File extensions to rewrite
$extensions = $this->get_cdn_file_extensions();
$extensions_pattern = implode('|', array_map('preg_quote', $extensions));
// Build regex pattern for URL rewriting
$pattern = '#(?:https?:)?//(?:www\.)?' . preg_quote($site_url, '#') .
'(/[^"\'>\s]*\.(?:' . $extensions_pattern . '))(?:\?[^"\'>\s]*)?#i';
// Rewrite URLs to CDN
$content = preg_replace_callback($pattern, function($matches) use ($cdn_url) {
return $cdn_url . $matches[1];
}, $content);
return $content;
}
/**
* Get file extensions that should be served via CDN
* @return array
*/
private function get_cdn_file_extensions() {
$default_extensions = array(
'css', 'js', 'jpg', 'jpeg', 'png', 'gif', 'webp', 'avif',
'svg', 'ico', 'woff', 'woff2', 'ttf', 'eot', 'mp4', 'webm',
'pdf', 'zip', 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'
);
$custom_extensions = isset(self::$settings['file_extensions'])
? explode(',', str_replace(' ', '', self::$settings['file_extensions']))
: array();
return array_unique(array_merge($default_extensions, $custom_extensions));
}
/**
* Check if CDN should process this request
* @return bool
*/
private function should_process_request() {
// Skip admin pages
if (is_admin()) {
return false;
}
// Skip if user is logged in and preview mode is disabled
if (is_user_logged_in() && !self::$settings['enable_for_logged_in']) {
return false;
}
// Skip REST API requests
if (defined('REST_REQUEST') && REST_REQUEST) {
return false;
}
return true;
}
/**
* Get CDN settings with defaults
* @return array
*/
public function get_cdn_settings() {
$defaults = array(
'enabled' => false,
'provider' => 'vultr',
'cdn_url' => '',
'vultr_api_key' => '',
'file_extensions' => '',
'enable_for_logged_in' => false,
'purge_on_update' => true,
'test_mode' => false
);
$saved_settings = get_option('tigerstyle_dash_cdn_settings', array());
return wp_parse_args($saved_settings, $defaults);
}
/**
* Check if CDN is enabled
* @return bool
*/
public function is_cdn_enabled() {
return !empty(self::$settings['enabled']) && self::$settings['enabled'];
}
/**
* Handle CDN settings form submission
*/
public function handle_cdn_form_submission() {
// Verify nonce
if (!wp_verify_nonce($_POST['tigerstyle_dash_cdn_nonce'], 'tigerstyle_dash_cdn_settings')) {
wp_die(__('Security check failed.', 'tigerstyle-dash'));
}
// Check user permissions
if (!current_user_can('manage_options')) {
wp_die(__('You do not have permission to access this page.', 'tigerstyle-dash'));
}
// Sanitize and save settings
$settings = array(
'enabled' => isset($_POST['cdn_enabled']) ? (bool)$_POST['cdn_enabled'] : false,
'provider' => sanitize_text_field($_POST['cdn_provider'] ?? 'vultr'),
'cdn_url' => esc_url_raw($_POST['cdn_url'] ?? ''),
'vultr_api_key' => sanitize_text_field($_POST['vultr_api_key'] ?? ''),
'file_extensions' => sanitize_text_field($_POST['file_extensions'] ?? ''),
'enable_for_logged_in' => isset($_POST['enable_for_logged_in']) ? (bool)$_POST['enable_for_logged_in'] : false,
'purge_on_update' => isset($_POST['purge_on_update']) ? (bool)$_POST['purge_on_update'] : true,
'test_mode' => isset($_POST['test_mode']) ? (bool)$_POST['test_mode'] : false
);
update_option('tigerstyle_dash_cdn_settings', $settings);
// Update instance settings
self::$settings = $settings;
// Redirect back with success message
$redirect_url = add_query_arg(
array('page' => 'tigerstyle-dash', 'tab' => 'cdn', 'updated' => '1'),
admin_url('admin.php')
);
wp_redirect($redirect_url);
exit;
}
/**
* AJAX handler for testing CDN connection
*/
public function ajax_test_cdn_connection() {
// Verify nonce
if (!wp_verify_nonce($_POST['nonce'], 'tigerstyle_dash_ajax')) {
wp_die('Security check failed');
}
$cdn_url = sanitize_text_field($_POST['cdn_url'] ?? '');
if (empty($cdn_url)) {
wp_send_json_error('CDN URL is required');
}
// Test CDN by trying to fetch a small asset
$test_url = rtrim($cdn_url, '/') . '/wp-includes/js/jquery/jquery.min.js';
$response = wp_remote_get($test_url, array('timeout' => 10));
if (is_wp_error($response)) {
wp_send_json_error('CDN test failed: ' . $response->get_error_message());
}
$response_code = wp_remote_retrieve_response_code($response);
if ($response_code === 200) {
wp_send_json_success('CDN connection successful! ⚡');
} else {
wp_send_json_error('CDN returned status code: ' . $response_code);
}
}
/**
* AJAX handler for purging CDN cache
*/
public function ajax_purge_cdn_cache() {
// Verify nonce
if (!wp_verify_nonce($_POST['nonce'], 'tigerstyle_dash_ajax')) {
wp_die('Security check failed');
}
$result = $this->purge_cdn_cache();
if ($result) {
wp_send_json_success('CDN cache purged successfully! 🔥');
} else {
wp_send_json_error('Failed to purge CDN cache');
}
}
/**
* Purge CDN cache (provider-specific implementation)
* @return bool
*/
public function purge_cdn_cache() {
if (empty(self::$settings['provider']) || empty(self::$settings['vultr_api_key'])) {
return false;
}
switch (self::$settings['provider']) {
case 'vultr':
return $this->purge_vultr_cache();
default:
// For custom CDN providers, we can't purge programmatically
return true;
}
}
/**
* Purge Vultr CDN cache via API
* @return bool
*/
private function purge_vultr_cache() {
$api_key = self::$settings['vultr_api_key'];
if (empty($api_key)) {
return false;
}
// Vultr CDN API endpoint for cache purging
$api_url = 'https://api.vultr.com/v2/cdn/purge';
$response = wp_remote_post($api_url, array(
'headers' => array(
'Authorization' => 'Bearer ' . $api_key,
'Content-Type' => 'application/json'
),
'body' => json_encode(array(
'files' => array('*') // Purge all files
)),
'timeout' => 30
));
if (is_wp_error($response)) {
return false;
}
$response_code = wp_remote_retrieve_response_code($response);
return $response_code >= 200 && $response_code < 300;
}
/**
* Get CDN analytics data
* @return array
*/
public function get_cdn_analytics() {
$analytics = array(
'enabled' => $this->is_cdn_enabled(),
'provider' => self::$settings['provider'] ?? 'none',
'cdn_url' => self::$settings['cdn_url'] ?? '',
'files_served' => 0,
'bandwidth_saved' => 0,
'performance_improvement' => 0
);
// Get basic metrics (enhanced in future versions)
if ($this->is_cdn_enabled()) {
$analytics['files_served'] = get_option('tigerstyle_dash_cdn_files_served', 0);
$analytics['bandwidth_saved'] = get_option('tigerstyle_dash_cdn_bandwidth_saved', 0);
}
return $analytics;
}
/**
* Get Vultr referral information
* @return array
*/
public function get_vultr_info() {
return array(
'referral_url' => 'https://supported.systems/vultr',
'description' => 'High-performance global CDN with lightning-fast edge locations worldwide',
'benefits' => array(
'⚡ Global edge network for cat-like speed',
'💰 Pay-as-you-go pricing with no minimums',
'🌍 24 worldwide locations for optimal performance',
'📊 Real-time analytics and monitoring',
'🔧 Simple API integration with TigerStyle Dash',
'💎 Enterprise-grade performance at affordable prices'
),
'setup_steps' => array(
'1. Sign up for Vultr via our referral link',
'2. Create a new CDN service in your Vultr dashboard',
'3. Copy your CDN URL and API key',
'4. Enter the details in TigerStyle Dash settings',
'5. Test the connection and start dashing!'
)
);
}
}

View File

@ -0,0 +1,170 @@
<?php
/**
* Compression Engine for TigerStyle Dash
* Advanced Brotli + Gzip compression with cat-like speed
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
class TigerStyle_Dash_Compression {
/**
* Compress content using the best available method
*/
public static function compress($content, $method = 'auto', $level = 6) {
$accept_encoding = $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '';
$original_size = strlen($content);
// Determine compression method
if ($method === 'auto') {
if (strpos($accept_encoding, 'br') !== false && function_exists('brotli_compress')) {
$method = 'brotli';
} elseif (strpos($accept_encoding, 'gzip') !== false && function_exists('gzencode')) {
$method = 'gzip';
} else {
return array(
'content' => $content,
'method' => 'none',
'original_size' => $original_size,
'compressed_size' => $original_size,
'ratio' => 0
);
}
}
// Compress based on method
switch ($method) {
case 'brotli':
if (function_exists('brotli_compress')) {
$compressed = brotli_compress($content, $level);
if ($compressed !== false) {
return array(
'content' => $compressed,
'method' => 'brotli',
'original_size' => $original_size,
'compressed_size' => strlen($compressed),
'ratio' => round((($original_size - strlen($compressed)) / $original_size) * 100, 1),
'encoding' => 'br'
);
}
}
// Fall through to gzip if brotli fails
case 'gzip':
if (function_exists('gzencode')) {
$compressed = gzencode($content, $level);
if ($compressed !== false) {
return array(
'content' => $compressed,
'method' => 'gzip',
'original_size' => $original_size,
'compressed_size' => strlen($compressed),
'ratio' => round((($original_size - strlen($compressed)) / $original_size) * 100, 1),
'encoding' => 'gzip'
);
}
}
break;
default:
// No compression
break;
}
// Return uncompressed if all methods fail
return array(
'content' => $content,
'method' => 'none',
'original_size' => $original_size,
'compressed_size' => $original_size,
'ratio' => 0
);
}
/**
* Check if content is suitable for compression
*/
public static function should_compress($content, $content_type = '') {
// Don't compress if content is too small
if (strlen($content) < 1000) {
return false;
}
// Don't compress if already compressed
$compressed_types = array('image/', 'video/', 'audio/', 'application/zip', 'application/gzip');
foreach ($compressed_types as $type) {
if (strpos($content_type, $type) !== false) {
return false;
}
}
// Don't compress binary content
if (!mb_check_encoding($content, 'UTF-8') && !self::is_text_content($content)) {
return false;
}
return true;
}
/**
* Check if content appears to be text-based
*/
private static function is_text_content($content) {
// Simple heuristic: if most bytes are printable ASCII or common UTF-8, it's probably text
$text_chars = 0;
$total_chars = min(strlen($content), 1000); // Sample first 1000 bytes
for ($i = 0; $i < $total_chars; $i++) {
$byte = ord($content[$i]);
if (($byte >= 32 && $byte <= 126) || $byte == 9 || $byte == 10 || $byte == 13) {
$text_chars++;
}
}
return ($text_chars / $total_chars) > 0.7; // 70% text characters
}
/**
* Get compression method capabilities
*/
public static function get_capabilities() {
return array(
'brotli' => function_exists('brotli_compress'),
'gzip' => function_exists('gzencode'),
'auto' => function_exists('brotli_compress') || function_exists('gzencode')
);
}
/**
* Get recommended compression level for method
*/
public static function get_recommended_level($method) {
switch ($method) {
case 'brotli':
return 6; // Good balance for Brotli
case 'gzip':
return 6; // Standard for Gzip
case 'auto':
return 6; // Safe default
default:
return 6;
}
}
/**
* Estimate compression savings
*/
public static function estimate_savings($content_size, $method = 'auto') {
$estimates = array(
'brotli' => 0.75, // 75% compression typically
'gzip' => 0.65, // 65% compression typically
'auto' => 0.70 // Average of both
);
$ratio = $estimates[$method] ?? $estimates['auto'];
return round($content_size * $ratio);
}
}

View File

@ -0,0 +1,818 @@
<?php
/**
* Performance Engine for TigerStyle Dash
* Lightning-fast compression system with Brotli + Gzip fallbacks
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
class TigerStyle_Dash_Performance {
private static $instance = null;
public static function instance() {
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
$this->init_compression();
}
/**
* Initialize compression hooks and filters
*/
public function init_compression() {
// Admin hooks (always register to handle form submissions)
if (is_admin()) {
add_action('admin_post_update_compression_settings', array($this, 'handle_form_submission'));
add_action('wp_ajax_tigerstyle_analyze_cache', array($this, 'ajax_analyze_cache'));
}
if (!get_option('tigerstyle_dash_compression_enabled', false)) {
return;
}
// Hook into output buffering for automatic compression
add_action('template_redirect', array($this, 'start_compression_buffer'), 1);
// Hook into post updates to clear relevant cache
add_action('save_post', array($this, 'clear_post_compression_cache'));
add_action('wp_update_nav_menu', array($this, 'clear_compression_cache'));
add_action('switch_theme', array($this, 'clear_compression_cache'));
}
/**
* Start output buffering for compression
*/
public function start_compression_buffer() {
// Only compress HTML pages, not admin or AJAX requests
if (is_admin() || wp_doing_ajax() || wp_doing_cron()) {
return;
}
// Check if content type should be compressed
$content_type = $_SERVER['CONTENT_TYPE'] ?? '';
if (!empty($content_type) && strpos($content_type, 'text/html') === false) {
return;
}
ob_start(array($this, 'compress_output_buffer'));
}
/**
* Compress output buffer callback
*/
public function compress_output_buffer($content) {
// Only compress if content is substantial and HTML
if (strlen($content) < 1000 || strpos($content, '<html') === false) {
return $content;
}
return $this->compress_and_cache($content, $_SERVER['REQUEST_URI'] ?? '');
}
/**
* Main compression function with Brotli + Gzip fallbacks
*/
public function compress_and_cache($content, $url = '') {
if (!get_option('tigerstyle_dash_compression_enabled', false)) {
return $content;
}
$method = get_option('tigerstyle_dash_compression_method', 'auto');
$level = get_option('tigerstyle_dash_compression_level', 6);
$cache_enabled = get_option('tigerstyle_dash_cache_enabled', true);
$accept_encoding = $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '';
$compressed_content = $content;
$compression_used = 'none';
$original_size = strlen($content);
// Determine best compression method
if ($method === 'auto') {
if (strpos($accept_encoding, 'br') !== false && function_exists('brotli_compress')) {
$compressed_content = brotli_compress($content, $level);
$compression_used = 'brotli';
header('Content-Encoding: br');
} elseif (strpos($accept_encoding, 'gzip') !== false) {
$compressed_content = gzencode($content, $level);
$compression_used = 'gzip';
header('Content-Encoding: gzip');
}
} elseif ($method === 'brotli' && function_exists('brotli_compress')) {
if (strpos($accept_encoding, 'br') !== false) {
$compressed_content = brotli_compress($content, $level);
$compression_used = 'brotli';
header('Content-Encoding: br');
}
} elseif ($method === 'gzip') {
if (strpos($accept_encoding, 'gzip') !== false) {
$compressed_content = gzencode($content, $level);
$compression_used = 'gzip';
header('Content-Encoding: gzip');
}
}
// Cache compressed content if enabled
if ($cache_enabled && !empty($url) && $compression_used !== 'none') {
$this->cache_compressed_content($url, $compressed_content, $compression_used);
}
// Update compression statistics
$this->update_compression_stats($original_size, strlen($compressed_content), $compression_used);
// Set additional performance headers
header('Vary: Accept-Encoding');
header('Cache-Control: public, max-age=31536000');
return $compressed_content;
}
/**
* Cache compressed content to filesystem
*/
private function cache_compressed_content($url, $content, $compression_type) {
$upload_dir = wp_upload_dir();
$cache_dir = $upload_dir['basedir'] . '/tigerstyle-dash-cache/';
if (!is_dir($cache_dir)) {
wp_mkdir_p($cache_dir);
}
$cache_key = md5($url);
$cache_file = $cache_dir . $cache_key . '.' . $compression_type;
file_put_contents($cache_file, $content);
// Store metadata
$metadata = array(
'url' => $url,
'compression' => $compression_type,
'size' => strlen($content),
'created' => time()
);
file_put_contents($cache_file . '.meta', json_encode($metadata));
}
/**
* Update compression statistics
*/
private function update_compression_stats($original_size, $compressed_size, $compression_used) {
$stats = get_option('tigerstyle_compression_stats', array(
'total_files' => 0,
'total_original_size' => 0,
'total_compressed_size' => 0,
'compression_methods' => array()
));
$stats['total_files']++;
$stats['total_original_size'] += $original_size;
$stats['total_compressed_size'] += $compressed_size;
if (!isset($stats['compression_methods'][$compression_used])) {
$stats['compression_methods'][$compression_used] = 0;
}
$stats['compression_methods'][$compression_used]++;
// Calculate derived stats
$bandwidth_saved = $stats['total_original_size'] - $stats['total_compressed_size'];
$avg_ratio = $stats['total_original_size'] > 0 ?
round((1 - $stats['total_compressed_size'] / $stats['total_original_size']) * 100, 1) : 0;
$stats['bandwidth_saved'] = $this->format_bytes($bandwidth_saved);
$stats['avg_ratio'] = $avg_ratio . '%';
$stats['files_compressed'] = number_format($stats['total_files']);
update_option('tigerstyle_compression_stats', $stats);
}
/**
* Format bytes into human readable format
*/
private function format_bytes($bytes, $precision = 2) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) {
$bytes /= 1024;
}
return round($bytes, $precision) . ' ' . $units[$i];
}
/**
* Clear compression cache
*/
public function clear_compression_cache() {
$upload_dir = wp_upload_dir();
$cache_dir = $upload_dir['basedir'] . '/tigerstyle-dash-cache/';
if (is_dir($cache_dir)) {
$this->delete_directory_contents($cache_dir);
}
}
/**
* Warm compression cache for popular pages
*/
public function warm_compression_cache() {
// Get popular posts and pages
$popular_posts = get_posts(array(
'numberposts' => 10,
'meta_key' => 'views',
'orderby' => 'meta_value_num',
'order' => 'DESC'
));
$home_url = home_url('/');
$urls_to_warm = array($home_url);
foreach ($popular_posts as $post) {
$urls_to_warm[] = get_permalink($post->ID);
}
// Pre-compress popular URLs
foreach ($urls_to_warm as $url) {
$this->precompress_url($url);
}
}
/**
* Pre-compress a specific URL
*/
private function precompress_url($url) {
$response = wp_remote_get($url, array(
'timeout' => 10,
'headers' => array(
'Accept-Encoding' => 'gzip, br'
)
));
if (!is_wp_error($response)) {
$content = wp_remote_retrieve_body($response);
$this->compress_and_cache($content, $url);
}
}
/**
* Clear compression cache for a specific post
*/
public function clear_post_compression_cache($post_id) {
$post_url = get_permalink($post_id);
$cache_key = md5($post_url);
$upload_dir = wp_upload_dir();
$cache_dir = $upload_dir['basedir'] . '/tigerstyle-dash-cache/';
// Remove all cached versions of this post
$files = glob($cache_dir . $cache_key . '.*');
foreach ($files as $file) {
if (is_file($file)) {
unlink($file);
}
}
// Also clear home page cache as it might include this post
$home_cache_key = md5(home_url('/'));
$home_files = glob($cache_dir . $home_cache_key . '.*');
foreach ($home_files as $file) {
if (is_file($file)) {
unlink($file);
}
}
}
/**
* Delete directory contents recursively
*/
private function delete_directory_contents($dir) {
if (!is_dir($dir)) {
return;
}
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
$path = $dir . '/' . $file;
if (is_dir($path)) {
$this->delete_directory_contents($path);
rmdir($path);
} else {
unlink($path);
}
}
}
/**
* AJAX handler for cache analysis
*/
public function ajax_analyze_cache() {
check_ajax_referer('tigerstyle_cache_analysis', 'nonce');
if (!current_user_can('manage_options')) {
wp_die('Unauthorized access');
}
$analysis = $this->analyze_cacheable_content();
wp_send_json_success($analysis);
}
/**
* Analyze cacheable content and calculate potential savings
*/
public function analyze_cacheable_content() {
$analysis = array(
'pages' => array(),
'assets' => array(),
'total_size' => 0,
'potential_savings' => 0,
'compression_estimates' => array()
);
// Analyze main pages
$pages_analysis = $this->analyze_pages();
$analysis['pages'] = $pages_analysis['pages'];
$analysis['total_size'] += $pages_analysis['total_size'];
$analysis['potential_savings'] += $pages_analysis['potential_savings'];
// Analyze static assets
$assets_analysis = $this->analyze_static_assets();
$analysis['assets'] = $assets_analysis['assets'];
$analysis['total_size'] += $assets_analysis['total_size'];
$analysis['potential_savings'] += $assets_analysis['potential_savings'];
// Calculate compression estimates
$analysis['compression_estimates'] = $this->calculate_compression_estimates($analysis['total_size']);
// Format results
$analysis['total_size_formatted'] = $this->format_bytes($analysis['total_size']);
$analysis['potential_savings_formatted'] = $this->format_bytes($analysis['potential_savings']);
$analysis['savings_percentage'] = $analysis['total_size'] > 0 ?
round(($analysis['potential_savings'] / $analysis['total_size']) * 100, 1) : 0;
return $analysis;
}
/**
* Analyze main pages for caching potential
*/
private function analyze_pages() {
$pages = array();
$total_size = 0;
$potential_savings = 0;
// Get homepage
$home_url = home_url('/');
$home_analysis = $this->analyze_single_page($home_url, 'Homepage');
if ($home_analysis) {
$pages[] = $home_analysis;
$total_size += $home_analysis['size'];
$potential_savings += $home_analysis['potential_savings'];
}
// Get recent posts
$recent_posts = get_posts(array(
'numberposts' => 5,
'post_status' => 'publish'
));
foreach ($recent_posts as $post) {
$post_url = get_permalink($post->ID);
$post_analysis = $this->analyze_single_page($post_url, $post->post_title);
if ($post_analysis) {
$pages[] = $post_analysis;
$total_size += $post_analysis['size'];
$potential_savings += $post_analysis['potential_savings'];
}
}
// Get recent pages
$recent_pages = get_posts(array(
'numberposts' => 3,
'post_type' => 'page',
'post_status' => 'publish'
));
foreach ($recent_pages as $page) {
$page_url = get_permalink($page->ID);
$page_analysis = $this->analyze_single_page($page_url, $page->post_title);
if ($page_analysis) {
$pages[] = $page_analysis;
$total_size += $page_analysis['size'];
$potential_savings += $page_analysis['potential_savings'];
}
}
return array(
'pages' => $pages,
'total_size' => $total_size,
'potential_savings' => $potential_savings
);
}
/**
* Analyze a single page for compression potential
*/
private function analyze_single_page($url, $title) {
// Use WordPress HTTP API to fetch the page
$response = wp_remote_get($url, array(
'timeout' => 15,
'user-agent' => 'TigerStyle-SEO-Cache-Analyzer/1.0'
));
if (is_wp_error($response)) {
return null;
}
$content = wp_remote_retrieve_body($response);
$original_size = strlen($content);
// Skip if too small or not HTML
if ($original_size < 500 || strpos($content, '<html') === false) {
return null;
}
// Estimate compression savings
$gzip_size = strlen(gzcompress($content, 6));
$brotli_size = function_exists('brotli_compress') ?
strlen(brotli_compress($content, 6)) : $gzip_size * 0.85; // Estimate 15% better
$best_compressed_size = min($gzip_size, $brotli_size);
$potential_savings = $original_size - $best_compressed_size;
return array(
'title' => $title,
'url' => $url,
'size' => $original_size,
'gzip_size' => $gzip_size,
'brotli_size' => $brotli_size,
'potential_savings' => $potential_savings,
'compression_ratio' => round((1 - $best_compressed_size / $original_size) * 100, 1),
'size_formatted' => $this->format_bytes($original_size),
'savings_formatted' => $this->format_bytes($potential_savings)
);
}
/**
* Analyze static assets for compression potential
*/
private function analyze_static_assets() {
$assets = array();
$total_size = 0;
$potential_savings = 0;
// Analyze CSS files
$css_files = $this->find_theme_files('*.css');
foreach ($css_files as $file) {
$asset_analysis = $this->analyze_static_file($file, 'CSS');
if ($asset_analysis) {
$assets[] = $asset_analysis;
$total_size += $asset_analysis['size'];
$potential_savings += $asset_analysis['potential_savings'];
}
}
// Analyze JS files
$js_files = $this->find_theme_files('*.js');
foreach ($js_files as $file) {
$asset_analysis = $this->analyze_static_file($file, 'JavaScript');
if ($asset_analysis) {
$assets[] = $asset_analysis;
$total_size += $asset_analysis['size'];
$potential_savings += $asset_analysis['potential_savings'];
}
}
return array(
'assets' => $assets,
'total_size' => $total_size,
'potential_savings' => $potential_savings
);
}
/**
* Find theme files by pattern
*/
private function find_theme_files($pattern) {
$theme_dir = get_stylesheet_directory();
$files = glob($theme_dir . '/' . $pattern);
// Also check parent theme if using child theme
if (is_child_theme()) {
$parent_theme_dir = get_template_directory();
$parent_files = glob($parent_theme_dir . '/' . $pattern);
$files = array_merge($files, $parent_files);
}
// Limit to reasonable number of files
return array_slice($files, 0, 10);
}
/**
* Analyze a static file for compression potential
*/
private function analyze_static_file($file_path, $type) {
if (!file_exists($file_path) || !is_readable($file_path)) {
return null;
}
$content = file_get_contents($file_path);
$original_size = strlen($content);
// Skip small files
if ($original_size < 1000) {
return null;
}
// Estimate compression savings
$gzip_size = strlen(gzcompress($content, 6));
$brotli_size = function_exists('brotli_compress') ?
strlen(brotli_compress($content, 6)) : $gzip_size * 0.85;
$best_compressed_size = min($gzip_size, $brotli_size);
$potential_savings = $original_size - $best_compressed_size;
$filename = basename($file_path);
return array(
'filename' => $filename,
'type' => $type,
'path' => $file_path,
'size' => $original_size,
'gzip_size' => $gzip_size,
'brotli_size' => $brotli_size,
'potential_savings' => $potential_savings,
'compression_ratio' => round((1 - $best_compressed_size / $original_size) * 100, 1),
'size_formatted' => $this->format_bytes($original_size),
'savings_formatted' => $this->format_bytes($potential_savings)
);
}
/**
* Calculate compression estimates for different scenarios
*/
private function calculate_compression_estimates($total_size) {
return array(
'gzip_only' => array(
'method' => 'Gzip only',
'ratio' => 70, // Conservative estimate
'savings' => round($total_size * 0.30),
'savings_formatted' => $this->format_bytes(round($total_size * 0.30))
),
'brotli_only' => array(
'method' => 'Brotli only',
'ratio' => 78, // Better compression
'savings' => round($total_size * 0.22),
'savings_formatted' => $this->format_bytes(round($total_size * 0.22))
),
'auto_best' => array(
'method' => 'Auto (Brotli + Gzip fallback)',
'ratio' => 75, // Average between both
'savings' => round($total_size * 0.25),
'savings_formatted' => $this->format_bytes(round($total_size * 0.25))
)
);
}
public function render_admin_page() {
// Get current settings
$compression_enabled = get_option('tigerstyle_dash_compression_enabled', false);
$compression_method = get_option('tigerstyle_dash_compression_method', 'auto');
$compression_level = get_option('tigerstyle_dash_compression_level', 6);
$compression_cache_enabled = get_option('tigerstyle_dash_cache_enabled', true);
$compression_stats = get_option('tigerstyle_compression_stats', array());
?>
<div class="seo-info-box">
<h3><?php _e('Performance & Compression Status', 'tigerstyle-dash'); ?></h3>
<p class="description">
<?php _e('Boost your website performance with intelligent compression. Our WP Rocket-inspired system provides Brotli and Gzip compression with smart caching, bandwidth monitoring, and automatic optimization.', 'tigerstyle-dash'); ?>
</p>
<p>
<strong><?php _e('Compression Status:', 'tigerstyle-dash'); ?></strong>
<?php if ($compression_enabled): ?>
<span style="color: green;"><?php _e('Active', 'tigerstyle-dash'); ?></span>
<?php
$method_names = array(
'auto' => __('Auto (Brotli + Gzip fallback)', 'tigerstyle-dash'),
'brotli' => __('Brotli only', 'tigerstyle-dash'),
'gzip' => __('Gzip only', 'tigerstyle-dash')
);
?>
<span style="color: #666;"> - <?php echo esc_html($method_names[$compression_method]); ?></span>
<?php else: ?>
<span style="color: red;"><?php _e('Disabled', 'tigerstyle-dash'); ?></span>
<?php endif; ?>
</p>
<?php if (!empty($compression_stats)): ?>
<div class="compression-stats" style="margin-top: 15px;">
<h4><?php _e('Performance Statistics', 'tigerstyle-dash'); ?></h4>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-top: 10px;">
<div class="stat-box" style="padding: 10px; background: #f1f1f1; border-radius: 4px;">
<strong><?php _e('Bandwidth Saved:', 'tigerstyle-dash'); ?></strong><br>
<span style="color: #007cba; font-size: 18px;"><?php echo esc_html($compression_stats['bandwidth_saved'] ?? '0 MB'); ?></span>
</div>
<div class="stat-box" style="padding: 10px; background: #f1f1f1; border-radius: 4px;">
<strong><?php _e('Avg. Compression Ratio:', 'tigerstyle-dash'); ?></strong><br>
<span style="color: #007cba; font-size: 18px;"><?php echo esc_html($compression_stats['avg_ratio'] ?? '0%'); ?></span>
</div>
<div class="stat-box" style="padding: 10px; background: #f1f1f1; border-radius: 4px;">
<strong><?php _e('Files Compressed:', 'tigerstyle-dash'); ?></strong><br>
<span style="color: #007cba; font-size: 18px;"><?php echo esc_html($compression_stats['files_compressed'] ?? '0'); ?></span>
</div>
</div>
</div>
<?php endif; ?>
</div>
<form method="post" action="<?php echo admin_url('admin-post.php'); ?>">
<input type="hidden" name="action" value="update_compression_settings">
<?php wp_nonce_field('update_compression_settings', 'compression_nonce'); ?>
<table class="form-table">
<tr>
<th scope="row"><?php _e('Enable Compression', 'tigerstyle-dash'); ?></th>
<td>
<label>
<input type="checkbox" name="compression_enabled" value="1" <?php checked($compression_enabled); ?>>
<?php _e('Enable intelligent compression system', 'tigerstyle-dash'); ?>
</label>
<p class="description">
<?php _e('Activate smart compression with automatic Brotli + Gzip fallbacks for maximum performance and compatibility.', 'tigerstyle-dash'); ?>
</p>
</td>
</tr>
<tr>
<th scope="row">
<label for="compression_method"><?php _e('Compression Method', 'tigerstyle-dash'); ?></label>
</th>
<td>
<select id="compression_method" name="compression_method">
<option value="auto" <?php selected($compression_method, 'auto'); ?>><?php _e('Auto (Recommended) - Brotli with Gzip fallback', 'tigerstyle-dash'); ?></option>
<option value="brotli" <?php selected($compression_method, 'brotli'); ?>><?php _e('Brotli only (Better compression)', 'tigerstyle-dash'); ?></option>
<option value="gzip" <?php selected($compression_method, 'gzip'); ?>><?php _e('Gzip only (Maximum compatibility)', 'tigerstyle-dash'); ?></option>
</select>
<p class="description">
<?php _e('Auto mode provides best performance with maximum browser compatibility. Brotli typically achieves 15-25% better compression than Gzip.', 'tigerstyle-dash'); ?>
</p>
</td>
</tr>
<tr>
<th scope="row">
<label for="compression_level"><?php _e('Compression Level', 'tigerstyle-dash'); ?></label>
</th>
<td>
<input type="range" id="compression_level" name="compression_level" min="1" max="9" value="<?php echo esc_attr($compression_level); ?>" oninput="updateCompressionLevel(this.value)">
<output id="compression_level_display"><?php echo esc_html($compression_level); ?></output>
<p class="description">
<?php _e('Higher levels provide better compression but use more CPU. Level 6 offers the best balance of speed and compression.', 'tigerstyle-dash'); ?>
<br><span id="compression_level_desc"></span>
</p>
</td>
</tr>
<tr>
<th scope="row"><?php _e('Smart Caching', 'tigerstyle-dash'); ?></th>
<td>
<label>
<input type="checkbox" name="compression_cache_enabled" value="1" <?php checked($compression_cache_enabled); ?>>
<?php _e('Enable intelligent cache warming and purging', 'tigerstyle-dash'); ?>
</label>
<p class="description">
<?php _e('Automatically pre-compress popular content and clear cache when posts are updated. Reduces server load and improves response times.', 'tigerstyle-dash'); ?>
</p>
</td>
</tr>
</table>
<?php submit_button(__('Update Compression Settings', 'tigerstyle-dash')); ?>
</form>
<!-- Cache Analysis Section -->
<div class="seo-info-box" style="margin-top: 25px;">
<h3><?php _e('🔍 Cache Analysis & Potential Savings', 'tigerstyle-dash'); ?></h3>
<p class="description">
<?php _e('Analyze your website content to see what could be cached and estimate potential bandwidth savings with compression.', 'tigerstyle-dash'); ?>
</p>
<button type="button" id="analyze-cache-btn" class="button button-primary" style="margin: 15px 0;">
<?php _e('Analyze Cacheable Content', 'tigerstyle-dash'); ?>
</button>
<div id="cache-analysis-results" style="display: none; margin-top: 20px;">
<!-- Results will be loaded here via AJAX -->
</div>
<div id="cache-analysis-loading" style="display: none; margin-top: 15px; text-align: center;">
<div style="display: inline-block; vertical-align: middle;">
<div class="spinner is-active" style="float: none; margin: 0 10px 0 0;"></div>
<span><?php _e('Analyzing content and calculating compression savings...', 'tigerstyle-dash'); ?></span>
</div>
</div>
</div>
<div class="seo-info-box">
<h3><?php _e('Compression Benefits', 'tigerstyle-dash'); ?></h3>
<div class="seo-benefits-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-top: 15px;">
<div>
<h4><?php _e('🚀 Performance Boost', 'tigerstyle-dash'); ?></h4>
<p><?php _e('Reduce file sizes by 60-80%, dramatically improving page load times and Core Web Vitals scores.', 'tigerstyle-dash'); ?></p>
</div>
<div>
<h4><?php _e('💰 Bandwidth Savings', 'tigerstyle-dash'); ?></h4>
<p><?php _e('Lower hosting costs and faster loading for users on limited data plans or slow connections.', 'tigerstyle-dash'); ?></p>
</div>
<div>
<h4><?php _e('🎯 SEO Improvement', 'tigerstyle-dash'); ?></h4>
<p><?php _e('Google rewards fast-loading sites with higher rankings. Compression is a ranking factor.', 'tigerstyle-dash'); ?></p>
</div>
<div>
<h4><?php _e('🔧 Smart Automation', 'tigerstyle-dash'); ?></h4>
<p><?php _e('Set it and forget it! Our system handles everything automatically with intelligent optimizations.', 'tigerstyle-dash'); ?></p>
</div>
</div>
</div>
<script>
// Compression level slider functionality
function updateCompressionLevel(value) {
document.getElementById('compression_level_display').textContent = value;
const descriptions = {
1: '<?php echo esc_js(__("Fastest - Minimal compression", "tigerstyle-dash")); ?>',
2: '<?php echo esc_js(__("Very fast - Light compression", "tigerstyle-dash")); ?>',
3: '<?php echo esc_js(__("Fast - Basic compression", "tigerstyle-dash")); ?>',
4: '<?php echo esc_js(__("Balanced - Good compression", "tigerstyle-dash")); ?>',
5: '<?php echo esc_js(__("Good - Better compression", "tigerstyle-dash")); ?>',
6: '<?php echo esc_js(__("Recommended - Optimal balance", "tigerstyle-dash")); ?>',
7: '<?php echo esc_js(__("High - Strong compression", "tigerstyle-dash")); ?>',
8: '<?php echo esc_js(__("Maximum - Slow but thorough", "tigerstyle-dash")); ?>',
9: '<?php echo esc_js(__("Ultra - Slowest, best compression", "tigerstyle-dash")); ?>'
};
document.getElementById('compression_level_desc').textContent = descriptions[value] || '';
}
// Initialize compression level description on page load
document.addEventListener('DOMContentLoaded', function() {
const levelSlider = document.getElementById('compression_level');
if (levelSlider) {
updateCompressionLevel(levelSlider.value);
}
});
</script>
<?php
}
/**
* Handle compression settings form submission
*/
public function handle_form_submission() {
// Verify nonce and permissions
if (!wp_verify_nonce($_POST['compression_nonce'], 'update_compression_settings')) {
wp_die(__('Security check failed.', 'tigerstyle-dash'));
}
if (!current_user_can('manage_options')) {
wp_die(__('You do not have sufficient permissions.', 'tigerstyle-dash'));
}
// Sanitize and update compression settings
$compression_enabled = isset($_POST['compression_enabled']) ? 1 : 0;
$compression_method = sanitize_text_field($_POST['compression_method'] ?? 'auto');
$compression_level = intval($_POST['compression_level'] ?? 6);
$compression_cache_enabled = isset($_POST['compression_cache_enabled']) ? 1 : 0;
// Validate compression level
if ($compression_level < 1 || $compression_level > 9) {
$compression_level = 6;
}
// Validate compression method
$valid_methods = array('auto', 'gzip', 'brotli');
if (!in_array($compression_method, $valid_methods)) {
$compression_method = 'auto';
}
// Update options
update_option('tigerstyle_dash_compression_enabled', $compression_enabled);
update_option('tigerstyle_dash_compression_method', $compression_method);
update_option('tigerstyle_dash_compression_level', $compression_level);
update_option('tigerstyle_dash_cache_enabled', $compression_cache_enabled);
// Clear compression cache when settings change
$this->clear_compression_cache();
// Re-initialize compression hooks if enabled
if ($compression_enabled) {
remove_action('template_redirect', array($this, 'start_compression_buffer'), 1);
add_action('template_redirect', array($this, 'start_compression_buffer'), 1);
}
// Redirect with success message
wp_redirect(add_query_arg(array(
'page' => 'tigerstyle-dash',
'tab' => 'performance',
'message' => 'compression_settings_updated'
), admin_url('admin.php')));
exit;
}
}

536
tigerstyle-dash.php Normal file
View File

@ -0,0 +1,536 @@
<?php
/**
* Plugin Name: TigerStyle Dash
* Plugin URI: https://tigerstyle.com/plugins/dash
* Description: WordPress Performance at Lightning Speed. Advanced optimization with Brotli compression, smart caching, and cat-like speed bursts that dash past the competition.
* Version: 1.0.0
* Author: TigerStyle Development
* Author URI: https://tigerstyle.com
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: tigerstyle-dash
* Domain Path: /languages
* Requires at least: 5.0
* Tested up to: 6.8
* Requires PHP: 7.4
* Network: false
*
* @package TigerStyleDash
* @version 1.0.0
*/
// Exit if accessed directly
if (!defined('ABSPATH')) {
exit;
}
// Define plugin constants
define('TIGERSTYLE_DASH_VERSION', '1.0.0');
define('TIGERSTYLE_DASH_PATH', plugin_dir_path(__FILE__));
define('TIGERSTYLE_DASH_URL', plugin_dir_url(__FILE__));
define('TIGERSTYLE_DASH_BASENAME', plugin_basename(__FILE__));
define('TIGERSTYLE_DASH_FILE', __FILE__);
/**
* Main TigerStyle Dash Plugin Class
*
* Lightning-fast WordPress performance optimization
*
* @since 1.0.0
*/
final class TigerStyle_Dash {
/**
* Plugin instance
*
* @var TigerStyle_Dash
*/
private static $instance = null;
/**
* Performance engine
*
* @var TigerStyle_Dash_Performance
*/
private $performance;
/**
* Admin interface
*
* @var TigerStyle_Dash_Admin
*/
private $admin;
/**
* Cache manager
*
* @var TigerStyle_Dash_Cache
*/
private $cache;
/**
* Analytics tracker
*
* @var TigerStyle_Dash_Analytics
*/
private $analytics;
/**
* CDN manager
*
* @var TigerStyle_Dash_CDN
*/
private $cdn;
/**
* Get plugin instance (Singleton pattern)
*
* @return TigerStyle_Dash
*/
public static function instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor - Initialize the plugin
*/
private function __construct() {
$this->init_hooks();
$this->load_dependencies();
$this->init_components();
}
/**
* Prevent cloning
*/
private function __clone() {}
/**
* Prevent unserialization
*/
public function __wakeup() {}
/**
* Initialize WordPress hooks
*/
private function init_hooks() {
// Activation and deactivation hooks
register_activation_hook(__FILE__, [$this, 'activate']);
register_deactivation_hook(__FILE__, [$this, 'deactivate']);
// Plugin lifecycle hooks
add_action('plugins_loaded', [$this, 'loaded'], 10);
add_action('init', [$this, 'init'], 10);
add_action('wp_loaded', [$this, 'wp_loaded'], 10);
// Load text domain for translations
add_action('plugins_loaded', [$this, 'load_textdomain']);
// Admin hooks
if (is_admin()) {
add_action('admin_init', [$this, 'init_admin']);
add_action('admin_menu', [$this, 'add_admin_menu']);
}
// Performance hooks - high priority for early execution
add_action('template_redirect', [$this, 'init_performance'], 1);
// AJAX hooks for admin interface
add_action('wp_ajax_tigerstyle_dash_analyze', [$this, 'ajax_analyze_performance']);
add_action('wp_ajax_tigerstyle_dash_clear_cache', [$this, 'ajax_clear_cache']);
}
/**
* Load plugin dependencies
*/
private function load_dependencies() {
// Core performance classes
require_once TIGERSTYLE_DASH_PATH . 'includes/class-performance.php';
require_once TIGERSTYLE_DASH_PATH . 'includes/class-cache.php';
require_once TIGERSTYLE_DASH_PATH . 'includes/class-compression.php';
require_once TIGERSTYLE_DASH_PATH . 'includes/class-cdn.php';
require_once TIGERSTYLE_DASH_PATH . 'includes/class-analytics.php';
// Admin classes (only in admin)
if (is_admin()) {
require_once TIGERSTYLE_DASH_PATH . 'includes/class-admin.php';
}
}
/**
* Initialize plugin components
*/
private function init_components() {
// Initialize cache manager first
$this->cache = new TigerStyle_Dash_Cache();
// Initialize performance engine
$this->performance = TigerStyle_Dash_Performance::instance();
// Initialize CDN manager
$this->cdn = TigerStyle_Dash_CDN::instance();
// Initialize analytics
$this->analytics = new TigerStyle_Dash_Analytics($this);
// Initialize admin interface (admin only)
if (is_admin()) {
$this->admin = new TigerStyle_Dash_Admin($this);
}
}
/**
* Plugin activation hook
*/
public function activate() {
// Check system requirements
$this->check_requirements();
// Create cache directories
$this->create_cache_directories();
// Set default options
$this->set_default_options();
// Schedule cache cleanup
if (!wp_next_scheduled('tigerstyle_dash_cache_cleanup')) {
wp_schedule_event(time(), 'daily', 'tigerstyle_dash_cache_cleanup');
}
// Set activation flag
update_option('tigerstyle_dash_activated', time());
}
/**
* Plugin deactivation hook
*/
public function deactivate() {
// Clear scheduled events
wp_clear_scheduled_hook('tigerstyle_dash_cache_cleanup');
wp_clear_scheduled_hook('tigerstyle_dash_cache_warm');
// Clear transients
delete_transient('tigerstyle_dash_performance_stats');
delete_transient('tigerstyle_dash_cache_analysis');
}
/**
* Check system requirements
*/
private function check_requirements() {
// Check PHP version
if (version_compare(PHP_VERSION, '7.4', '<')) {
deactivate_plugins(plugin_basename(__FILE__));
wp_die(__('TigerStyle Dash requires PHP 7.4 or higher.', 'tigerstyle-dash'));
}
// Check WordPress version
if (version_compare(get_bloginfo('version'), '5.0', '<')) {
deactivate_plugins(plugin_basename(__FILE__));
wp_die(__('TigerStyle Dash requires WordPress 5.0 or higher.', 'tigerstyle-dash'));
}
// Check required PHP extensions
$required_extensions = ['zlib', 'json'];
foreach ($required_extensions as $extension) {
if (!extension_loaded($extension)) {
deactivate_plugins(plugin_basename(__FILE__));
wp_die(sprintf(__('TigerStyle Dash requires the %s PHP extension.', 'tigerstyle-dash'), $extension));
}
}
}
/**
* Create cache directories
*/
private function create_cache_directories() {
$upload_dir = wp_upload_dir();
$cache_dir = $upload_dir['basedir'] . '/tigerstyle-dash-cache';
if (!file_exists($cache_dir)) {
wp_mkdir_p($cache_dir);
// Create .htaccess for security
$htaccess_content = "# TigerStyle Dash Cache Security\n";
$htaccess_content .= "Order Allow,Deny\n";
$htaccess_content .= "Allow from all\n";
$htaccess_content .= "<Files ~ \"\\.(php|phtml|php3|php4|php5|pl|py|jsp|asp|sh|cgi)$\">\n";
$htaccess_content .= " deny from all\n";
$htaccess_content .= "</Files>\n";
file_put_contents($cache_dir . '/.htaccess', $htaccess_content);
// Create index.php for additional security
file_put_contents($cache_dir . '/index.php', '<?php // Silence is golden');
}
}
/**
* Set default plugin options
*/
private function set_default_options() {
$default_options = [
'tigerstyle_dash_version' => TIGERSTYLE_DASH_VERSION,
'tigerstyle_dash_compression_enabled' => true,
'tigerstyle_dash_compression_method' => 'auto',
'tigerstyle_dash_compression_level' => 6,
'tigerstyle_dash_cache_enabled' => true,
'tigerstyle_dash_cache_ttl' => 3600, // 1 hour
'tigerstyle_dash_analytics_enabled' => true
];
foreach ($default_options as $option_name => $option_value) {
if (get_option($option_name) === false) {
add_option($option_name, $option_value);
}
}
}
/**
* Add admin menu
*/
public function add_admin_menu() {
add_menu_page(
__('TigerStyle Dash', 'tigerstyle-dash'),
__('Dash Performance', 'tigerstyle-dash'),
'manage_options',
'tigerstyle-dash',
[$this->admin, 'render_main_page'],
'dashicons-performance',
30
);
}
/**
* Initialize performance engine
*/
public function init_performance() {
if ($this->performance) {
$this->performance->init_compression();
}
}
/**
* AJAX handler for performance analysis
*/
public function ajax_analyze_performance() {
check_ajax_referer('tigerstyle_dash_nonce', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Insufficient permissions');
}
$analysis = $this->analytics->analyze_site_performance();
wp_send_json_success($analysis);
}
/**
* AJAX handler for cache clearing
*/
public function ajax_clear_cache() {
check_ajax_referer('tigerstyle_dash_nonce', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Insufficient permissions');
}
$this->cache->clear_all_cache();
wp_send_json_success(['message' => __('Cache cleared successfully!', 'tigerstyle-dash')]);
}
/**
* Initialize plugin after all plugins loaded
*/
public function loaded() {
// Check if we need to run upgrades
$installed_version = get_option('tigerstyle_dash_version');
if (version_compare($installed_version, TIGERSTYLE_DASH_VERSION, '<')) {
$this->upgrade($installed_version);
}
}
/**
* Initialize plugin on WordPress init
*/
public function init() {
// Initialize any global functionality
}
/**
* Initialize when WordPress is fully loaded
*/
public function wp_loaded() {
// Initialize components that need WordPress to be fully loaded
}
/**
* Load plugin text domain for translations
*/
public function load_textdomain() {
load_plugin_textdomain(
'tigerstyle-dash',
false,
dirname(plugin_basename(__FILE__)) . '/languages'
);
}
/**
* Initialize admin component
*/
public function init_admin() {
if (!$this->admin && current_user_can('manage_options')) {
$this->admin = new TigerStyle_Dash_Admin($this);
}
}
/**
* Handle plugin upgrades
*
* @param string $installed_version Currently installed version
*/
private function upgrade($installed_version) {
// Run upgrade routines based on version
if (version_compare($installed_version, '1.0.0', '<')) {
// Upgrade to 1.0.0
$this->create_cache_directories();
}
// Update version
update_option('tigerstyle_dash_version', TIGERSTYLE_DASH_VERSION);
}
/**
* Get performance engine
*
* @return TigerStyle_Dash_Performance
*/
public function get_performance() {
return $this->performance;
}
/**
* Get cache manager
*
* @return TigerStyle_Dash_Cache
*/
public function get_cache() {
return $this->cache;
}
/**
* Get analytics tracker
*
* @return TigerStyle_Dash_Analytics
*/
public function get_analytics() {
return $this->analytics;
}
/**
* Get CDN manager
*
* @return TigerStyle_Dash_CDN
*/
public function get_cdn() {
return $this->cdn;
}
/**
* Get admin component
*
* @return TigerStyle_Dash_Admin|null
*/
public function get_admin() {
return $this->admin;
}
/**
* Get plugin version
*
* @return string
*/
public function get_version() {
return TIGERSTYLE_DASH_VERSION;
}
/**
* Plugin cleanup on uninstall
*/
public static function uninstall() {
// Only run if explicitly uninstalling
if (!defined('WP_UNINSTALL_PLUGIN')) {
return;
}
// Remove all plugin data if user chooses to
$remove_data = get_option('tigerstyle_dash_remove_data_on_uninstall', false);
if ($remove_data) {
// Remove options
delete_option('tigerstyle_dash_version');
delete_option('tigerstyle_dash_compression_enabled');
delete_option('tigerstyle_dash_compression_method');
delete_option('tigerstyle_dash_compression_level');
delete_option('tigerstyle_dash_cache_enabled');
delete_option('tigerstyle_dash_cache_ttl');
delete_option('tigerstyle_dash_analytics_enabled');
delete_option('tigerstyle_dash_activated');
delete_option('tigerstyle_dash_remove_data_on_uninstall');
// Remove CDN settings
delete_option('tigerstyle_dash_cdn_settings');
delete_option('tigerstyle_dash_cdn_files_served');
delete_option('tigerstyle_dash_cdn_bandwidth_saved');
// Remove cache directory
$upload_dir = wp_upload_dir();
$cache_dir = $upload_dir['basedir'] . '/tigerstyle-dash-cache';
if (file_exists($cache_dir)) {
// Recursively delete directory
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($cache_dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($files as $file) {
if ($file->isDir()) {
rmdir($file->getRealPath());
} else {
unlink($file->getRealPath());
}
}
rmdir($cache_dir);
}
// Clear scheduled events
wp_clear_scheduled_hook('tigerstyle_dash_cache_cleanup');
wp_clear_scheduled_hook('tigerstyle_dash_cache_warm');
// Clear transients
delete_transient('tigerstyle_dash_performance_stats');
delete_transient('tigerstyle_dash_cache_analysis');
}
}
}
/**
* Initialize the plugin
*
* @return TigerStyle_Dash
*/
function tigerstyle_dash() {
return TigerStyle_Dash::instance();
}
// Start the plugin
tigerstyle_dash();
/**
* Plugin cleanup on uninstall
*/
register_uninstall_hook(__FILE__, array('TigerStyle_Dash', 'uninstall'));