WP Manifestindependent plugin directory
manifest / performance / attachment-lookup-optimizer

Attachment Lookup Optimizer

Optimizes attachment lookups by adding database indexes and caching attachment_url_to_postid() results.

by SPARKWEB Studio · github.com/spkcd/attachment-lookup-optimizer · website

★ 0stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/spkcd/attachment-lookup-optimizer/archive/refs/heads/main.zip

A WordPress plugin that optimizes attachment URL lookups by adding database indexes and implementing intelligent caching for the attachment_url_to_postid() function.

Developed by SPARKWEB Studio - Professional WordPress development and optimization services.

✨ Key Features

  • 🚀 Ultra-Fast Lookups: Custom database table for O(1) attachment URL resolution
  • 🎯 Smart Caching: Multi-level caching with Redis/Memcached support
  • 🔄 JetEngine Integration: Preloads attachment URLs for JetEngine listings and galleries
  • 🎨 Custom Field Support: NEW in v1.0.9 - Automatic URL rewriting in JetEngine and JetFormBuilder fields
  • ☁️ BunnyCDN Integration: Automatic CDN uploads with background sync and migration tools
  • 📊 Real-time Monitoring: Live statistics, performance tracking, and debug tools
  • 🛠 Background Processing: Automatically processes existing attachments with progress tracking
  • ⚡ Global Override: Replaces WordPress core attachment_url_to_postid() function
  • 🎨 Modern Image Formats: Full WebP, AVIF, and HEIC support for next-gen web performance
  • 🔍 Advanced Debugging: Comprehensive logging, slow query detection, and optimization insights

🎨 WebP & Modern Image Format Support

The plugin provides comprehensive support for modern image formats:

Supported Formats

  • WebP: 30-50% smaller than JPEG with same quality
  • AVIF: Next-generation format with 50% better compression
  • HEIC: Apple's High Efficiency Image Container
  • JPEG XL: Emerging ultra-efficient format
  • All traditional formats (JPEG, PNG, GIF, SVG, BMP)

WebP Benefits

  • ✅ Faster page loads - Reduced file sizes improve Core Web Vitals
  • ✅ Better SEO rankings - Page speed improvements boost search rankings
  • ✅ Lower bandwidth costs - Significant reduction in CDN and hosting costs
  • ✅ Mobile optimization - Critical for mobile-first indexing

Automatic Detection

The plugin automatically recognizes WebP files through:

  • File extension detection (.webp, .avif, .heic)
  • WordPress attachment meta (_wp_attached_file)
  • Customizable format support via alo_supported_image_extensions filter

No configuration needed - WebP images work immediately with all plugin features including caching, preloading, and lazy loading.

📖 Complete WebP Documentation →

☁️ BunnyCDN Integration

The plugin provides comprehensive BunnyCDN integration for automatic media file uploads and CDN delivery:

Core Features

  • 🔄 Automatic Uploads: New attachments automatically uploaded to BunnyCDN
  • 📦 Bulk Migration: Migrate existing media library to CDN with progress tracking
  • 🔗 URL Management: Seamlessly serve files from CDN with fallback support
  • ⏰ Background Sync: Hourly automatic sync for failed uploads (configurable)
  • 🔄 Retry System: Manual retry for failed uploads with one-click resolution
  • 🗑️ Cleanup Integration: Automatic CDN file deletion when WordPress attachments are removed

Configuration Options

  • 🔑 API Integration: Secure API key management with connection testing
  • 🌍 Global Regions: Support for 6 BunnyCDN regions (Germany, New York, LA, Singapore, Sydney, UK)
  • 🏷️ Custom Hostnames: Optional custom CDN hostname configuration
  • ⚙️ Upload Control: Toggle automatic uploads and background sync independently
  • 🎯 URL Override: Choose whether to serve attachments from CDN or original server

Background Sync System

  • ⏰ Automatic Processing: Runs every hour to catch missed uploads
  • 📊 Smart Batching: Processes up to 10 attachments per run to prevent server overload
  • 🎛️ User Control: NEW in v1.0.8 - Toggle to enable/disable automatic background sync
  • 📈 Progress Tracking: Real-time statistics and status monitoring
  • 🔄 Retry Logic: Intelligent retry system for temporary failures

Migration & Management Tools

  • 📊 Migration Dashboard: Real-time progress with statistics and activity log
  • 🎯 Batch Processing: AJAX-based migration with 10 files per batch
  • 📈 Status Tracking: Comprehensive upload attempt tracking and error logging
  • 🔄 Media Library Integration: CDN status column with clickable links and retry buttons
  • 🛠️ Admin Tools: Connection testing, manual sync, and comprehensive settings

Admin Interface

Tools > Attachment Optimizer > BunnyCDN Integration
├── Enable BunnyCDN Integration ☑
├── API Key Configuration 🔑
├── Storage Zone & Region Selection 🌍
├── Custom CDN Hostname (optional) 🏷️
├── Serve attachments from BunnyCDN ☑
├── Enable automatic background sync ☑
├── Rewrite post content URLs ☑
├── Rewrite BunnyCDN URLs in JetEngine/JetFormBuilder fields ☑ (NEW in v1.0.9)
├── Background Sync Status 📊
│   ├── Active/Inactive indicator
│   ├── Next run time & pending count
│   └── Last run results & statistics
└── Migration Tools 🛠️
    └── Tools > Migrate to BunnyCDN

Media Library Enhancements

  • 📊 CDN Status Column: Visual indicators (✅/❌) for upload status
  • 🔗 Direct CDN Links: Clickable links to CDN-hosted files
  • 🔄 Retry Buttons: One-click retry for failed uploads
  • 💡 Hover Tooltips: Detailed upload information and timestamps
  • 📈 Upload Tracking: Attempt counts, status history, and error details

Developer Integration

// Check if BunnyCDN is enabled
$bunny_manager = $plugin->get_bunny_cdn_manager();
if ($bunny_manager->is_enabled()) {
    // Upload file to BunnyCDN
    $result = $bunny_manager->upload_file($local_path, $filename, $attachment_id);
}

// Get CDN URL for attachment
$cdn_url = get_post_meta($attachment_id, '_bunnycdn_url', true);

// Check upload status
$upload_status = get_post_meta($attachment_id, '_bunnycdn_last_upload_status', true);

Performance Benefits

  • 🚀 Global Delivery: Files served from nearest edge location
  • 📉 Server Load Reduction: Offload media delivery from origin server
  • 💰 Bandwidth Savings: Reduce hosting bandwidth costs
  • ⚡ Faster Load Times: Improved Core Web Vitals and user experience
  • 🔄 Automatic Optimization: Smart retry and background processing

🎨 JetEngine & JetFormBuilder Integration

NEW in v1.0.9 - The plugin now provides comprehensive support for custom field URL rewriting in JetEngine and JetFormBuilder:

Core Features

  • 🔄 Automatic URL Rewriting: Replaces local URLs with BunnyCDN URLs in custom fields
  • 🎯 Smart Field Detection: Automatically identifies image, file, gallery, and text fields
  • 🔧 Multiple Field Types: Support for single files, galleries, repeater fields, and nested structures
  • 🛡️ Safe Processing: Disabled by default to prevent unexpected changes
  • 📊 Comprehensive Logging: Detailed logging of all custom field processing activities

Supported Field Patterns

  • JetEngine Fields: Standard meta field names and custom field configurations
  • JetFormBuilder Fields: field_123456, jetform_, jfb_, and custom patterns
  • File Upload Fields: Image uploads, file attachments, and gallery fields
  • Complex Structures: Repeater fields, nested arrays, and grouped field data

Field Type Detection

The plugin intelligently detects field types:

// Image fields - URLs and attachment IDs
'image_gallery' => [1234, 5678, 9012]
'featured_image' => 'https://site.com/wp-content/uploads/image.jpg'

// File fields - Mixed formats
'document_upload' => 'https://site.com/wp-content/uploads/doc.pdf'
'attachment_id' => 1234

// Gallery fields - Arrays of images
'photo_gallery' => [
    'https://site.com/wp-content/uploads/photo1.jpg',
    'https://site.com/wp-content/uploads/photo2.jpg'
]

// Repeater fields - Nested structures
'property_images' => [
    ['image' => 1234, 'caption' => 'Living room'],
    ['image' => 5678, 'caption' => 'Kitchen']
]

Admin Control

  • Settings Location: Tools > Attachment Optimizer > BunnyCDN Integration
  • Control Checkbox: "Rewrite BunnyCDN URLs in JetEngine/JetFormBuilder fields"
  • Default State: Disabled to prevent unexpected changes
  • Safe Testing: Enable for specific posts before site-wide activation

Processing Workflow

  1. Upload Detection: Monitors new BunnyCDN uploads
  2. Field Scanning: Searches posts for custom fields containing the uploaded URLs
  3. Smart Replacement: Replaces local URLs with CDN URLs based on field type
  4. Bulk Processing: Integrates with bulk URL replacement workflows
  5. Error Handling: Comprehensive error logging and graceful failure recovery

Developer Integration

// Check if custom field rewriting is enabled
$meta_rewriting = get_option('alo_bunnycdn_rewrite_meta_enabled', false);

// Process custom fields for a specific post
$plugin = \AttachmentLookupOptimizer\Plugin::getInstance();
$content_rewriter = $plugin->get_bunnycdn_content_rewriter();
$replacements = $content_rewriter->process_jetengine_custom_fields($post_id, $attachment_info, $cdn_url);

// Check if field is JetEngine/JetFormBuilder field
$is_jetengine = $content_rewriter->is_jetengine_field($field_name, $jetengine_fields);
$is_jetformbuilder = $content_rewriter->is_jetformbuilder_field($field_name);

Supported Use Cases

  • Property Listings: Gallery images in real estate sites
  • Product Catalogs: Product images and file downloads
  • Portfolio Sites: Project galleries and media files
  • Event Listings: Event photos and document attachments
  • Directory Sites: Business logos and image galleries
  • Form Submissions: User-uploaded files and images

Safety Features

  • Permission Checks: Proper capability validation for all operations
  • Input Sanitization: Comprehensive validation of field values and patterns
  • Early Returns: Processing stops immediately when disabled
  • Backup Compatibility: Original field values preserved during processing
  • Error Recovery: Graceful handling of malformed or corrupted field data

Performance Benefits

  • Batch Processing: Efficient handling of multiple fields per post
  • Smart Caching: Leverages existing cache infrastructure
  • Minimal Overhead: Zero performance impact when disabled
  • Optimized Queries: Efficient database operations for field detection

🚀 Database Optimization

  • Composite Index Creation: Automatically adds a composite index on postmeta table for (meta_key, meta_value) columns

💾 Intelligent Caching

  • Function Interception: Caches results of attachment_url_to_postid() calls
  • Smart Cache Keys: URL normalization ensures consistent caching regardless of query parameters
  • Automatic Cache Invalidation: Clears relevant cache when attachments are modified
  • Cache Warming: Optional bulk cache warming for existing attachments

🏗️ Enterprise-Ready Architecture

  • Namespaced: All code properly namespaced under AttachmentLookupOptimizer
  • Singleton Pattern: Plugin class uses singleton pattern for proper initialization
  • Modular Design: Separate classes for database management and caching
  • PSR-4 Autoloading: Custom autoloader for clean class loading

Installation

  1. Upload the plugin files to /wp-content/plugins/attachment-lookup-optimizer/
  2. Activate the plugin through the 'Plugins' menu in WordPress
  3. The plugin will automatically:
    • Create the necessary database indexes
    • Start caching attachment URL lookups
    • Hook into WordPress core functions
  4. Configure settings at Tools > Attachment Optimizer in your WordPress admin
  5. NEW in v1.0.9: Enable JetEngine/JetFormBuilder custom field rewriting in BunnyCDN settings (disabled by default)

Admin Interface

The plugin includes a comprehensive admin interface accessible via Tools > Attachment Optimizer in your WordPress admin dashboard.

Settings Page Features:

📊 Cache Settings

  • Adjustable TTL: Set cache duration from 60 seconds to 24 hours
  • Real-time Preview: See current cache duration in human-readable format
  • Auto-sync: Settings automatically sync with the caching system

📈 Database Status Dashboard

  • Index Status: Visual indicators for both database indexes
  • Creation Timestamps: When each index was created
  • Record Counts: Total postmeta and attachment-specific records
  • Real-time Monitoring: Current status of all optimizations

⚡ Cache Management

  • Clear All Cache: Instant cache purge with confirmation
  • Warm Cache: Pre-populate cache for 100 attachments
  • Cache Statistics: Current TTL, last clear time, and cache group info
  • Plugin Version: Track current plugin version

Admin Interface Screenshots:

Tools > Attachment Optimizer
├── Cache Settings
│   └── TTL Configuration (60-86400 seconds)
├── Database Status
│   ├── Main Index Status
│   ├── Attached File Index Status
│   ├── Creation Timestamps
│   └── Record Statistics
├── Cache Status
│   ├── Current TTL
│   ├── Cache Group
│   ├── Last Clear Time
│   └── Plugin Version
└── Actions
    ├── Clear All Cache
    └── Warm Cache (100 items)

How It Works

Database Index Optimization

The plugin creates a composite index on the wp_postmeta table:

CREATE INDEX alo_meta_key_value_idx ON wp_postmeta (meta_key(191), meta_value(191))

This index significantly speeds up queries that search for specific meta values, which is exactly what attachment_url_to_postid() does when looking up attachments by their file paths.

Caching Layer

The plugin intercepts calls to attachment_url_to_postid() and:

  1. Checks Cache First: Looks for cached results using normalized URLs as keys
  2. Calls Original Function: If no cache hit, calls the original WordPress function
  3. Stores Results: Caches both positive results (found attachment IDs) and negative results (not found)
  4. Smart Invalidation: Automatically clears cache when attachments are modified

Cache Management

  • Cache Group: alo_attachment_urls
  • Expiration: 5 minutes default (adjustable via admin interface)
  • Auto-clearing: Triggered on attachment add/edit/delete operations
  • URL Normalization: Uses md5($url) for consistent cache keys
  • Dual Cache System: Object cache with transient fallback

🔄 Intelligent Cache Selection

The plugin automatically chooses the best caching method available:

Primary: Object Cache

  • ✅ When Available: Redis, Memcached, or other persistent object cache
  • ✅ Performance: Fastest caching method
  • ✅ Persistence: Survives across requests and server restarts
  • ✅ Memory Efficient: Stored in dedicated cache servers

Fallback: Database Transients

  • ⚠️ When Used: No persistent object cache available
  • ⚠️ Storage: WordPress database (wp_options table)
  • ⚠️ Performance: Slower than object cache but still effective
  • ✅ Reliability: Always available on any WordPress installation

Automatic Detection

// The plugin automatically detects and uses the best method:
if (wp_using_ext_object_cache() && function_exists('wp_cache_get')) {
    // Use object cache (Redis/Memcached)
} else {
    // Fall back to database transients
}

File Structure

attachment-lookup-optimizer/
├── attachment-lookup-optimizer.php    # Main plugin file
├── includes/
│   ├── Plugin.php                     # Main plugin class
│   ├── DatabaseManager.php            # Database optimization
│   └── CacheManager.php               # Caching functionality
└── README.md                          # This file

Usage Examples

Once activated, the plugin works transparently. However, you can interact with it programmatically:

// Get plugin instance
$plugin = \AttachmentLookupOptimizer\Plugin::getInstance();

// Check if properly activated
if ($plugin->is_activated()) {
    echo 'Plugin is active and optimizing!';
}

// Get database statistics
$db_manager = new \AttachmentLookupOptimizer\DatabaseManager();
$stats = $db_manager->get_stats();

// Warm up cache for 500 attachments
$cache_manager = new \AttachmentLookupOptimizer\CacheManager();
$warmed = $cache_manager->warm_cache(500);

// Clear all attachment cache
$cache_manager->clear_all_cache();

Batch Lookup Preloading

The plugin includes powerful batch lookup functionality for processing multiple URLs efficiently:

🚀 Single SQL Query Optimization

Instead of multiple individual attachment_url_to_postid() calls:

// ❌ Inefficient: Multiple database queries
foreach ($urls as $url) {
    $post_id = attachment_url_to_postid($url);
    // Process $post_id...
}

Use the batch lookup function:

// ✅ Efficient: Single database query + caching
$results = alo_batch_url_to_postid($urls);
foreach ($results as $url => $post_id) {
    // Process $post_id...
}

🔧 Usage Examples

Basic Batch Lookup

$urls = [
    'https://example.com/wp-content/uploads/2024/image1.jpg',
    'https://example.com/wp-content/uploads/2024/image2.png',
    'https://example.com/wp-content/uploads/2024/image3.gif'
];

$results = alo_batch_url_to_postid($urls);
/*
Returns:
[
    'https://example.com/.../image1.jpg' => 123,
    'https://example.com/.../image2.png' => 124,
    'https://example.com/.../image3.gif' => 0    // Not found
]
*/

Preload URLs for Later Use

// Preload URLs into cache
$preloaded_count = alo_preload_urls($urls);
echo "Preloaded {$preloaded_count} URLs into cache";

// Later calls to attachment_url_to_postid() will be cached
$post_id = attachment_url_to_postid($urls[0]); // Cache hit!

Using the Cache Manager Directly

$plugin = \AttachmentLookupOptimizer\Plugin::getInstance();
$cache_manager = $plugin->get_cache_manager();

// Batch lookup with detailed control
$results = $cache_manager->batch_url_to_postid($urls);

// Get batch statistics
$stats = $cache_manager->get_batch_stats($urls);
echo "Cache hit ratio: {$stats['hit_ratio']}%";

⚡ Performance Benefits

Database Query Optimization

  • Single Query: Processes all URLs in one SQL statement
  • IN Clause: Uses efficient WHERE meta_value IN (...) syntax
  • Index Utilization: Leverages the plugin's database indexes
  • Sized Images: Automatically handles thumbnails and resized versions

Smart Cache Integration

  • Cache First: Checks cache for all URLs before database query
  • Batch Caching: Caches all results from the SQL query
  • Mixed Results: Combines cache hits and fresh database results
  • Automatic Invalidation: Cache clears when attachments are modified

📊 Batch Lookup Features

Comprehensive URL Support

  • ✅ Main Images: Original uploaded files
  • ✅ Sized Images: Thumbnails, medium, large variants
  • ✅ Custom Sizes: Any registered image size
  • ✅ Query Parameters: Automatically strips ?ver=123 etc.
  • ✅ Duplicate Handling: Removes duplicates automatically

Advanced Functionality

// Get detailed cache statistics
$cache_manager = $plugin->get_cache_manager();
$stats = $cache_manager->get_batch_stats($urls);

/*
Returns:
[
    'total_urls' => 100,
    'cache_hits' => 75,
    'cache_misses' => 25,
    'hit_ratio' => 75.0
]
*/

// Test cache functionality
$test_result = $cache_manager->test_cache($url);
// Includes cache method, transient keys, timing info

Debug Logging & Performance Monitoring

The plugin includes comprehensive debug logging to track excessive calls to attachment_url_to_postid(), particularly useful for identifying JetEngine performance issues.

🔍 Automatic Call Tracking

Threshold-Based Logging

  • ✅ Configurable Threshold: Default 3 calls per request (adjustable 1-50)
  • ✅ Automatic Detection: Logs when threshold is exceeded
  • ✅ Microtime Precision: Tracks execution time with microsecond accuracy
  • ✅ Memory Monitoring: Records memory usage for each call

🚀 JetEngine Detection

Smart Caller Identification

// Automatically detects and logs JetEngine calls
ALO DEBUG Call #4 [14:23:45.123]: CACHE MISS | 🚀 JETENGINE | JET_Engine\Modules\Gallery::get_image_data | gallery.php:156 | URL: /uploads/image.jpg | Memory: 45.2 MB | Time: 2.1234 ms

Supported Detection

  • ✅ JetEngine: Crocoblock's JetEngine plugin
  • ✅ Other Plugins: Any plugin in wp-content/plugins/
  • ✅ Themes: Active theme and child theme calls
  • ✅ WordPress Core: Core function calls

📊 Debug Log Output

Threshold Exceeded Alert

ALO DEBUG: attachment_url_to_postid() called 7 times (threshold: 3) on /gallery-page/

Detailed Call Logs

ALO DEBUG Call #1 [14:23:45.001]: CACHE HIT | 🎨 THEME | gallery_shortcode | functions.php:234 | URL: /uploads/2024/image1.jpg | Memory: 42.1 MB | Time: 0.0012 ms
ALO DEBUG Call #2 [14:23:45.045]: CACHE MISS | 🚀 JETENGINE | Jet_Engine_Gallery::process_item | gallery.php:89 | URL: /uploads/2024/image2.jpg | Memory: 43.8 MB | Time: 1.2345 ms
ALO DEBUG Call #3 [14:23:45.067]: CACHE HIT | 🔌 ELEMENTOR | ElementorPro\Modules\Gallery\Widget | gallery.php:123 | URL: /uploads/2024/image3.jpg | Memory: 44.2 MB | Time: 0.0008 ms

Request Summary

ALO DEBUG SUMMARY: 7 total calls | 4 cache hits | 3 cache misses | 2 JetEngine calls | 15.6789 ms total | URL: /gallery-page/

⚙️ Configuration Options

Admin Interface Settings

Tools > Attachment Optimizer
├── Debug Logging: ☑ Enable debug logging
└── Debug Threshold: [3] calls before logging

Programmatic Configuration

// Enable/disable debug logging
add_filter('alo_debug_logging_enabled', '__return_true');

// Set custom threshold
add_filter('alo_debug_threshold', function() { return 5; });

// Use custom log file
add_filter('alo_use_custom_log_file', '__return_true');
add_filter('alo_log_directory', function() { 
    return WP_CONTENT_DIR . '/debug-logs'; 
});

📁 Log File Options

Default: WordPress Error Log

// Uses standard WordPress error_log()
// Location: /wp-content/debug.log (if WP_DEBUG_LOG enabled)

Custom Log Files (Optional)

// Enable custom log files
add_filter('alo_use_custom_log_file', '__return_true');

// Custom log location
add_filter('alo_log_directory', function() {
    return WP_CONTENT_DIR . '/uploads/alo-logs';
});

// Creates daily log files:
// /wp-content/uploads/alo-logs/attachment-lookups-2024-01-15.log

🛠️ Developer Tools

Get Debug Statistics

$plugin = \AttachmentLookupOptimizer\Plugin::getInstance();
$cache_manager = $plugin->get_cache_manager();

$debug_stats = $cache_manager->get_debug_stats();
/*
Returns:
[
    'call_count' => 7,
    'debug_threshold' => 3,
    'debug_logging_enabled' => true,
    'threshold_exceeded' => true,
    'call_log' => [...] // Detailed call information
]
*/

Manual Debug Control

// Enable debug logging programmatically
$cache_manager->set_debug_logging(true);
$cache_manager->set_debug_threshold(5);

🎯 Use Cases

JetEngine Performance Analysis

  • Gallery Widgets: Track excessive lookups in JetEngine galleries
  • Listing Grids: Monitor attachment processing in dynamic listings
  • Meta Fields: Identify inefficient image field rendering
  • Custom Post Types: Track attachment usage in CPT displays

Theme Development

  • Gallery Shortcodes: Optimize custom gallery implementations
  • Featured Images: Monitor theme's attachment processing
  • Widget Development: Track attachment lookups in custom widgets
  • Page Builders: Identify inefficient attachment usage patterns

This debug logging system provides detailed insights into attachment lookup patterns, helping developers optimize their implementations and identify performance bottlenecks!

Upload Preprocessing & Reverse Mappings

The plugin includes intelligent upload preprocessing that creates reverse mappings during file uploads, enabling lightning-fast lookups that skip expensive database queries entirely.

⚡ How Upload Preprocessing Works

Automatic Reverse Mapping Creation

  • ✅ WordPress Core Uploads: Hooks into wp_handle_upload and add_attachment
  • ✅ JetFormBuilder Integration: Hooks into jet-form-builder/file-upload/after-upload
  • ✅ Custom Meta Storage: Stores _alo_cached_file_path for instant lookups
  • ✅ Upload Source Tracking: Records upload source and metadata

Database Schema

-- Reverse mapping meta field
meta_key: '_alo_cached_file_path'
meta_value: 'jet-form-builder/xyz.jpg'  -- Relative file path

-- Upload source tracking
meta_key: '_alo_upload_source'
meta_value: {
    "source": "jetformbuilder",
    "timestamp": 1642680000,
    "form_id": 123,
    "field_name": "upload_field"
}

🚀 Lightning-Fast Lookups

Three-Tier Lookup Strategy

  1. Cache Hit: Return cached result instantly
  2. Fast Lookup: Query reverse mapping (single indexed lookup)
  3. Fallback: Traditional attachment_url_to_postid() with full caching

Performance Comparison

// ❌ Traditional: Multiple table joins + expensive queries
SELECT p.ID FROM wp_posts p 
INNER JOIN wp_postmeta pm ON p.ID = pm.post_id 
WHERE p.post_type = 'attachment' 
AND pm.meta_key = '_wp_attached_file' 
AND pm.meta_value = 'path/to/file.jpg'

// ✅ Fast Lookup: Single indexed query
SELECT post_id FROM wp_postmeta 
WHERE meta_key = '_alo_cached_file_path' 
AND meta_value = 'path/to/file.jpg'

🔧 Upload Source Support

WordPress Core Uploads

// Automatically processes all media library uploads
add_action('add_attachment', 'process_new_attachment');
add_filter('wp_handle_upload', 'handle_wp_upload');

JetFormBuilder Integration

// Hooks into JetFormBuilder upload completion
add_action('jet-form-builder/file-upload/after-upload', 'handle_jetformbuilder_upload');

// Stores additional metadata
$source_info = [
    'source' => 'jetformbuilder',
    'form_id' => 123,
    'field_name' => 'document_upload'
];

Existing Attachment Processing

// Bulk process existing attachments
$plugin = \AttachmentLookupOptimizer\Plugin::getInstance();
$preprocessor = $plugin->get_upload_preprocessor();
$result = $preprocessor->bulk_process_existing_attachments(200);

📈 Admin Interface Integration

Upload Preprocessing Dashboard

Tools > Attachment Optimizer
├── Upload Preprocessing
│   ├── Total Attachments: 1,234
│   ├── Cached Attachments: 987 (80%)
│   ├── JetFormBuilder Uploads: 156
│   └── Coverage Status: ✅ Good
└── Actions
    ├── Bulk Process Attachments (200)
    └── Test Fast Lookup Performance

Coverage Indicators

  • ✅ 80%+ Coverage: Excellent optimization
  • ⚠️ 50-79% Coverage: Good but can improve
  • ✗ <50% Coverage: Needs bulk processing

🛠️ Developer Functions

Fast Path Lookup

// Direct file path to attachment ID lookup
$attachment_id = alo_get_attachment_by_path('jet-form-builder/document.pdf');

if ($attachment_id) {
    echo "Found attachment: " . $attachment_id;
} else {
    echo "File not found in reverse mapping";
}

Reverse Mapping Check

// Check if attachment has reverse mapping
$has_mapping = alo_has_reverse_mapping($attachment_id);

if ($has_mapping) {
    echo "⚡ Fast lookup available";
} else {
    echo "⚠️ Will use traditional lookup";
}

Upload Source Information

// Get detailed upload source info
$source_info = alo_get_upload_source($attachment_id);

/*
Returns:
[
    'source' => 'jetformbuilder',
    'timestamp' => 1642680000,
    'form_id' => 123,
    'field_name' => 'document_upload',
    'url' => 'https://example.com/uploads/file.jpg'
]
*/

⚙️ Configuration & Management

Automatic Processing

  • ✅ New Uploads: Automatically processed during upload
  • ✅ Background Processing: Bulk process existing attachments
  • ✅ Memory Efficient: Processes in batches of 50-200
  • ✅ Progress Tracking: Shows processing status and results

Bulk Processing via Admin

// Via admin interface
Tools > Attachment Optimizer > Bulk Process Attachments (200)

// Programmatically
$plugin = \AttachmentLookupOptimizer\Plugin::getInstance();
$preprocessor = $plugin->get_upload_preprocessor();

// Process 200 attachments at a time
$result = $preprocessor->bulk_process_existing_attachments(200, 0);
echo "Processed: " . $result['processed'] . " attachments";

Statistics and Monitoring

// Get comprehensive statistics
$stats = $preprocessor->get_stats();

/*
Returns:
[
    'total_attachments' => 1234,
    'cached_attachments' => 987,
    'jetformbuilder_uploads' => 156,
    'coverage_percentage' => 80.0
]
*/

🎯 Use Cases & Benefits

JetFormBuilder Optimization

  • Form Uploads: Instant lookup for user-submitted files
  • Gallery Processing: Fast attachment resolution in dynamic galleries
  • File Management: Quick file validation and processing

Performance Gains

  • Query Reduction: Skip expensive table joins
  • Index Utilization: Use optimized postmeta indexes
  • Memory Efficiency: Reduce database load and memory usage
  • Cache Enhancement: Faster cache warming and population

Compatibility

  • ✅ Universal: Works with any upload method
  • ✅ Retroactive: Process existing attachments
  • ✅ Safe: Non-destructive, can be disabled anytime
  • ✅ Clean: Removes all data on plugin uninstall

The upload preprocessing system transforms expensive attachment lookups into lightning-fast indexed queries, providing significant performance improvements especially for sites with heavy file usage patterns!

Global Override & Complete Replacement

The plugin includes a comprehensive global override system that completely replaces WordPress's attachment_url_to_postid() function with an optimized multi-tier lookup strategy.

🔄 Global Override vs Filter Mode

Filter Mode (Default)

  • ✅ Safe: Hooks into existing WordPress filter system
  • ✅ Compatible: Works alongside other plugins that modify the function
  • ⚠️ Limited: Still calls original WordPress function as fallback
  • ⚠️ Overhead: Multiple function calls and filter overhead

Global Override Mode (Recommended)

  • ✅ Complete Replacement: Entirely replaces the WordPress core function
  • ✅ Maximum Performance: Eliminates all original function overhead
  • ✅ Multi-Tier Strategy: Comprehensive fallback system with legacy support
  • ⚠️ Advanced: More aggressive optimization requiring careful testing

🚀 Multi-Tier Lookup Strategy

The global override implements a sophisticated 4-tier lookup system:

TIER 1: Cache Hit 💾

// Instant return from cache (Redis/Memcached or transients)
$cached_result = wp_cache_get($cache_key, 'alo_attachment_urls');
if ($cached_result !== false) {
    return $cached_result; // ⚡ Microsecond response
}

TIER 2: Fast Lookup ⚡

// Direct query using reverse mappings (single indexed lookup)
SELECT post_id FROM wp_postmeta 
WHERE meta_key = '_alo_cached_file_path' 
AND meta_value = 'path/to/file.jpg'
LIMIT 1

TIER 3: Optimized SQL Lookup 🔍

// Optimized exact match with sized image support
SELECT p.ID FROM wp_posts p
INNER JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'attachment'
AND pm.meta_key = '_wp_attached_file'
AND pm.meta_value = 'exact/path/match.jpg'

TIER 4: Legacy Fallback 🔄

// WordPress-compatible pattern matching for edge cases
WHERE (pm.meta_value = %s OR pm.meta_value = %s OR pm.meta_value LIKE %s)
ORDER BY p.post_date DESC

⚙️ Configuration & Control

Admin Interface Configuration

Tools > Attachment Optimizer
└── Cache Settings
    ├── Global Override: ☑ Enable global override
    └── Status: ✅ Enabled (Full Replacement)

Programmatic Control

// Enable global override via filter
add_filter('alo_enable_global_override', '__return_true');

// Check current status
$global_override = get_option('alo_global_override', false);

// Get cache manager configuration
$plugin = \AttachmentLookupOptimizer\Plugin::getInstance();
$cache_manager = $plugin->get_cache_manager();

📊 Enhanced Debug Logging

The global override provides detailed lookup type tracking:

Lookup Type Indicators

ALO DEBUG Call #1: CACHE HIT 💾 | result in 0.001ms
ALO DEBUG Call #2: FAST LOOKUP ⚡ | result in 0.05ms  
ALO DEBUG Call #3: SQL LOOKUP 🔍 | result in 1.2ms
ALO DEBUG Call #4: LEGACY FALLBACK 🔄 | result in 5.8ms
ALO DEBUG Call #5: PRE-EXISTING ✅ | already had result
ALO DEBUG Call #6: INVALID URL ❌ | malformed URL

Request Summary with Breakdown

ALO DEBUG SUMMARY: 15 total calls | 8 cache_hit | 4 fast_lookup | 2 sql_lookup | 1 legacy_fallback | 3 JetEngine calls | 12.34ms total

🧪 Testing & Validation

Test Individual Lookups

// Test a specific URL and see which method was used
$test_result = alo_test_lookup('https://example.com/uploads/image.jpg');

/*
Returns:
[
    'url' => 'https://example.com/uploads/image.jpg',
    'result' => 123,
    'execution_time' => 0.245,  // milliseconds
    'method' => 'fast_lookup',
    'calls_made' => 1,
    'global_override' => true
]
*/

echo "Lookup method: " . $test_result['method'];
echo "Execution time: " . $test_result['execution_time'] . "ms";

Performance Comparison

// Disable override for comparison
update_option('alo_global_override', false);
$slow_result = alo_test_lookup($url);

// Enable override for optimized lookup
update_option('alo_global_override', true);
$fast_result = alo_test_lookup($url);

$speedup = $slow_result['execution_time'] / $fast_result['execution_time'];
echo "Performance improvement: {$speedup}x faster";

🔧 URL Normalization & Validation

The global override includes robust URL handling:

Automatic URL Cleaning

// Removes query parameters and fragments
'image.jpg?ver=123#section' → 'image.jpg'

// Validates URL format
filter_var($url, FILTER_VALIDATE_URL)

// Handles relative and absolute paths
'/uploads/file.jpg' → 'uploads/file.jpg'

Upload Directory Validation

// Only processes URLs from WordPress upload directory
$upload_dir = wp_upload_dir();
if (strpos($url, $upload_dir['baseurl']) === 0) {
    // Process with optimized lookup
} else {
    // Skip optimization for external URLs
    return 0;
}

📈 Performance Benefits

Query Optimization Results

  • 50-90% Faster: Cache hits return in microseconds
  • Reduced Database Load: Single indexed queries vs multiple table joins
  • Memory Efficiency: Optimized query patterns reduce memory usage
  • Scalability: Performance improves with larger attachment libraries

Real-World Performance Examples

// Traditional WordPress (multiple queries + joins)
attachment_url_to_postid($url); // 5-15ms typical

// Global Override - Cache Hit
attachment_url_to_postid($url); // 0.001-0.01ms

// Global Override - Fast Lookup  
attachment_url_to_postid($url); // 0.05-0.2ms

// Global Override - SQL Lookup
attachment_url_to_postid($url); // 0.5-2ms

// Global Override - Legacy Fallback
attachment_url_to_postid($url); // 2-8ms (still faster than original)

🎯 Use Cases & Compatibility

Ideal for Global Override

  • ✅ High-Traffic Sites: Maximum performance needed
  • ✅ Gallery-Heavy Sites: Many attachment lookups per page
  • ✅ JetEngine Users: Optimize dynamic content generation
  • ✅ Page Builders: Optimize Elementor, Gutenberg block rendering

Consider Filter Mode

  • ⚠️ Development Sites: Testing and debugging environments
  • ⚠️ Plugin Conflicts: Sites with custom attachment modifications
  • ⚠️ Legacy Themes: Older themes with non-standard attachment handling

Migration Strategy

// 1. Start with filter mode (default)
update_option('alo_global_override', false);

// 2. Test thoroughly with your content
$test_urls = ['url1', 'url2', 'url3'];
foreach ($test_urls as $url) {
    $result = alo_test_lookup($url);
    // Verify results match expectations
}

// 3. Enable global override for maximum performance
update_option('alo_global_override', true);

// 4. Monitor debug logs for any issues
// Check error logs for 'ALO DEBUG' messages

🛡️ Safety & Fallbacks

Comprehensive Error Handling

  • Invalid URLs: Gracefully handle malformed URLs
  • Missing Attachments: Proper handling of deleted/moved files
  • Database Errors: Fallback to legacy methods on SQL errors
  • Memory Limits: Efficient processing within PHP limits

Automatic Fallback Chain

  1. Cache fails → Try fast lookup
  2. Fast lookup fails → Try optimized SQL
  3. SQL fails → Use legacy WordPress patterns
  4. All fail → Return 0 (not found)

Each tier is completely independent, ensuring maximum reliability!

The global override system provides the ultimate optimization for WordPress attachment lookups, delivering enterprise-grade performance with complete safety and compatibility!

Performance Optimizations

The plugin implements multiple performance tiers for maximum speed:

TIER 1: Cache Hit (0.001-0.01ms)

  • Instant return from cache (Redis/Memcached or transients)
  • 100-1000x faster than WordPress core

TIER 1.5: Custom Lookup Table (0.001-0.005ms) 🚀 NEW!

  • Ultra-fast dedicated indexed table: wp_attachment_lookup
  • PRIMARY KEY on file_path: O(1) lookup performance
  • Single source of truth: Eliminates complex postmeta JOINs
  • Auto-sync: Maintains data integrity with WordPress operations
  • 1000x faster than WordPress core lookups

TIER 2: Fast Lookup (0.05-0.2ms)

  • Reverse mapping via upload preprocessor
  • 25-100x faster than WordPress core

TIER 3: Optimized SQL (0.5-2ms)

  • Enhanced database queries with exact meta_value matching
  • 3-10x faster than WordPress core

TIER 4: Legacy Fallback (2-8ms)

  • WordPress-compatible pattern matching
  • Still faster than original implementation

Custom Lookup Table (Ultimate Performance) 🚀

The plugin creates a dedicated wp_attachment_lookup table for ultra-fast attachment URL lookups:

Table Structure

CREATE TABLE wp_attachment_lookup (
    file_path VARCHAR(512) PRIMARY KEY,
    post_id BIGINT UNSIGNED NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    KEY idx_post_id (post_id),
    KEY idx_created_at (created_at)
) ENGINE=InnoDB;

Key Benefits

  • PRIMARY KEY lookup: O(1) performance via MySQL B-tree index
  • Single query: No complex JOINs or LIKE operations
  • Dedicated table: Optimized specifically for file path lookups
  • Auto-population: Syncs automatically with WordPress uploads
  • Batch operations: Efficient bulk processing for existing attachments

Performance Comparison

Method Time Speedup
WordPress Core 2-8ms 1x
Optimized SQL 0.5-2ms 3-10x
Custom Table 0.001-0.005ms 1000x

Usage

The custom lookup table is automatically:

  • Created on plugin activation
  • Populated during file uploads (WordPress core & JetFormBuilder)
  • Queried as the highest priority lookup method
  • Maintained through attachment lifecycle events

Admin Controls

  • Rebuild Table: Populate from all existing attachments
  • Statistics: View table size, mappings count, and performance metrics
  • Auto-sync: Monitor real-time population during uploads

JetEngine Preloading (N+1 Query Elimination) 🚀

The plugin includes intelligent JetEngine preloading that hooks into JetEngine's listing

This README is longer than the copy stored here. Read the rest on GitHub →