Je site is traag. Je hebt de gebruikelijke verdachten al gecheckt - afbeeldingen zijn geoptimaliseerd, caching staat aan, je hosting is in orde. Toch blijft die Time to First Byte hardnekkig hoog. Grote kans dat een of meerdere trage plugins de boosdoener zijn. Debugging van trage plugins is een vaardigheid die elke WordPress-beheerder nodig heeft, maar waar weinig mensen systematisch mee omgaan.
In eerdere artikelen behandelden we al waarom je WordPress traag is en hoe je performance bottlenecks herkent en meet. Dit artikel gaat een stap verder: je leert precies hoe je de schuldige plugin vindt, de oorzaak analyseert en een onderbouwde beslissing neemt.
Waarom plugins je site vertragen
Plugins haken in op het WordPress-systeem via hooks en filters. Bij elk request doorloopt WordPress een vaste reeks stappen - en bij elke stap kunnen plugins extra code uitvoeren. Dat is de kracht van WordPress, maar ook de achilleshiel.
Een plugin kan op meerdere manieren vertraging veroorzaken:
- Zware database-queries - ongeoptimaliseerde queries zonder indexen, of queries die bij elk pageview worden uitgevoerd terwijl het resultaat gecacht zou kunnen worden
- Externe HTTP-requests - API-calls naar externe diensten die de response blokkeren
- Excessief geheugengebruik - grote datasets die in het PHP-geheugen worden geladen
- Te veel hooks - plugins die op tientallen acties en filters inhaken, zelfs op pagina's waar ze niet actief zijn
- Frontend-ballast - CSS- en JavaScript-bestanden die op elke pagina worden geladen, ook waar ze niet nodig zijn
Het verraderlijke is dat geen van deze problemen zichtbaar is vanuit het WordPress-dashboard. Je moet dieper graven.
Stap 1: de impact meten met Query Monitor
Query Monitor is de onmisbare debugging-plugin voor WordPress. Installeer hem als eerste wanneer je performance-problemen onderzoekt.
Wat Query Monitor je vertelt
Na activatie verschijnt een admin-bar met directe inzichten:
- Totale laadtijd en piekmomenten
- Database-queries per component - je ziet precies welke plugin hoeveel queries uitvoert
- Trage queries - queries die langer duren dan een instelbare drempel (standaard 0,05 seconden)
- HTTP API-calls - externe requests met hun responstijd
- Hooks en filters - welke plugin op welk moment inprikt
- PHP-fouten - notices en warnings die je anders nooit zou zien
In de praktijk
Open een pagina die traag laadt en klik op de Query Monitor-balk. Ga naar het tabblad Queries by Component. Hier zie je een overzicht van alle database-queries, gegroepeerd per plugin, thema en WordPress core.
Sorteer op het totale aantal queries of op de totale querytijd. Een plugin die 80 queries uitvoert terwijl de rest onder de 10 blijft, valt direct op. Noteer de naam en het type queries - dat heb je straks nodig.
Bekijk vervolgens het tabblad HTTP API Calls. Plugins die bij elk frontend-request externe API's aanroepen (social media counts ophalen, licentie-checks uitvoeren) zijn een veelvoorkomende bron van vertraging. Een time-out van 5 seconden op een externe API vertraagt je hele pagina met 5 seconden.
Stap 2: de halvering-methode
Soms wil je snel weten welke plugin het probleem veroorzaakt, zonder diep in query-logs te duiken. De halvering-methode is brute maar effectief.
Zo werkt het
- Meet je baseline - noteer de TTFB van een representatieve pagina
- Deactiveer de helft van je plugins - kies willekeurig
- Meet opnieuw - is de TTFB significant gedaald?
- Herhaal met de verdachte helft - splits opnieuw in tweeën
- Ga door tot je de schuldige hebt - na 3-4 rondes heb je hem te pakken
Met 20 plugins vind je de boosdoener in maximaal 5 stappen in plaats van 20 individuele tests.
Zonder bezoekers te storen
Doe dit nooit op je live site. Gebruik een van deze methoden:
- Staging-omgeving - een kopie van je productiesite waar je vrij kunt experimenteren
- Health Check & Troubleshooting - de officiële WordPress-plugin die plugins alleen voor jouw sessie uitschakelt, terwijl bezoekers de normale site zien
- WP-CLI - deactiveer plugins via de commandoregel:
wp plugin deactivate plugin-naam
Stap 3: database-queries analyseren
Heb je de verdachte plugin gevonden? Dan is het tijd om te begrijpen waarom die plugin traag is. De database is in de meeste gevallen de bottleneck. In ons artikel over hoe WP_Query onder de motorkap werkt legden we uit hoe WordPress SQL-queries genereert. Die kennis pas je hier toe.
Slow query log inschakelen
Schakel de MySQL slow query log in om queries te vangen die langer duren dan een drempelwaarde:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 0.5;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Na een paar minuten verkeer bekijk je het logbestand. Elke entry toont de query, de uitvoertijd en het aantal geraakte rijen. Zoek naar patronen:
- Queries zonder index - herkenbaar aan
rows_examineddat veel hoger is danrows_sent - Full table scans op
wp_postmeta- een klassieke bottleneck bij plugins die veel meta-data opvragen - Herhaalde identieke queries - wijst op ontbrekende caching binnen de plugin
EXPLAIN gebruiken
Kopieer een trage query en voer deze uit met EXPLAIN ervoor:
EXPLAIN SELECT * FROM wp_postmeta
WHERE meta_key = '_custom_field'
AND post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'product');
Let op de kolommen type en Extra. Een type van ALL betekent een full table scan - de traagste manier om data op te halen. Ontbrekende indexen op veelgebruikte meta_key-waarden zijn een veel voorkomend probleem. Meer over indexen en database-tuning lees je in ons artikel over database optimalisatie voor WordPress.
Stap 4: PHP-profiling met Xdebug of Blackfire
Voor een compleet beeld van waar de tijd naartoe gaat, gebruik je een PHP-profiler. Dit gaat verder dan database-queries en laat zien welke PHP-functies de meeste tijd kosten.
Xdebug profiling
Voeg de volgende instellingen toe aan je php.ini (alleen op je ontwikkelomgeving):
xdebug.mode = profile
xdebug.output_dir = /tmp/xdebug
xdebug.start_with_request = trigger
Voeg ?XDEBUG_PROFILE=1 toe aan de URL van de trage pagina. Xdebug genereert een cachegrind-bestand dat je opent in tools als KCachegrind (Linux) of QCachegrind (macOS).
In de profilingweergave zoek je naar:
- Functies met de meeste "self time" - hier gaat de daadwerkelijke verwerkingstijd zitten
- Diepe call stacks vanuit plugin-mappen - volg het pad van
wp-content/plugins/plugin-naam/ wpdb::queryaanroepen - elke database-interactie is hier zichtbaar met de precieze bron
Blackfire als alternatief
Blackfire biedt een meer visuele benadering met flamegraphs en vergelijkingen tussen profilingruns. Het is een betaalde tool, maar de gratis tier is voldoende voor incidentele debugging. Het voordeel: je kunt twee runs vergelijken - met en zonder de verdachte plugin - en exact zien wat er verandert.
Stap 5: frontend-impact meten
Een plugin kan ook aan de frontend-kant voor vertraging zorgen. CSS- en JavaScript-bestanden worden geladen, soms op elke pagina, ook waar de plugin niet actief is.
Browser DevTools
Open de Network-tab in Chrome DevTools en filter op JS en CSS. Sorteer op grootte of laadtijd. Bestanden die uit /wp-content/plugins/ komen en niet op deze pagina nodig zijn, zijn kandidaten voor ontlading.
Scripts selectief uitschakelen
Met een plugin als Asset CleanUp of Perfmatters kun je per pagina of posttype bepalen welke scripts en styles worden geladen. Dit is geen debugging in strikte zin, maar wel een effectieve manier om de impact van frontend-ballast te reduceren.
Je kunt het ook programmatisch oplossen:
add_action('wp_enqueue_scripts', function() {
if (!is_page('contact')) {
wp_dequeue_script('contact-form-7');
wp_dequeue_style('contact-form-7');
}
}, 100);
Dit zorgt ervoor dat Contact Form 7 alleen zijn assets laadt op de contactpagina, niet op elke pagina van je site.
Stap 6: beslissing nemen
Je hebt de data. Nu moet je beslissen wat je met de trage plugin doet. Er zijn vier opties:
Optie 1: configuratie aanpassen
Soms is de plugin niet het probleem, maar de configuratie. Voorbeelden:
- Een SEO-plugin die bij elk request de XML-sitemap opnieuw genereert
- Een WooCommerce-extensie die product-aanbevelingen berekent zonder caching
- Een formulieren-plugin die bij elke pageload een licentiecheck doet
Check de plugin-instellingen op onnodige features en schakel ze uit.
Optie 2: caching toevoegen
Als de plugin zware maar herhaalbare bewerkingen uitvoert, kan caching de oplossing zijn. Object caching met Redis vangt herhaalde database-queries op. Full page caching voorkomt dat de plugin-code überhaupt wordt uitgevoerd bij gecachte pagina's.
Optie 3: alternatief zoeken
Sommige plugins zijn simpelweg slecht gecodeerd. Als een plugin structureel 200+ queries per pageview uitvoert zonder dat dit door configuratie te verhelpen is, zoek dan een alternatief. De WordPress Plugin Directory toont bij elke plugin het aantal actieve installaties en de supportgeschiedenis - dat geeft een indicatie van de kwaliteit.
Optie 4: verwijderen
Heb je de plugin echt nodig? Veel sites draaien plugins die ooit zijn geinstalleerd voor een eenmalig doel en sindsdien vergeten zijn. Deactiveren is niet genoeg - verwijder de plugin volledig en ruim achtergebleven database-entries op.
Veelvoorkomende boosdoeners
Sommige categorieën plugins veroorzaken vaker problemen dan andere:
| Categorie | Typisch probleem | Oplossingsrichting |
|---|---|---|
| Page builders | Grote hoeveelheid shortcodes en meta-queries | Object caching, minimalistische templates |
| Social sharing | Externe API-calls bij elke pageview | Caching van share counts, lazy loading |
| Statistieken/analytics | Database-writes bij elk bezoek | Externe dienst (Google Analytics), geen server-side tracking |
| Backup-plugins | Zware processen die op ongelukkige momenten starten | Scheduling buiten piekuren, server-level backups |
| Broken link checkers | Continue crawling van alle content | Periodiek handmatig uitvoeren, niet permanent actief |
| WooCommerce-extensies | Ongeoptimaliseerde productqueries | Indexen toevoegen, object caching |
Een systematische aanpak
Debugging van trage plugins hoeft geen gokwerk te zijn. Volg dit schema:
- Meten - Query Monitor en browser DevTools geven je harde cijfers
- Isoleren - de halvering-methode vindt de boosdoener snel
- Analyseren - slow query log, EXPLAIN en PHP-profiling tonen de oorzaak
- Oplossen - configuratie aanpassen, caching toevoegen, alternatief kiezen of verwijderen
- Valideren - meet opnieuw en vergelijk met je baseline
Documenteer je bevindingen. De volgende keer dat je site vertraagt, heb je een referentiepunt en een bewezen methode.
Preventie: trage plugins voorkomen
Voorkomen is beter dan genezen. Een paar gewoontes die helpen:
- Test nieuwe plugins altijd op staging - meet de TTFB voor en na installatie
- Monitor je site continu - tools als New Relic of de gratis versie van GTmetrix geven waarschuwingen bij plotselinge vertragingen
- Review plugin-kwaliteit voor installatie - check de laatste update-datum, het aantal actieve installaties en de supportreacties
- Houd je pluginlijst lean - deactiveer en verwijder plugins die je niet actief gebruikt
- Combineer met PHP-FPM tuning - een goed geconfigureerde PHP-omgeving handelt plugin-overhead efficiënter af
Veelgestelde vragen
Hoe weet ik welke plugin mijn WordPress-site vertraagt?
Installeer Query Monitor en bekijk de hoogtepunten per component. Je ziet precies hoeveel queries, laadtijd en geheugen elke plugin verbruikt. Combineer dit met de waterfall in je browser DevTools om frontend-impact te meten.
Kan ik plugins testen zonder ze te deactiveren voor bezoekers?
Ja. Gebruik een staging-omgeving of de Health Check & Troubleshooting-plugin van WordPress. Die laatste schakelt plugins alleen voor jouw sessie uit, terwijl bezoekers de normale site blijven zien.
Wat is een acceptabele laadtijd per plugin?
Er is geen harde grens, maar een plugin die meer dan 100 ms aan de server response time toevoegt, verdient onderzoek. Als een plugin meer dan 50 extra database-queries uitvoert per pageview, is dat een duidelijk signaal om alternatieven te overwegen.
Is het beter om veel kleine plugins te gebruiken of enkele grote?
Het aantal plugins is minder belangrijk dan hun kwaliteit. Eén slecht gecodeerde plugin kan meer vertraging veroorzaken dan twintig lichtgewicht plugins samen. Focus op de daadwerkelijke impact, niet op het aantal.