Description
eXPDesigns Speed is a privacy-friendly performance toolkit for WordPress. It combines conservative public-page caching, background cache warming, WebP image tools, responsive image delivery, local asset optimization and plain-language recovery controls without an external optimization account.
The plugin starts with compatibility-sensitive controls disabled. Site owners review public content and exclusions before enabling shared caching, can inspect every cache decision through response headers, and can restore safe settings when a frontend optimization conflicts with the site.
Key Features
- Public-page disk cache with automatic page/post discovery and configurable lifetimes.
- Optional early cache that can serve validated HTML before WordPress loads.
- Automatic background cache warming after clearing or supported content changes.
- Clear cache status, exact bypass reasons and a three-request homepage test.
- Page-specific image discovery and batches of up to 100 Media Library attachments.
- Non-destructive WebP generation for originals and existing WordPress thumbnails.
- Responsive image candidates, intrinsic dimensions, lazy loading and exact LCP image priority.
- Reversible local CSS/JavaScript minification and opt-in asynchronous CSS or script defer.
- Optional marked Apache browser-cache and text-compression rules.
- Google Fonts display control, WordPress emoji removal and optional jQuery Migrate removal.
- Compatibility exclusions, frontend verification and one-click safe recovery.
- No telemetry, optimization account, remote license check or paid image quota.
Public Elementor forms
The optional Public Elementor forms setting is off by default. Enable only after reviewing that all eligible pages, forms, known public frontend configurations and consent markup contain identical guest content without custom visitor tokens. The compatibility inspector accepts standard unfilled Elementor contact fields, known guest configuration script IDs and standard unnamed Complianz category checkboxes. It does not modify forms or reCAPTCHA. Custom form actions, unknown forms/hidden fields, prefilled text and password/file fields remain excluded. Cookie-bearing, AJAX, POST and commerce contexts remain excluded by the existing rules.
In this mode the cache lifetime is capped at ten minutes and keys include the WordPress nonce tick. This is not proof of compatibility with arbitrary form actions, custom nonce filters, personalization, shortened provider tokens or Elementor extensions. Verify real form submission, consent interactions and email delivery on staging after enabling. The plugin does not submit forms during its cache probe.
Conservative exclusions
Cookie-bearing requests, query strings, authenticated requests, previews, non-GET requests, password-protected content, non-public posts and unsupported page types bypass caching. Responses with forms, common nonce or commerce markers, cookies, private cache directives or non-HTML content are not stored.
When WooCommerce is present, its shop/cart/checkout/account contexts and active sessions bypass caching. These safeguards are not a claim of complete compatibility with arbitrary extensions or custom personalization. Elementor and Germanized regression testing on your particular site is still necessary.
Scope and limitations
The standard cache serves output after WordPress and plugins load. The optional owned early-cache drop-in can serve previously validated anonymous HTML before WordPress loads. Background warming discovers published pages and posts in small batches. It depends on WordPress cron and loopback requests. This release does not generate per-page critical CSS or delay scripts until interaction.
Any cookie causes a bypass, including analytics or consent cookies. Pages with forms or common dynamic markers may therefore remain uncached. Multisite is not supported. Unknown personalization cannot be automatically detected: only approve content suitable for shared public output. Dynamic mobile/device, language, currency, location and membership variations require exclusion.
No PageSpeed score or performance gain is guaranteed. Measure multiple runs and test user interactions. An existing advanced-cache.php or recognized active page-cache plugin causes a bypass; no competing files are overwritten. WP_CACHE set to true on its own does not block caching. The dashboard identifies the detected blocker.
Image Optimization
Open eXPDesigns Speed > Image Optimization and start with one image. WebP support is required on the host. Quality is 82; only copies smaller than their source are used. Original files and attachment metadata are not replaced. WordPress-generated attachment image URLs and responsive sources are filtered while the plugin is active. Rendered img tags with a wp-image attachment class also use mapped local copies, including cached builder output. Unidentified hardcoded content, CSS backgrounds, CDN URLs and external images are not rewritten. Verify actual image delivery in the browser, particularly with Elementor.
Manual batch optimization is available in Media Library list view, up to three attachments per action. Automatic optimization of new uploads is optional and off by default. It can increase upload time. Each attachment processes at most 20 variants, each limited to 15 MB and 12 megapixels. Animated PNG/GIF, SVG and existing WebP/AVIF are skipped. Existing WordPress thumbnails are used as responsive candidates; original pixel files are not destructively resized. The plugin cannot infer every Elementor container width or rewrite CSS background images. Do not enable overlapping image conversion in another optimizer.
Frontend Optimization
Optimized image delivery now runs before standard and early page-cache storage, so cache hits retain verified WebP URLs. Identifiable attachment images can receive missing intrinsic dimensions and responsive candidates. Enter the exact local homepage LCP image URL reported by PageSpeed before enabling Responsive image loading. The selected image becomes eager/high priority and receives one preload. Other responsive lazy images receive an auto sizes prefix so compatible browsers can use rendered layout width when selecting a source. Verify the actual LCP element and page appearance after enabling.
Google Fonts display=swap and WordPress emoji removal are enabled by default. jQuery Migrate removal and ordinary HTML-comment removal are off by default compatibility controls. HTML comment removal preserves WordPress block and legacy conditional comments and does not alter inline CSS or JavaScript. Disable any control and clear/preload cache to roll back its rendered output.
Local CSS minification and conservative JavaScript compaction create versioned copies under wp-content/cache/expdesigns-speed-assets without editing original files. Optional asynchronous CSS delivery converts eligible local content stylesheets to non-blocking preload links with a no-JavaScript fallback. External, print, alternate, already preloaded, admin-bar and explicitly excluded styles remain unchanged. Safe script defer is opt-in and protects common jQuery, Elementor, WooCommerce, reCAPTCHA and consent handles. Use handle or URL-fragment exclusions for site-specific assets and test the header, hero, menus, sliders, forms, consent and commerce after enabling. Combining CSS or JavaScript is not performed.
Restore removes the delivery mapping and clears this plugin’s page cache. Clear other page/CDN caches yourself. Deactivation also stops filtered delivery. Generated copies remain beside the originals so existing cached links do not break; savings describe transfer-byte reduction across variants, not disk space recovered. Originals plus copies use more disk space. On uninstall, mappings and the upload option are removed, but generated copies are retained.
Batch processing and performance reports
The Image Optimization page can process 100 attachments per batch, one request at a time. Keep the page open. Pause waits for the current image to finish; Resume retries unfinished work. After completion start the next batch. There is no paid lifetime image quota. A failed request can retain a processing lock for ten minutes. Queue IDs, cursor and imported report summaries are stored locally per administrator. Library additions/deletions can change pagination; after the last batch, start again to rescan. The image table refreshes on page reload.
Page-specific image optimization lets an administrator select a published page and prepares a batch of up to 100 unique image attachments found in its featured image, normal content and Elementor page data. It prioritizes page work but does not prove that every visually rendered image was found. Theme headers/footers, CSS background URLs without attachment IDs, dynamically injected images, external URLs and reusable templates stored outside the selected page may need separate optimization.
Performance Report accepts Lighthouse or PageSpeed API JSON (maximum 5 MB), retaining selected audit titles, values, scores, tested URL and timestamp; full JSON is discarded. Findings are imported measurements, not automatic fixes. The Google PageSpeed link opens an external service and shares the website URL only when clicked. No API key or background Google request is used. Server-rule controls are explicit administrator actions and are never enabled during activation or update.
Privacy
The homepage test makes three cookie-free requests to the site itself when an administrator starts it. When automatic warming or frontend verification is enabled, WordPress cron also makes cookie-free requests to published URLs on the same site. These loopback requests do not send content to eXPDesigns or another external service. The last manual cache-status result is retained for five minutes per administrator; background progress and the latest health result are stored as WordPress options. The plugin sends no telemetry and requires no account or license. Cache files contain approved public HTML, creation timestamps and generation identifiers. Request keys are hashed. Cookies are inspected only to bypass caching; their values are not logged or stored. Page cache files are kept in wp-content/cache/expdesigns-speed and generated CSS/JavaScript copies in wp-content/cache/expdesigns-speed-assets. Limits are 100 standard and 100 early files and 2 MiB of HTML per entry, plus encoding overhead. Expired entries are not served and content changes invalidate the cache generation before background warming begins.
Development
Readable PHP, JavaScript and CSS source are included. No JavaScript bundler, build service or third-party runtime library is required. The expds_bypass_cache filter can add exclusions; it cannot override the built-in safeguards.
Screenshots



Installation
- Back up the site and install on staging first.
- Resolve existing page-cache integrations using their providers’ removal instructions. Do not blindly remove shared cache drop-ins or wp-config.php settings.
- Upload the expdesigns-speed folder to wp-content/plugins, or upload the release ZIP in Plugins > Add New Plugin > Upload Plugin.
- Activate eXPDesigns Speed and open its admin menu.
- Review public pages, exclude personalized URLs, select the content acknowledgement, and enable automatic caching.
- Run the three-request homepage test. MISS-STORED followed by HIT means standard caching works. Optionally install the owned early cache; EARLY-HIT confirms delivery before WordPress.
- Optionally enable marked Apache asset rules after backing up .htaccess, then verify the site and asset headers immediately.
- Edit the page and verify that the next visit shows the update. Test menus, forms, consent and commerce flows.
FAQ
-
Will this achieve a 90+ PageSpeed score?
-
No particular score is guaranteed. Hosting, assets, content and third-party integrations still affect performance. This release focuses on conservative template caching.
-
Why is my page bypassed?
-
Inspect its X-eXPDesigns-Cache header. Common reasons are cookies, query strings, forms, nonce/commerce markers, private headers and another active cache integration. Pages with these conditions may intentionally remain uncached.
-
Must I preload the homepage every time?
-
No. When automatic cache warming is enabled, WordPress cron warms eligible pages in the background after clearing or supported invalidation events. The homepage button is an immediate diagnostic test. A first eligible visitor can also create the cache entry.
-
What do MISS-STORED, HIT and EARLY-HIT mean?
-
MISS-STORED means WordPress generated an eligible response and the plugin stored it. HIT means the standard cache served a stored response after WordPress loaded. EARLY-HIT means the optional early cache served the response before normal WordPress loading.
-
Can CSS or JavaScript optimization change the design?
-
It can on some themes or page builders, so asynchronous CSS, script defer, jQuery Migrate removal and HTML comment removal are opt-in. Enable one compatibility-sensitive control at a time, clear and preload cache, and test the header, hero, navigation, forms, consent and responsive layouts. Asset exclusions and Restore safe settings provide a reversible path.
-
Does this modify wp-config.php, .htaccess or advanced-cache.php?
-
It never changes wp-config.php. An administrator can explicitly install the owned early-cache drop-in only when WP_CACHE is already true and no foreign advanced-cache.php exists. An administrator can explicitly add a marked static-asset section to the root .htaccess; other sections remain in place. Both integrations are removed on deactivation or uninstall when ownership checks succeed. Server or CDN configuration can override .htaccess. Cache PHP files terminate on direct access without returning stored data.
-
What happens on deactivation and uninstall?
-
Deactivation clears owned page and generated asset caches, disables caching, cancels background events, and removes the owned early-cache drop-in and active asset rules; configuration is retained. Uninstall removes configuration, mappings and owned integrations on single-site installations. Generated WebP copies and tiny protection/coordination files remain. Other providers’ files are untouched.
-
Can I use it on a shop or Elementor website?
-
Use staging first. Built-in checks exclude WooCommerce contexts and sessions, and common form/commerce markup. Elementor save and file-clear events invalidate the cache. These checks do not establish universal compatibility with Elementor, Germanized or third-party extensions.
-
How do exclusions work?
-
Add one path prefix per line, for example /contact/. It matches that path and descendants at slash boundaries. A single / excludes everything. Query strings are always bypassed; wildcards are not supported.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“eXPDesigns Speed” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “eXPDesigns Speed” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
0.8.1
- Replaces the ambiguous private-context cache result with the exact safe bypass reason.
- Adds a Site Health check for active PHP sessions and DONOTCACHE constants.
0.8.0
- Adds opt-in asynchronous delivery for eligible local stylesheets to reduce render blocking.
- Preserves external, print, alternate, preloaded, admin-bar and explicitly excluded stylesheets.
- Keeps safe recovery able to disable asynchronous CSS and clear generated caches.
0.7.6
- Adds a plain-language setup status for page cache, WP_CACHE, early cache and automatic preload.
- Shows the exact safe wp-config.php instruction required for early cache without editing the file automatically.
- Explains standard and early cached copies, presents friendly preload states and clarifies why PageSpeed can remain low after a cache hit.
0.7.5
- Restore conservative cache invalidation for every content and metadata change.
- Retain the Essential Addons compatibility rule and clearer early-cache status indicators.
0.7.4
- Hide the WP_CACHE setup notice after the owned early-cache drop-in is installed.
- Clear an obsolete homepage-test result whenever early-cache status changes.
0.7.3
- Prevent volatile frontend widget metadata updates from invalidating the anonymous page currently being captured.
- Keep normal invalidation for administrative edits and independent content-change requests.
0.7.2
- Recognize Essential Addons for Elementor’s public frontend configuration when reviewed Elementor form caching is enabled.
- Keep unknown inline nonce and password markup excluded from cache.
0.7.1
- Add a plain-language Site Health & Recovery page for cache storage, conflicts, WebP, cron and HTTPS.
- Preserve the previous settings, verify the homepage after settings changes and roll back on a confirmed server error or incomplete HTML response.
- Add a nonce-protected one-click safe recovery that disables compatibility-sensitive optimizations and clears plugin caches.
- Clear optimized asset files and pending background events during deactivation.
- Add a restrained, plugin-only Pro roadmap and comparison page without tracking, locked Free controls or automatic external requests.
- Add a Quick start guide with direct links to recovery and page-specific image optimization.
0.7.0
- Replace hourly full-cache invalidation with automatic background warming in five-URL batches.
- Add manual full-site preload, progress status and automatic warming after cache clearing or content invalidation.
- Extend configurable cache lifetime to 24 hours with a six-hour default for new installations.
- Add reversible local CSS minification and conservative JavaScript file compaction.
- Add opt-in script defer with protections and URL-fragment exclusions.
0.6.3
- Show page-specific images in a paginated table with thumbnails, formats and optimization status.
- Add select-all, selected-image and all-supported-image optimization actions directly to the page results.
- Add 10, 25, 50 and 100 images-per-page controls and automatically start submitted page batches.
0.6.2
- Add page-specific image discovery for published pages, normal content, featured images and Elementor page data.
- Prepare detected page images as a resumable batch of up to 100 unique attachments.
- Display the detected image list before optimization.
0.6.1
- Replace the unreliable generic LCP heuristic with an exact local homepage LCP URL control.
- Add
sizes=autoenhancement for responsive lazy images so compatible browsers can consider rendered width. - Remove competing high-priority hints when an exact LCP image is configured.
0.6.0
- Apply verified WebP delivery before both cache layers store HTML.
- Add optional LCP image priority, single-image preload and later-image lazy loading.
- Add responsive sources and intrinsic dimensions to identifiable attachment markup when missing.
- Add Google Fonts display and emoji controls plus opt-in jQuery Migrate and HTML-comment controls.
0.5.1
- Show standard and early page-cache files separately in dashboard statistics.
- Delete early files during cache clearing and remove the stale homepage-test result.
0.5.0
- Add an optional owned early-cache drop-in that serves validated anonymous HTML before WordPress loads.
- Add reversible Apache static-asset expiry and compression rules through a marked .htaccess section.
- Preserve strict cookie, query, authorization, method, admin, API and commerce bypass rules in early cache.
- Remove owned early-cache and asset integrations on deactivation.
0.4.2
- Prevent unrelated runtime option updates from invalidating an in-progress page cache write.
- Keep automatic invalidation for known public-output, Elementor, WooCommerce and Germanized settings.
- Report distinct storage, generation-change and response-size bypass reasons.
0.4.1
- Add optional reviewed public Elementor contact-form compatibility with specific bypass reasons.
- Keep cookies, private responses, unknown forms, custom hidden fields and prefilled text excluded.
- Cap compatibility-mode cache TTL at ten minutes and partition by WordPress nonce tick.
- Clarify enabled-but-empty cache status.
0.4.0
- Add one-click, resumable browser-driven batches of up to 100 attachments; repeat batches remain free.
- Rewrite known attachment image src/srcset in rendered HTML, including builder output that bypasses standard image hooks.
- Add local Lighthouse JSON report import and performance guidance. No automatic Google connection or automatic CSS/JS/hosting changes.
0.3.0
- Add local WebP optimization for JPEG and static PNG attachments, preserving originals and dimensions.
- Serve smaller copies through WordPress attachment image and responsive-source filters.
- Add original-delivery restore, savings report, optional optimization of new uploads and manual batches of up to three attachments.
0.2.0
- Automatically select eligible published pages and posts without IDs.
- Require renewed content acknowledgement for upgrades from ID-based settings.
- Add Clear cache to the administrator toolbar.
0.1.1
- Allow caching when WP_CACHE is true without a cache drop-in or recognized active cache plugin.
- Identify the exact detected cache conflict and missing setup requirements.
- Preserve configuration files and existing drop-in protection.
0.1.0
- Initial conservative public-page template cache.
- Explicit page selection, content acknowledgement and exclusions.
- Automatic invalidation, local diagnostics and safe manual clearing.
