Naar hoofdinhoud
TIEMAN.IT

Stop met WordPress-spaghetti

Tachtig plugins, vier seconden laadtijd en een security-incident om drie uur ’s nachts. Dat hoort niet bij je website. Ik migreer jouw WordPress naar maatwerk Next.js en lever je een site die je zelf begrijpt en beheert.

WordPress is geen slechte keuze, maar het groeit tegen je

WordPress heeft een reden waarom het op veertig procent van het web draait. Het is flexibel, de community is groot, en voor een klein budget krijg je snel een werkende site. Maar die flexibiliteit heeft een prijs: alles is gebaseerd op plugins, themes en een database die niet ontworpen zijn om samen te werken.

In het begin valt dat niet op. Je installeert een contact-formulier-plugin, een SEO-plugin, een caching-plugin, een backup-plugin. Prima. Maar zodra je site groeit en je meer functionaliteit toevoegt, meer plugins activeert en meer themes aanpast, ontstaat er een web van afhankelijkheden dat niemand meer volledig overziet. Jijzelf ook niet.

Ik noem dat WordPress-spaghetti. Niet als kritiek op de tool, maar als beschrijving van een patroon dat ik keer op keer zie bij MKB-sites die vijf jaar oud zijn: twintig, dertig, soms tachtig plugins. Themes aangepast door drie verschillende ontwikkelaars. Een update-schema dat niemand meer bijhoudt want de site breekt dan.

Wat er in de praktijk fout gaat bij WordPress op schaal

De problemen die ik het meest tegenkom bij WordPress-sites die te lang zijn doorgegroeid:

  • Plugin-conflicten: twee plugins die dezelfde jQuery-versie vereisen maar dan conflicteren. Een update van WooCommerce die de betaalpagina breekt. Een Elementor-update die custom CSS overschrijft.
  • Security-kwetsbaarheden: WordPress is het meest aangevallen CMS ter wereld. Elke niet-bijgewerkte plugin is een potentiële aanvalsvector. Ik kom regelmatig sites tegen die drie versies achterlopen op kritische patches.
  • Performance-problemen: Elementor en Divi laden megabytes aan CSS en JavaScript voor elke pagina, ook als je die bouwer alleen voor de homepagina gebruikt. Een LCP van vier seconden is geen uitzondering. Het is de norm.
  • Licentiekosten die oplopen: premium plugins kosten €50–€300 per jaar, per plugin. Een site met tien premium plugins betaalt jaarlijks meer aan licenties dan aan hosting.
  • Ontwikkelaarsschaarste: WordPress-ontwikkelaars zijn er genoeg, maar een goede developer die ook weet hoe performance, security en custom post-types samenhangen, is schaars en duur.
  • Lock-in door page-builders: een site gebouwd in Elementor of Beaver Builder is praktisch niet overdraagbaar naar een andere aanpak zonder alles opnieuw te bouwen.

Dit is geen theorie. Dit zijn de bevindingen die ik tegenkom in de audit die ik altijd doe voordat ik aan een migratie begin. De meeste klanten zijn verrast door de omvang, niet door het bestaan.

Hoe ik jouw content en URLs migreer

De technische kern van een WordPress-migratie is de content-export en de redirect-mapping. WordPress heeft een REST API die ik gebruik om alle posts, pagina’s, custom post types, media en taxonomieën gestructureerd te exporteren. Dat geeft me een JSON-dump die ik vervolgens kan transformeren naar MDX-bestanden of een headless CMS.

Naast de content bouw ik een volledige URL-map. Ik crawl jouw bestaande site, vergelijk die met de Google Search Console-data, en bouw een redirect-tabel die elke geïndexeerde URL koppelt aan de nieuwe URL-structuur. Die tabel wordt 301-redirect voor 301-redirect geïmplementeerd voordat de nieuwe site live gaat.

  • WP REST API-export: alle posts, pagina’s, custom post types en media worden geëxporteerd via de standaard WordPress REST-endpoints. Geen handmatig kopiëren.
  • Content-transformatie: de ruwe WordPress-HTML wordt omgezet naar schone MDX of CMS-invoer, zonder shortcodes, zonder Elementor-markup, zonder verborgen stijlen.
  • Redirect-mapping: elke URL die in Google geïndexeerd staat, krijgt een 301-redirect naar de equivalente nieuwe URL. Inclusief pagina-2-varianten en categorie-URLs.
  • Sitemap-inzending: na livegang stuur ik de nieuwe sitemap.xml naar Google Search Console en monitor ik de crawl-statistieken.

Security: het stille risico van een verouderde WordPress-site

WordPress-beveiliging is een actieve bezigheid, geen eenmalige instelling. Elke dag worden er nieuwe kwetsbaarheden ontdekt in plugins en themes. Als je een plugin niet bijwerkt omdat je bang bent dat de site breekt, sta je de deur open voor geautomatiseerde aanvallen die WordPress-installaties massaal scannen op bekende kwetsbaarheden.

Ik heb klanten gehad die ontdekten dat hun WordPress-site al maanden deel uitmaakte van een spamnetwerk. De site werkte gewoon, maar de server stuurde duizenden spam-mails per dag. In een ander geval was er een redirect geïnjecteerd die mobiele bezoekers doorstuurde naar een phishing-pagina. Beide incidenten waren het gevolg van een niet-bijgewerkte plugin.

Next.js heeft dit probleem structureel niet. Er is geen database die rechtstreeks aangesproken kan worden via een SQL-injectie. Er is geen plugin-architectuur met achterdeurtjes. De aanvalsoppervlakte is minimaal: statische bestanden, een API-endpoint als dat nodig is, en een beheerde hosting-omgeving. Na de migratie hoef je niet meer dagelijks te controleren of er een plugin-update klaarstaat die je site kan breken.

-- Klant-casus

Van 83 plugins en 4,2s LCP naar Lighthouse 100 en 12 dependencies

Een zorgpraktijk in Overijssel met drie behandellocaties draaide op een WordPress-site die in de loop van acht jaar was uitgegroeid tot 83 actieve plugins, een Elementor-theme met honderden custom CSS-regels en een WooCommerce-installatie voor het boeken van online afspraken. De site was technisch operationeel, maar presteerde slecht: LCP op 4,2 seconden, Lighthouse Performance tussen 28 en 35, en tientallen crawl-fouten in Google Search Console.

Bij de intake kwamen de volgende metingen boven:

4,2s
LCP voor migratie (WordPress)
0,8s
LCP na migratie (Next.js)
100
Lighthouse Performance

De nieuwe site draait op Next.js met een eigen CMS als CMS voor de medewerkers-pagina’s en de blogposts. WooCommerce is vervangen door een integratie met het eigen afsprakensysteem van de praktijk via een lichtgewichte API-verbinding. Het aantal dependencies is teruggebracht van 83 plugins naar 12 npm-packages. De praktijkmanager beheert nu zelf de content via een eigen CMS, zonder toegang tot de WordPress-admin of gevaar voor plugin-conflicten.

Wat ik anders doe dan een WordPress-bureau

De meeste WordPress-bureaus lossen een WordPress-probleem op met een WordPress-oplossing: een betere caching-plugin, een ander theme, meer servergeheugen. Dat werkt op de korte termijn, maar het lost het structurele probleem niet op. Plugins zijn niet het probleem. Het systeem van afhankelijkheden is het probleem.

Ik werk niet met WordPress als output. Ik gebruik WordPress als startpunt: ik lees jouw data via de REST API, exporteer jouw content, en bouw een nieuwe omgeving in Next.js die geen van de WordPress-aannames heeft. Geen database die vatbaar is voor SQL-injectie. Geen plugin-updates die de site kunnen breken. Geen maandelijkse licenties voor formulier-plugins.

Wat ik meeneem: jouw content, jouw URLs, jouw SEO-positie en jouw design-intentie. Wat ik achterlaat: de technische schuld, de plugin-hel en de security-risico’s. Het resultaat is een site die jij volledig begrijpt, die door mij beheerd kan worden, en die niet afhankelijk is van de roadmap van een third-party plugin-ontwikkelaar.

Beheer en CMS na de migratie

Een veelgehoorde zorg: ‘Maar ik wil zelf mijn content kunnen aanpassen.’ Dat kan. En beter dan in WordPress. Afhankelijk van de hoeveelheid content en hoe vaak je die aanpast, kies ik voor:

  • een eigen CMS: een Git-gebaseerd CMS dat direct in de repository schrijft. Geen aparte database, geen aparte server. Jij bewerkt content in een overzichtelijke UI, ik zie de wijziging als een Git-commit.
  • een eigen CMS: een headless CMS met een volledig configureerbare redactie-interface. Geschikt als je meerdere redacteuren hebt of als de content-structuur complex is.
  • MDX-bestanden: voor eenvoudige sites met weinig content-updates werkt een directe MDX-structuur ook. Je bewerkt Markdown-bestanden, ik deploy automatisch via een CI/CD-pipeline.
  • Geen CMS: voor brochure-sites waarbij de content zelden wijzigt, is een CMS overbodig. Ik lever de pagina’s als statische bestanden en je vraagt me als er iets moet veranderen.

In alle gevallen heb je volledige toegang tot je eigen data. Er is geen WordPress-admin waarvoor je een apart wachtwoord beheert, geen database die apart beveiligd moet worden, en geen plugin die jouw content in een eigen formaat opslaat dat moeilijk te exporteren is.

Wat kost dit?

Elk project is anders. De prijs hangt af van jouw site, de omvang en wat er nodig is. Geen tarief zonder eerst te begrijpen wat je nodig hebt.

WordPress-migratie Basis
Op aanvraag
Tot 10 pagina's. WP REST API-export, redirect-map, Lighthouse 95+. Geen WooCommerce, geen custom post types.
WordPress-migratie Uitgebreid
Op aanvraag
Tot 50 pagina's plus blogposts. Custom post type-migratie via WP REST API. CMS-keuze (mijn eigen CMS in jouw site). WooCommerce-scope apart bepaald.
WordPress-migratie Maatwerk
Op aanvraag
Complexe installaties: tachtig of meer plugins, Elementor-zware themes, WooCommerce met koppelingen aan externe systemen. Scope na intake.

Plan een kort gesprek. Ik kijk naar jouw situatie en geef een eerlijk voorstel.

Lees verder

-- Veelgestelde vragen

Heb je een vraag?

Dat hangt af van de complexiteit. Eenvoudige productcatalogi met een standaard checkout kan ik omzetten naar een Next.js-frontend met Stripe-integratie of een andere betalingsprovider. Als je WooCommerce gebruikt met veel custom plugins, extensies of een koppeling aan een boekhoudpakket, bespreek ik de opties na de audit. Soms is het verstandiger om het WooCommerce-gedeelte tijdelijk als aparte subdomein te laten draaien terwijl de rest migreert.
Ik crawl je huidige site en combineer die data met je Google Search Console-gegevens om een volledige URL-map te bouwen. Elke URL die verkeer of backlinks ontvangt, krijgt een 301-redirect naar de equivalente nieuwe URL. De redirects worden geconfigureerd in de Next.js redirects-instelling of in de Traefik/Nginx-laag, afhankelijk van je hosting-setup.
Ik exporteer alle posts via de WP REST API als gestructureerde JSON. Vervolgens transformeer ik die naar MDX-bestanden of CMS-entries, inclusief afbeeldingen, categorieën en tags. De URL-structuur van de posts wordt zoveel mogelijk bewaard. Als je bestaande posts op /blog/titel-van-post staan, blijven ze op hetzelfde pad.
Ja. Custom post types exporteer ik via de WP REST API, ook als die via een plugin zijn aangemaakt. In de nieuwe Next.js-omgeving worden ze omgezet naar CMS-schema’s (mijn eigen CMS in jouw site) of naar statische MDX-directories, afhankelijk van hoe dynamisch die content is.
De meeste WordPress-plugins hebben directe equivalenten in Next.js zonder een third-party licentie nodig: formulieren via React Hook Form of een lichtgewichte serverless functie, kaarten via de Google Maps JavaScript API of Mapbox, social media via oEmbed of directe embed-codes. Ik documenteer per plugin welk alternatief ik gebruik.
Dat is een keuze. Als je content regelmatig wisselt, stel ik mijn eigen CMS in jouw site in. Dat geeft je een redactie-interface die even toegankelijk is als WordPress-admin maar zonder de security-kwetsbaarheden. Als je content vrijwel nooit wijzigt, is er geen CMS nodig en vraag je me simpelweg als er iets moet veranderen.

Klaar om WordPress-spaghetti achter je te laten?

Stuur me jouw site-URL. Ik kijk welke plugins je draait, hoe de performance is en wat een migratie realistisch oplevert. Zonder verkoopverhaal.