Start gratis proefperiode
Skip to content

WooCommerce filter performance: waar filters je shop vertragen

Waarom AJAX-filter round-trips grote WooCommerce-catalogi vertragen — en wanneer een frontend-export model serverload weghaalt.

WooCommerce filters vertragen je site omdat elke klik je paginacache (zoals WP Rocket) omzeilt en een zware SQL-query op de wp_postmeta tabel forceert. De enige echte oplossing is om te stoppen met het bevragen van de database per klik. Door de filterlogica naar de browser te verplaatsen met behulp van een JSON-index (frontend-first filtering), elimineer je AJAX-latency en serverbelasting volledig.

Waarom zijn WooCommerce filters traag, zelfs als je PageSpeed-score groen is?

Als je jouw WooCommerce categoriepagina’s door Google PageSpeed Insights haalt, zie je misschien een kerngezonde score. Je Time To First Byte (TTFB) is lager dan 200ms, je afbeeldingen zijn geoptimaliseerd en je caching-plugin doet zijn werk. De shop voelt snel aan bij de eerste landing.

Maar dan klikt een klant op het filter “Maat: Large”. Plotseling hangt de pagina een volledige seconde. Ze klikken op “Kleur: Blauw”, en de pagina hapert opnieuw. Als dit gebeurt tijdens een drukke periode zoals Black Friday, met honderden gelijktijdige gebruikers, schiet je server-CPU omhoog, raken je PHP-workers uitgeput en vertraagt de volledige checkout-flow voor iedereen.

Dit is de paradox van WooCommerce filter performance: het optimaliseren van de initiële laadtijd doet bijna niets om de filterervaring te verbeteren. Om trage filters te fixen, moet je begrijpen wat er op de server gebeurt op het moment dat een gebruiker interactie heeft met de sidebar.

Waarom is mijn WooCommerce shoppagina zo traag tijdens het filteren?

Als je zoekt naar een oplossing voor trage WooCommerce filters of een hoog CPU-gebruik door admin-ajax.php, dan loop je tegen de architecturale limieten van WordPress aan. De traagheid wordt veroorzaakt door een ‘perfecte storm’ van drie factoren:

  1. De Cache Bypass: Caching-plugins (zoals WP Rocket of LiteSpeed) serveren statische HTML voor de hoofdcategoriepagina. Maar zodra een gebruiker op een filter klikt, verandert de URL (bijv. ?color=blue&size=large). Deze unieke query-string omzeilt de paginacache volledig, waardoor de server het verzoek vanaf nul moet verwerken.
  2. De AJAX-belasting: De meeste filter-plugins gebruiken AJAX. Elke klik stuurt een verzoek naar admin-ajax.php of een custom REST-endpoint. Dit dwingt je server om de volledige WordPress-core op te starten, alleen maar om dat ene filterverzoek af te handelen.
  3. Het Databaseschema: Om “Blauwe” en “Grote” producten te vinden, moet WooCommerce zware JOIN-operaties uitvoeren over de tabellen wp_posts, wp_postmeta en wp_term_relationships. Bij meer dan 5.000 producten worden deze query’s onvoorstelbaar traag omdat MySQL miljoenen rijen moet scannen om de juiste combinaties te vinden.
Diagram showing the AJAX Waterfall vs Client-side execution for WooCommerce product filtering.

Hoe slaat WooCommerce productkenmerken op en waarom vertraagt dit het filteren?

Om te begrijpen waarom filteren inherent duur is in WordPress, moet je kijken naar hoe WooCommerce kenmerken (attributes) daadwerkelijk opslaat — niet in nette kolommen, maar als een mix van taxonomieën en geserialiseerde meta-data.

Globale kenmerken (bijv. pa_color) gebruiken taxonomie-termen: waarden zoals “blauw” leven in wp_terms en zijn gekoppeld aan producten via wp_term_relationships. Lokale kenmerken op een product worden samen opgeslagen in één _product_attributes rij in wp_postmeta — een geserialiseerde PHP-array, geen apart geïndexeerde velden. Variaties voegen per variatie meta-data toe, zoals attribute_pa_color.

Het product zelf is een rij in wp_posts, maar de filterbare data ligt verspreid over taxonomie-JOINs en meta-blobs. Dat is het schema waar AJAX filter-plugins bij elke klik tegen moeten vechten.

Wanneer een gebruiker een categorie filtert op “Blauwe shirts in maat L onder de €50”, kan WordPress niet simpelweg één rij opzoeken. Het moet een WP_Query construeren die enorme SQL JOIN-operaties uitvoert over meerdere tabellen om deze voorwaarden te kruisen. Daarna moet het de resterende beschikbare aantallen berekenen voor alle andere filters (bijv. ontdekken dat er nu 0 “Rode” shirts beschikbaar zijn in maat L, zodat de optie “Rood” uitgeschakeld moet worden).

Voor een catalogus van 500 producten handelt MySQL dit in milliseconden af. Voor een catalogus van 15.000 producten met complexe variaties wordt deze query een zware rekenkundige last voor je database-server.

Waarom caching-plugins falen bij gefilterde URL’s

Je denkt misschien dat je caching-plugin (zoals WP Rocket of LiteSpeed Cache) je zal redden. Dat is niet het geval. Caching-plugins werken door de HTML-output van een specifieke URL op te slaan. Een statische categoriepagina (/shop/shirts/) is eenvoudig te cachen.

Echter, wanneer een gebruiker een filter toepast, verandert de URL (bijv. /shop/shirts/?filter_color=blue&filter_size=l). Elke unieke combinatie van filters creëert een unieke query-string. Omdat caching-engines niet elke mogelijke combinatie kunnen voorspellen of opslaan, zijn ze geconfigureerd om de cache te omzeilen zodra er query-strings aanwezig zijn.

Dit betekent dat elke individuele filter-interactie WordPress dwingt om op te starten, alle plugins te laden, verbinding te maken met de database, de zware SQL-joins uit te voeren en de HTML vanaf nul te renderen. Het is het equivalent van een volledig ongecachte paginalading, herhaaldelijk getriggerd door elke gebruiker.

De AJAX Pleister

De meeste filter-plugins gebruiken AJAX om een volledige browser-refresh te voorkomen. Hoewel dit soepeler aanvoelt voor de gebruiker, lost het de serverbelasting niet op. Een AJAX-verzoek start nog steeds WordPress op, omzeilt de cache en voert de zware database-query’s uit. Het verbergt de laadstatus alleen achter een spinner.

Waarom het opschalen van je hosting trage WooCommerce filters niet oplost

Wanneer shopeigenaren te maken krijgen met trage filters, is de instinctieve reactie vaak om geld tegen het probleem aan te gooien door de hosting te upgraden. Meer CPU-cores, meer RAM, meer PHP-workers.

Hoewel een robuuste server essentieel is voor WooCommerce, is het opschalen van hardware om inefficiënte database-query’s op te lossen een verloren strijd. Als een AJAX-filterverzoek 800ms duurt op een server van €50/maand, kan een upgrade naar €200/maand dit misschien terugbrengen naar 400ms. Het is een verbetering, maar het is nog steeds niet “onmiddellijk” en het beschermt je nog steeds niet tegen pieken in gelijktijdig verkeer.

Om echte schaalbaarheid te bereiken, moet je de architectuur veranderen, niet alleen de hardware.

Er is een tweede dimensie aan dit probleem: concurrency (gelijktijdigheid). Een AJAX-filterverzoek dat 400ms duurt op een rustige server, kan 1.200ms duren wanneer 50 gebruikers tegelijkertijd door je shop bladeren. Elke filterklik van een gebruiker vergrendelt database-rijen en bezet een PHP-worker voor de duur van de query. Workers komen in de wachtrij te staan, latency stapelt zich op en je eindigt met een trage site op de momenten die er het meest toe doen — promoties, flash sales en dagen met veel verkeer.

Geïndexeerde AJAX (gebruikt door plugins zoals FacetWP met hun Elasticsearch of flat-table indexer) verbetert de query-snelheid aanzienlijk door facet-counts vooraf te berekenen. Maar zelfs met een index start elke filterklik nog steeds WordPress op, gaat het via PHP en bezet het een worker-thread. De limieten van concurrency blijven bestaan. De enige manier om volledig aan dit plafond te ontsnappen, is door de berekening naar de browser te verplaatsen, waar het apparaat van elke gebruiker zijn eigen filterlogica parallel uitvoert zonder enige serverbetrokkenheid.

Welke WooCommerce filterarchitectuur presteert het best op schaal?

ArchitectuurServerbelasting per klikConcurrency LimietBest Voor
Native SQL (Standaard)Zeer HoogLaag (Crasht snel onder druk)Kleine shops (< 1.000 SKU’s)
Geïndexeerde AJAXMedium (Snelle DB, maar start WP)Medium (Beperkt door PHP-workers)Middelgrote shops, complexe post types
Client-Side ExportNul (Berekening in browser)Hoog (Server serveert alleen statische bestanden)Grote catalogi, veel verkeer/sales

De bovenstaande tabel toont de structurele afwegingen in één oogopslag, maar het verschil in de praktijk is groter dan de cijfers doen vermoeden. Met Native SQL-filtering kan een site die 30 gelijktijdige shoppers comfortabel afhandelt bij 10.000 producten, vastlopen of crashen bij 30.000 producten — niet omdat de server trager werd, maar omdat de query-complexiteit niet-lineair groeide. Geïndexeerde AJAX rekt dit venster op, maar verzadiging van PHP-workers blijft het harde plafond tijdens verkeerspieken.

Frontend-first filtering doorbreekt dit plafond volledig. Omdat de browser alle filterberekeningen afhandelt na hydratatie, worden je server-CPU en PHP-worker count irrelevant voor de filtersnelheid. Een categoriepagina die 500 gelijktijdige shoppers bedient, ziet er voor de server identiek uit als 500 gecachte statische paginaverzoeken.

Hoe diagnosticeer je trage WooCommerce filter performance?

Voordat je van filter-plugin wisselt, moet je bevestigen dat AJAX daadwerkelijk de bottleneck is. Open het Network-tabblad van de DevTools in je browser, selecteer “XHR” en klik op een filter. Je zou een of meer verzoeken naar admin-ajax.php of een REST-endpoint zoals /wp-json/wc/store/products moeten zien. Let op de responstijd in milliseconden.

Een enkele filterklik die meer dan 300ms duurt onder normale belasting is een duidelijk teken dat je database-query’s de bottleneck zijn. Als diezelfde klik 800ms of meer duurt tijdens verkeerspieken, of als je verzoeken in de wachtrij ziet staan, dan raak je de limiet van je PHP-workers.

Drie metrieken om te volgen in je serverlogs:

  • admin-ajax.php responstijd (P95) — de duur van de traagste 5% van de verzoeken. Alles boven de 500ms vereist architecturale aandacht.
  • PHP worker verzadiging — controleer je hostingpaneel of php-fpm logs. Als alle workers bezet zijn tijdens het browsen (niet alleen tijdens de checkout), zijn AJAX-filters de waarschijnlijke oorzaak.
  • Slow query log — schakel het slow query log van MySQL in (drempelwaarde 500ms). Filter-gerelateerde query’s met wp_term_relationships JOINs zullen daar onmiddellijk verschijnen.

Als alle drie de metrieken verhoogde waarden tonen tijdens het bladeren door categorieën, dan is het probleem de AJAX-architectuur zelf — niet je serverconfiguratie. Het optimaliseren van query’s of het toevoegen van indexen kan de uitvoeringstijd met 20-40% verminderen, maar het structurele plafond blijft hetzelfde. De enige blijvende oplossing is het verwijderen van de server round-trip uit de filter-interactie.

Hoe elimineert frontend-first filtering de serverbelasting van WooCommerce?

Als de server de bottleneck is, is de logische oplossing om de server niet meer te vragen de berekeningen uit te voeren. Dit is het uitgangspunt van de Client-Side Export architectuur, die door InstantFilter wordt gebruikt.

In plaats van de database bij elke klik te bevragen, scant de plugin je catalogus op de achtergrond en stelt een hooggecomprimeerd JSON “codeboek” samen. Dit bestand bevat de relaties tussen al je producten en hun kenmerken.

Wanneer een gebruiker een categoriepagina bezoekt:

  1. De server levert de initiële HTML (volledig gecacht en SEO-vriendelijk).
  2. De browser downloadt het gecomprimeerde JSON-codeboek op de achtergrond.
  3. Wanneer de gebruiker op een filter klikt, berekent de JavaScript-engine van de browser de kruisingen en werkt de grid onmiddellijk bij.

Omdat moderne browsers (zelfs op mobiele apparaten) ongelooflijk snel zijn in het verwerken van JSON-arrays, duurt de filter-interactie slechts enkele milliseconden. Belangrijker nog: er worden nul verzoeken naar je server gestuurd. Je PHP-workers blijven vrij om daadwerkelijke bestellingen af te handelen in plaats van facet-counts te berekenen.

Voordelen van Client-Side Filtering

  • Immuun voor verkeerspieken: 1.000 gebruikers die tegelijkertijd filteren, belasten je server niet meer dan 1 gebruiker.
  • Echte instant UI: Geen netwerk-latency, geen wachttijd op TTFB.
  • Lagere hostingkosten: Je hoeft geen overcapaciteit aan PHP-workers in te kopen alleen om catalogus-browsing af te handelen.

Afwegingen om rekening mee te houden

  • Initiële payload grootte: De browser moet de JSON-export downloaden. Voor enorme catalogi (50K+ SKU’s) kan dit bestand enkele honderden kilobytes groot zijn, wat de “time to interactive” op trage 3G-verbindingen iets kan vertragen.
  • Achtergrond indexering: Je bent afhankelijk van achtergrondprocessen (cron jobs of CLI) om de JSON-export up-to-date te houden wanneer je nieuwe producten toevoegt.

Veelgestelde vragen over WooCommerce-filterperformance

Snelle hosting verkort de laadtijd van de pagina, maar AJAX-filters vuren bij elke klik een nieuw PHP + MySQL verzoek af. Elk verzoek start WordPress op, voert SQL JOINs uit over wp_terms, wp_term_relationships en wp_postmeta, en stuurt dan HTML terug. Die round-trip duurt 300ms–1.500ms, ongeacht je serversnelheid. De bottleneck is architecturaal, niet hardwarematig.
Een typische AJAX-filterquery raakt: wp_posts (productberichten), wp_postmeta (aangepaste velden en lokale kenmerken), wp_terms + wp_term_relationships (globale kenmerken zoals pa_color en pa_size) en wp_termmeta. Bij 10.000+ producten scannen de JOINs over deze tabellen miljoenen rijen per klik. Het berekenen van facetten herhaalt dit werk voor elke filteroptie in de sidebar.
Gedeeltelijk. Paginacaching versnelt de initiële laadtijd van de categoriepagina. Maar AJAX-filterverzoeken omzeilen de paginacache volledig — elke klik stuurt een dynamisch verzoek dat WP Rocket en Redis niet vanuit de cache kunnen serveren. Je behoudt de volledige PHP + MySQL belasting bij elke filterinteractie. Frontend-first filtering vermijdt serververzoeken na de initiële paginalading.
Problemen ontstaan meestal vanaf ongeveer 1.000–2.000 producten met veel kenmerken, of eerder als je complexe sidebars hebt met 30+ filteropties. Bij 10.000+ producten worden AJAX-filters merkbaar traag; bij 50.000+ kunnen ze time-outs genereren op shared hosting. De exacte drempel hangt af van serverbronnen, het aantal kenmerken en de diepte van de variaties.
InstantFilter bouwt een gecomprimeerd JSON-codeboek op tijdens het indexeren. De browser downloadt dit eenmalig bij de eerste aanroep van de categoriepagina. Alle volgende filterklikken worden lokaal in JavaScript verwerkt in minder dan 5ms, met nul serververzoeken. De initiële SSR-paginalading blijft volledig gecacht en SEO-vriendelijk.

Hoe beïnvloeden trage WooCommerce filters Core Web Vitals en SEO?

Google’s Core Web Vitals meten drie aspecten van de gebruikerservaring: Largest Contentful Paint (LCP), Interaction to Next Paint (INP) en Cumulative Layout Shift (CLS). AJAX-filters verslechteren direct twee van deze metrieken op categoriepagina’s.

INP (Interaction to Next Paint) meet hoe snel de pagina reageert na een gebruikersinteractie — inclusief filterklikken. Een AJAX-filterrespons van 600ms resulteert in een INP van 600ms of hoger, wat Google classificeert als “Needs Improvement” of “Poor”. Slechte INP-scores kunnen de ranking van categoriepagina’s in concurrerende niches onderdrukken.

CLS (Cumulative Layout Shift) wordt beïnvloed wanneer AJAX-filterresultaten asynchroon laden en de grid-items verschuiven tijdens het renderen. Een grid die verspringt tijdens het laden van gefilterde resultaten bouwt een lay-outverschuiving op die Google afstraft in het Page Experience-signaal.

Frontend-first filtering vermijdt beide problemen. Omdat de JavaScript direct ‘in-place’ filtert (door de weergavestatus te wisselen in plaats van DOM-nodes te vervangen vanuit een AJAX-payload), blijft de lay-out stabiel en blijft de INP onder de 50ms — wat Google classificeert als “Good”.

Wat is de snelste manier om trage WooCommerce filters te fixen in een bestaande shop?

Als je momenteel een AJAX filter-plugin gebruikt en de latency wilt verminderen zonder een volledige migratie, begin dan hier:

  1. Audit je filter-sidebar: Verminder het aantal filtergroepen. Elke extra facetgroep vermenigvuldigt het SQL-werk. Een sidebar met 5 kenmerkgroepen is aanzienlijk goedkoper dan een met 15.
  2. Stap over op globale kenmerken waar mogelijk: Lokale (aangepaste) kenmerken die zijn opgeslagen in geserialiseerde _product_attributes meta zijn moeilijker te indexeren. Globale taxonomie-gebaseerde kenmerken (pa_color, pa_size) gebruiken geïndexeerde wp_term_relationships rijen die MySQL veel efficiënter afhandelt.
  3. Evalueer een geïndexeerde AJAX-plugin: Als je gebruikmaakt van standaard WP_Query filtering, kan de overstap naar een geïndexeerde AJAX-plugin zoals FacetWP of de eigen Product Filters van WooCommerce de responstijden met 60-80% verkorten bij middelgrote catalogi.
  4. Test frontend-first filtering op staging: Voor catalogi met meer dan 5.000 SKU’s, of elke winkel waar filter-latency direct invloed heeft op de conversie, is een frontend-first aanpak de enige architectuur die de serverbelasting volledig wegneemt. Zet een staging-kloon op en maak gebruik van de 14-daagse proefperiode van InstantFilter om het verschil te benchmarken voordat je een definitieve keuze maakt.

WooCommerce filter performance is geen hostingprobleem, geen plugin-versie probleem of een PHP-geheugenprobleem. Het is een data-architectuur probleem. Het oplossen bij de bron — door de filterberekening te verplaatsen naar de plek waar het het goedkoopst is — is de enige oplossing die echt schaalt.

Ga verder

Als je WooCommerce filters je shop vertragen, is het upgraden van je hosting slechts een tijdelijke oplossing. Evalueer je filterarchitectuur en overweeg om de rekenlast naar de browser te verplaatsen. Op zoek naar de beste WooCommerce filter plugin voor grote catalogi? Gebruik onze vergelijkingsgids om architectuur, variaties en schaal af te stemmen op jouw winkel.

Coming soon:

  • Hoe filterarchitecturen verschillen (ajax vs frontend export)
  • Filteren op kleur, maat en stijl als aparte kaarten
  • InstantFilter vs YITH Ajax Product Filter

Stop met betalen voor AJAX round-trips

Start een 14-daagse proefperiode van InstantFilter. Kloon je site naar staging en ervaar filtering zonder vertraging.

Klaar om filteren instant te maken?

Start je 14-daagse proefperiode. 30 dagen geld-terug-garantie — op elk moment opzegbaar.