What matters
Loading time isn't a feeling, it's measurable. Use metrics from Google's Core Web Vitals. Focus on three points: Largest Contentful Paint, Interaction to Next Paint, Cumulative Layout Shift.
Goals: LCP < 2,5 s, INP < 200 ms, CLS < 0,1. This is how you set priorities and see progress.
Rapid diagnosis in 10 minutes
- PageSpeed test: Measure the homepage, category page, product detail page, and checkout. Note LCP, INP, CLS, and TTFB.
- Waterfall analysis: Check the first 10 requests. Look for large images, fonts, and blocking JavaScript.
- Query Monitor: Check for slow database queries, hooks, and HTTP calls to external services.
- WooCommerce status: Under System Status you will see HPOS, Database, Cron, Queues.
- Server facts: PHP version, OPcache active, HTTP/2 or HTTP/3, Brotli or gzip.
Top reasons for slow WooCommerce shops

- No object-level caching. Many repeated database reads.
- Postmeta bottleneck for orders. Orders are stuck in
wp_postsandwp_postmeta, that slows it down. - Cart Fragments run on all sides and keep the cache warm.
- Images too large, no modern formats, incorrect sizes.
- Too many plugins and hooks on production sites.
- External scripts block rendering or wait for consent.
- Heavy theme features on PLP and PDP. Variant logic in the frontend.
- Action Scheduler is overflowing, Cron is ticking too infrequently.
- Autoloaded Options are bloated.
- No edge caching, no CDN, incorrect TTLs.
Fixes that work immediately
1) Enable Persistent Object Cache
Use Redis as your persistent object cache. This reduces database load on repeated queries. Install the "Redis Object Cache" plugin, connect your instance, check the hit rate, and test the preloading. Pay attention to groups you don't want to cache, such as dynamic options in the checkout. This often significantly reduces your TTFB (time to first stop).
2) Use high-performance order storage
Activate HPOS in WooCommerce. Orders are placed in separate tables optimized for e-commerce. This reduces the workload. wp_postmeta and speeds up queries in the admin and frontend. Check plugin compatibility, synchronize legacy data, then switch over. New shops have WooCommerce High-Performance Order Storage often already active.
3) Load cart fragments only where necessary
Cart fragments update the mini-cart via AJAX. Previously, they ran on too many pages and prevented full-page caching. Disable them on pages without a mini-cart. Enable server-side caching. Keep the mini-cart dynamic only, not the entire shop. Learn more under Using Cart Fragments Effectively.
4) Consistently modernize images
Use WebP or AVIF, deliver responsive sizes, and lazy-load everything below the fold. Implement an image pipeline or image CDN that dynamically adjusts format, size, and quality. Reduce LCP image size to the necessary minimum. Avoid huge hero sliders. See also " Using Modern Image Formats" in the "Developers for Chrome" section.
5) Taming JavaScript
- Remove unused libraries.
- Split bundles; only load what the page needs.
- Put
deferfor non-critical JS. - Avoid jQuery Domino on every page.
- Reduce DOM nodes, relieve layout thrashing.
6) Streamline CSS
- Generate critical CSS for the above-the-fold area.
- Delay for non-critical CSS, use
mediaandpreloadsmart. - Remove unused utility classes and framework ballast.
7) Edge caching and CDN
Deliver static assets from the edge. Use clean cache headers. Allow full-page caching of HTML on category and product pages where possible. Make exceptions for the shopping cart and checkout. Use stale-while-revalidate to handle traffic spikes.
Server, PHP, database
- PHP 8.1 or 8.2 with OPcache; JIT is not required. Allocate sufficient RAM for OPcache and realpath cache.
- Enable HTTP/2 or HTTP/3. Use Brotli before gzip if available.
- MySQL/MariaDB: InnoDB, adjusted buffer sizes, log slow queries. Check indexes.
- A separate Redis service, not on the same instance as the DB, is used when the load is high.
- Keep-Alive and TLS session resumption are active.
WooCommerce specifics that cost you time
Product list and search
- Avoid expensive taxonomy filters without caching. Use pre-indexed solutions or faceted search services.
- Use transient caches for frequently used lists, and clear them specifically after product changes.
Variants
- Load attribute data server-side and cache the combinations. Check if you can reduce the number of variants.
- Avoid JS cascades that recalculate with every selection.
Checkout
- Limit the number of payment and shipping plugins. Check timeouts for API calls. Shorten requests using keep-alive rules.
- Deactivate anything that is not needed in the cash register, such as social scripts.
Action Scheduler
- Clean up old jobs. Schedule Cron more frequently as queues grow.
- Monitor webhooks, retry counters, and API errors. This saves time at checkout.
Autoloaded Options
- Check it
autoloadinwp_optionsKeep the total amount small. - Store large configurations without autoloading them. Version them.
Reduce front-end load systematically
Fonts
- Use variable fonts sparingly. Preload for important styles. Define a fallback.
- Prevent layout jumps with
font-display: swapas well as defined sizes.
PHOTOS
- Put
srcsetandsizesNo 4K images on mobile devices. - Use placeholders to avoid CLS. Specify width and height.
Third Party
- Load the tag manager once consent has been obtained. Delay heatmaps. ads, Chats.
- Measure every third-party service. Eliminate what doesn't pay.
Practical application: Concrete steps with high impact
- Use Redis: Install Redis, activate the plugin, check the connection, and fill the object cache. Observe the hit rate. Make it persistent.
- Activate HPOS: In WooCommerce settings, activate the feature, synchronize tables, test compatibility, and switch over.
- Restrain Cart Fragments: Only load the mini-cart where it is visible. Otherwise, remove it or reload it via an event.
- Set up image pipeline: WebP or AVIF, responsive sizes, quality 60 to 80, sharp scaling. Optimize the LCP image specifically.
- Clean up JS: Remove unused plugins. Split vendor packages. Defer anything that isn't critical.
- Enable Edge cache: Use a CDN, cache HTML on the catalog and PDP. Exclude checkout and account.
- Clean up Action Scheduler: Check failed jobs, fix the causes, adjust the interval.
- Check autoload: Identify large entries, autoload on
noSet it if it's not necessary. - Check DB indices: Make sure your tables, especially HPOS tables, are properly indexed.
- Introduce monitoring: Lighthouse in CI, CrUX data, on-site measurement for INP and LCP. You only improve what you measure.
Example configurations and snippets
wp-config.php, performance basics
// OPcache warmhalten
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
// Redis Vorgaben, Beispiel
// define('WP_REDIS_HOST', '127.0.0.1');
// define('WP_REDIS_PORT', 6379);
// define('WP_REDIS_TIMEOUT', 1.0);
// define('WP_REDIS_READ_TIMEOUT', 1.0);
// Heartbeat drosseln
// add_filter('heartbeat_settings', function($s){ $s['interval']=60; return $s; });
Nginx, long cache static assets
location ~* .(?:css|js|woff2?|ttf|eot|png|jpg|jpeg|gif|svg|webp|avif)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
HTML, Critical Hints
<link rel="preload" href="/fonts/brand.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/images/hero-lcp.webp" as="image">
<script defer src="/assets/app.js"></script>
Checklist for your next release
- HPOS is active, no synchronization errors.
- Redis connected, object cache hit rate > 90 percent on warm cache.
- Cart fragments only appear on pages with a visible mini-cart.
- LCP image optimized, size fits viewport.
- JS deferred, no blocking inline script before rendering.
- CDN active, TLS fast, Brotli active.
- Action scheduler clean, webhooks stable.
- Autoload amount is within the green range.
- Lighthouse score stable, CrUX shows green values.
Typical misunderstandings
- "More RAM solves it": It only helps if you know where the fire is.
- "A plugin takes care of that": Tools help, but architecture brings speed.
- “CDN is sufficient”: Without clean HTML output, the first byte remains slow.
- "INP doesn't matter": Poor response times slow down users.
How to measure progress correctly
- Define target values for LCP, INP, and CLS for each page type.
- Define test profiles: mobile 4G, desktop, first visit, repeat visit.
- Collect real-world user data. Compare it to lab data. Document your changes.
- Include checks in CI. Abort builds if thresholds are breached.
Your next step
Implement two things today. Start with HPOS and Redis if both are suitable. Or take Cart Fragments and LCP image. Post your results. Which side benefited the most and why?
Discussion
Who wrote this post
Storetown Media is a WooCommerce agency based in Tornesch, in the Pinneberg district, about twenty minutes from Hamburg. Since 2012, we've been building websites and online shops – starting with company websites and ordering systems, with shops being added gradually. The interventions described here – database cleanup, delivering images in WebP format, streamlining plugins, and properly caching – are part of our daily routine. If your shop is slow and you don't want to search for it yourself, we'll take a look.






















{% endif %} {% if title and title != "" %}
{{ title }}
{% endif %} {% if excerpt and excerpt != "" %}