Een trage WooCommerce cart en checkout optimaliseren is vaak het verschil tussen een winstgevende webshop en een lekkende conversietrechter. Waar een productpagina nog gecachet kan worden, draait je checkout bij elk bezoek opnieuw door de complete WordPress-stack. Elke milliseconde telt: onderzoek van Google laat zien dat de conversiekans met 32% daalt als je laadtijd van 1 naar 3 seconden stijgt.
In dit artikel duik je in de concrete bottlenecks van WooCommerce en leer je hoe je ze aanpakt. Van cart fragments tot AJAX-calls, van database queries tot payment gateways.
Waarom WooCommerce zo anders is dan reguliere WordPress
WooCommerce voegt honderden hooks, tientallen database tabellen en complexe sessie-logica toe aan een standaard WordPress-installatie. Waar een blogpagina eenvoudig te full-page cachen is, moeten cart en checkout elke request dynamisch renderen.
Dit komt doordat WooCommerce per gebruiker bepaalt:
- Welke producten in het mandje zitten
- Welke verzendmethoden beschikbaar zijn op basis van locatie
- Of er kortingen of coupons van toepassing zijn
- Welke betaalmethoden geldig zijn voor de bestelwaarde
- BTW-berekeningen op basis van land en producttype
Al deze logica draait bij elke paginaview op de checkout. Daar kun je geen statische cache overheen leggen.
Cart fragments: de grootste stille vertrager
Als je één ding uit dit artikel onthoudt, laat het dit zijn: cart fragments zijn de meest onderschatte performance-killer in WooCommerce.
Cart fragments updaten het winkelmandje-icoontje in je header via een AJAX-call naar admin-ajax.php. Die call draait op elke paginaview, niet alleen op productpagina's. Een bezoeker die 10 pagina's bekijkt, triggert 10 keer een volledige WooCommerce-load.
Fragments disabelen waar mogelijk
Op pagina's zonder winkelmandje-indicator (zoals de homepage of blog) kun je fragments volledig uitschakelen:
add_action('wp_enqueue_scripts', function() {
if (is_front_page() || is_single()) {
wp_dequeue_script('wc-cart-fragments');
}
}, 11);
Fragments vervangen door cookies
Een elegantere oplossing is het aantal items tonen op basis van de woocommerce_items_in_cart cookie. Geen AJAX-call meer nodig, gewoon JavaScript dat de cookie uitleest. Plugins als "Disable Cart Fragments" doen dit automatisch.
Meer achtergrond over de gevaren van admin-ajax vind je in ons artikel over admin-ajax.php als verborgen performance drain.
Database queries onder controle houden
WooCommerce voegt meerdere tabellen toe (wc_order_stats, wc_product_meta_lookup, woocommerce_sessions) en genereert bij elke cart-actie tientallen queries. Veel daarvan zijn niet geïndexeerd voor jouw specifieke gebruik.
Meet eerst, optimaliseer dan
Installeer Query Monitor en bekijk wat er gebeurt op /checkout/. Je ziet vaak:
- 200+ queries per paginaview
- Trage queries in
wp_optionsdoor autoloaded options - Herberekeningen die elke request opnieuw draaien
- Meta-queries zonder goede indexen
Lees ook hoe je autoloaded options opschoont, op WooCommerce-sites met veel plugins lopen deze snel uit de hand.
Object caching is geen luxe
Voor WooCommerce is Redis object caching vrijwel onmisbaar. Sessies, cart-data en product lookups profiteren enorm. In onze gids over object caching met Redis lees je hoe je dit correct configureert.
Let wel op: vergeet niet om de WooCommerce sessions-tabel regelmatig op te schonen. Die loopt anders vol met verlaten carts.
Caching-strategie voor een webshop
Je kunt niet alles cachen, maar wel veel meer dan je denkt. Een doordachte strategie kijkt per pagina-type.
Wat wel cachen
- Shop- en categoriepagina's: statisch cachen met cache-buster op voorraadwijzigingen
- Productpagina's: cachen per variatie of met edge-side includes voor prijs/voorraad
- Blog en informatieve pagina's: gewoon full page cachen
Wat niet cachen
/cart/,/checkout/,/my-account/, altijd uitsluiten- URL's met
?add-to-cart=parameter - WooCommerce API endpoints (
/wc-api/) - Alles waar de
woocommerce_cart_hashcookie verschilt
In je NGINX of caching plugin stel je deze uitsluitingen expliciet in. Een fout hier betekent dat gebruiker A het mandje van gebruiker B ziet, een nachtmerrie voor privacy én conversie.
Checkout scripts en stylesheets opschonen
WooCommerce laadt standaard zijn scripts en styles op elke pagina, ook waar je geen WooCommerce nodig hebt. Een simpele fix levert direct winst op.
add_action('wp_enqueue_scripts', function() {
if (function_exists('is_woocommerce')) {
if (!is_woocommerce() && !is_cart() && !is_checkout() && !is_account_page()) {
wp_dequeue_style('woocommerce-general');
wp_dequeue_style('woocommerce-layout');
wp_dequeue_style('woocommerce-smallscreen');
wp_dequeue_script('wc-add-to-cart');
wp_dequeue_script('woocommerce');
}
}
}, 99);
Dit scheelt al snel 100-200 KB aan onnodige assets op je homepage. Combineer dit met correcte lazy loading voor productafbeeldingen en je LCP verbetert merkbaar.
Payment gateways: de checkout-bottleneck
Payment gateway plugins (Mollie, Stripe, PayPal) voegen vaak externe API-calls toe tijdens het renderen van de checkout. Elke seconde vertraging bij de gateway is een seconde die je gebruiker wacht.
Laat gateways pas laden wanneer nodig
Gebruik de woocommerce_available_payment_gateways filter om betaalmethoden uit te schakelen op basis van context (bestelbedrag, verzendland, productcategorie). Minder gateways op de checkout betekent minder initialisatie en API-calls.
Monitor gateway performance
Voeg logging toe rond de gateway-initialisatie:
add_filter('woocommerce_payment_gateways', function($gateways) {
$start = microtime(true);
// ... gateway logic
error_log('Gateways loaded in ' . (microtime(true) - $start) . 's');
return $gateways;
});
Bekijk de WooCommerce performance documentatie voor meer officiële aanbevelingen.
AJAX-calls tijdens de checkout
Tijdens het invullen van de checkout triggert WooCommerce een update_order_review AJAX-call bij elke wijziging: een ander adres, andere verzendmethode, andere betaalmethode. Elke call draait een volledige herberekening.
Throttle en debounce
Standaard is er al een kleine delay, maar op trage servers kun je de frequency verlagen:
jQuery(document.body).on('update_checkout', function() {
// debounce naar max 1x per 500ms
});
Verwijder onnodige recalculaties
Plugins die bij elke woocommerce_checkout_update_order_review hook hun eigen berekening uitvoeren zijn vaak schuldig aan trage checkouts. Debug met Query Monitor om trage plugins op te sporen.
Sessies en cart persistence
WooCommerce slaat cart-data op in de wp_woocommerce_sessions tabel. Op drukke sites groeit die tabel hard, wat elke sessie-query vertraagt.
Ruim sessies op
Stel een cron in die verlopen sessies verwijdert:
DELETE FROM wp_woocommerce_sessions
WHERE session_expiry < UNIX_TIMESTAMP();
WooCommerce doet dit zelf via woocommerce_cleanup_sessions, maar controleer of die cron daadwerkelijk draait. Bij veel sites staat WP-Cron disabled of loopt deze vast, zie onze gids over WP-Cron optimalisatie.
Gebruik Redis voor sessies
Met een object cache drop-in zoals Redis worden cart-sessies in-memory opgeslagen, wat ordes van grootte sneller is dan de MySQL-tabel.
Server-side optimalisaties
Software alleen is niet genoeg. De checkout hamert op je PHP en MySQL.
PHP-FPM tuning
WooCommerce is CPU-intensief. Zorg voor genoeg PHP-workers zodat de checkout niet in een queue belandt tijdens piekmomenten. Lees hoe je dit instelt in PHP-FPM tuning voor WordPress.
OPcache en preloading
WooCommerce bestaat uit honderden PHP-bestanden. Zonder OPcache en preloading compileert PHP die bij elke request opnieuw. Dat is pure verspilling.
MySQL tuning
Check je slow query log specifiek op queries naar wc_orders, postmeta en options. Indexes op veel gebruikte meta-keys kunnen wonderen doen.
Meten is weten
Voordat je optimaliseert, meet je de huidige situatie. Gebruik deze baseline-metrics:
- TTFB op /cart/ en /checkout/: onder de 800ms is het streven
- Aantal queries per checkout-load: idealiter onder de 100
- Totale paginagrootte checkout: onder de 1 MB
- Time to Interactive checkout: onder de 3 seconden
Tools als New Relic, Blackfire of onze gids voor performance bottlenecks helpen je om de echte boosdoeners te vinden in plaats van te gokken.
Veelgestelde vragen
Waarom is de WooCommerce checkout vaak traag?
De checkout is onuitstelbaar: hij omzeilt page cache, voert veel AJAX-calls uit via wc-ajax en laadt fragments bij elke paginawijziging. Daarnaast draaien er vaak zware plugins mee zoals payment gateways en tax calculators.
Wat zijn cart fragments in WooCommerce?
Cart fragments zijn stukjes HTML die via AJAX worden bijgewerkt, zoals het winkelmandje-icoon in de header. Ze draaien op elke paginaview en kunnen je site flink vertragen als je ze niet optimaliseert of uitschakelt.
Kan ik de WooCommerce checkout pagina cachen?
Nee, de cart, checkout en account-pagina's moet je uitsluiten van full page caching omdat ze gebruikersspecifieke data tonen. Wel kun je statische delen cachen en object caching gebruiken voor queries.
Helpt een one-page checkout de performance?
Een one-page checkout kan de conversie verhogen, maar is niet per se sneller. De performance hangt af van hoe goed de plugin is gebouwd en of deze onnodige AJAX-calls vermijdt.
Welke plugins vertragen WooCommerce het meest?
Vooral dynamische pricing-plugins, uitgebreide tax calculators, live shipping rate-plugins en plugins die bij elke paginaview de cart recalculeren zijn grote boosdoeners. Test met Query Monitor welke hooks het zwaarst wegen.
Tot slot
Een snelle WooCommerce cart en checkout vraagt om aandacht op meerdere lagen: frontend assets, AJAX-gedrag, database queries, object caching en server-side tuning. Begin bij de grootste winst, cart fragments en onnodige scripts, en werk door naar de diepere optimalisaties.
Meet voor en na elke wijziging. Zonder metingen weet je niet of je écht iets hebt opgelost of alleen hebt verplaatst. En onthoud: elke 100ms die je van de checkout afhaalt, is directe conversiewinst.