WordPress website
laten bouwen met vakmanschap.
Bouwen is meer dan klikken en slepen. Wij schrijven WordPress websites regel voor regel, met dezelfde precisie waarmee een architect een fundament berekent. Geen visuele builders, geen samengeraapte plugins, geen shortcuts. Elke regel PHP, elke CSS property en elk stuk JavaScript heeft een reden om er te staan. Dat is het verschil tussen een website die er goed uitziet en een website die goed gebouwd is.
Gebouwd voor bedrijven door heel Nederland
Waarom bouwen iets anders is dan samenstellen
De meeste WordPress websites in Nederland worden niet gebouwd. Ze worden samengesteld. Een theme uit een marketplace, een pagebuilder als tussenlaag, een handvol plugins die elk een stukje functionaliteit toevoegen. Het eindresultaat functioneert, tot op zekere hoogte. Maar het is geen bouwwerk. Het is een stapeling van onderdelen die nooit voor elkaar bedoeld waren, bijeengehouden door hoop en compatibiliteit.
Bouwen, in de echte betekenis van het woord, begint met een leeg bestand. Het begint met de vraag: wat moet deze website doen, voor wie, en hoe bereiken we dat met zo min mogelijk code en zo veel mogelijk controle? Pas als die vragen beantwoord zijn, schrijven we de eerste regel. Dat is de filosofie die elke WordPress website die wij opleveren doordrenkt. Niet meer code dan nodig. Niet minder dan optimaal. Precies wat het project vraagt, handgeschreven en doordacht.
In de bouwwereld zou niemand accepteren dat een aannemer prefab wanden tegen elkaar plakt en het een huis noemt. In webdevelopment is dat helaas de standaard geworden. Wij kiezen bewust voor het ambacht. Niet omdat het sneller is, niet omdat het goedkoper is, maar omdat het resultaat fundamenteel beter is. Op elk meetbaar criterium: snelheid, veiligheid, onderhoudbaarheid, levensduur en controle.
Code als ambacht: wat er onder de motorkap zit
De broncode van een website is voor de meeste opdrachtgevers onzichtbaar. Je ziet het ontwerp, je voelt de snelheid, je ervaart het gemak waarmee je content kunt bewerken. Maar achter al die ervaringen zit code. En de kwaliteit van die code bepaalt of je website over drie jaar nog steeds soepel draait of dat je voor de keuze staat om opnieuw te beginnen. Hieronder een kijkje onder de motorkap van hoe wij WordPress websites bouwen.
WordPress Coding Standards als vertrekpunt
WordPress heeft officiële coding standards voor PHP, HTML, CSS en JavaScript. Die standards definiëren hoe code geformateerd moet worden, hoe functies benoemd worden, hoe commentaar geschreven wordt en welke patronen wel en niet acceptabel zijn. Het zijn geen suggesties: het is de standaard waarmee WordPress Core zelf gebouwd wordt. Onze code volgt deze standards strikt. Dat betekent dat elke developer die na ons de code opent, direct begrijpt wat er gebeurt. Consistent genaamde functies, logische bestandsstructuur, documentatie bij elke functie en voorspelbare patronen. Code die je kunt lezen als een boek, niet als een puzzel.
Escaping en sanitization: beveiliging in elke regel
Een van de meest onderschatte aspecten van WordPress development is output escaping en input sanitization. Elke variabele die naar de browser wordt gestuurd, moet ge-escaped worden om cross-site scripting aanvallen te voorkomen. Elke input die van een gebruiker komt, moet gesanitized worden voordat die in de database terechtkomt. WordPress biedt daar uitstekende functies voor: esc_html, esc_attr, esc_url, wp_kses, sanitize_text_field, sanitize_email. Wij gebruiken ze consequent, in elke template, bij elke output. Het is de reden waarom onze themes niet kwetsbaar zijn voor de XSS aanvallen die bij duizenden WordPress websites wel lukken.
Schone HTML: wat de browser ontvangt
De HTML die een website genereert is de taal waarin de browser denkt. Schone, semantische HTML laadt sneller, is beter toegankelijk voor screenreaders en wordt beter begrepen door zoekmachines. Onze WordPress themes genereren minimale, betekenisvolle HTML. Heading tags die de documentstructuur weerspiegelen, niet die een bepaalde tekstgrootte produceren. Lijsten voor opsommingen, nav elementen voor navigatie, article elementen voor content blokken, section elementen voor thematische groepering. Elke tag heeft een semantische reden om er te staan.
Vergelijk dat met de HTML output van een pagebuilder. Een simpele sectie met een heading en twee alinea's genereert in Elementor gemiddeld 15 geneste div elementen met inline styles, data attributes en klassen als elementor-widget-wrap, elementor-element en e-con-inner. Onze implementatie van diezelfde sectie: een section element, een heading en twee paragraph tags. Zeven regels HTML in plaats van vijftig. Dat verschil vermenigvuldigt zich over elke pagina, elke sectie, elk element. Het cumulatieve effect op laadsnelheid en parseertijd is meetbaar en substantieel.
CSS zonder ballast
De stijlen van een pagebuilder website bevatten CSS voor elke mogelijke layout optie, elk denkbaar widget type en elke kleurcombinatie die het systeem ondersteunt. Bij Elementor is dat een stylesheet van meer dan 300KB die bij elke paginaload volledig meegestuurd wordt, ook al gebruik je maar een fractie van de beschikbare opties. Onze CSS bevat uitsluitend de stijlen die het ontwerp nodig heeft. Typografie, layout, kleuren, responsive breakpoints en animaties die daadwerkelijk in het ontwerp voorkomen. Gemiddeld komt dat neer op 15-25KB compressed CSS. Niet omdat we bezuinigen, maar omdat er simpelweg niet meer nodig is als je alleen schrijft wat je gebruikt.
Database queries: alleen ophalen wat je nodig hebt
Elke WordPress paginaload triggert database queries. De vraag is: hoeveel? Een pagebuilder site haalt niet alleen de content op, maar ook de layout configuratie, de widget instellingen, de global styles, de responsive settings en de revisiehistorie van elke builder sectie. Dat kan oplopen tot meer dan honderd queries per paginaload. Onze WordPress websites halen de content op die de pagina nodig heeft en niets meer. Met WP_Query gebruiken we alleen de velden die we nodig hebben via de fields parameter. Met get_post_meta halen we specifieke meta waarden op in plaats van alle metadata in een keer. Transient caching voor queries die niet bij elke load opnieuw uitgevoerd hoeven te worden. Het resultaat: gemiddeld 15-25 database queries per pagina in plaats van 80-120.
Performance engineering: hoe wij sub-seconde laadtijden bereiken
Een snelle website is geen toevalligheid en geen kwestie van een caching plugin installeren. Het is het resultaat van tientallen technische beslissingen die samen zorgen voor een totaalervaring waarin elke pagina in minder dan een seconde volledig geladen is. Hier is hoe we dat bereiken, op codeniveau.
Critical rendering path optimalisatie
De critical rendering path is het pad dat de browser aflegt van het ontvangen van de eerste byte HTML tot het tonen van de eerste pixel op het scherm. Hoe korter dat pad, hoe sneller de pagina zichtbaar is voor de bezoeker. Wij optimaliseren dat pad door critical CSS inline te plaatsen in de head van het document. Dat zijn de stijlen die nodig zijn om de bovenste zichtbare helft van de pagina te renderen, de above the fold content. De rest van de CSS laden we asynchroon met rel="preload" en een onload fallback. JavaScript dat niet direct nodig is voor de initiële render wordt deferred geladen of krijgt het async attribuut. Fonts worden gepreload met font-display: swap zodat de tekst direct zichtbaar is, ook als het font nog onderweg is.
Server-side caching strategie
Onze WordPress hosting draait op LiteSpeed met objectcaching via Redis. Maar caching is niet simpelweg een schakelaar die je aanzet. Het vereist een theme dat compatibel is met full page caching, dat geen willekeurige PHP variabelen in de HTML mixt en dat dynamische elementen correct afhandelt via Edge Side Includes of JavaScript hydration. Onze themes zijn gebouwd met caching als uitgangspunt. Geen PHP die bij elke paginaload opnieuw uitgevoerd wordt voor statische elementen. Geen nocache headers waar ze niet nodig zijn. Het resultaat is een Time to First Byte van gemiddeld 80 tot 150 milliseconden, waar een niet-gecachede WordPress installatie gemiddeld op 800 tot 1200 milliseconden zit.
Afbeeldingsoptimalisatie op meerdere niveaus
Afbeeldingen zijn verantwoordelijk voor gemiddeld 60 tot 70 procent van het totale gewicht van een webpagina. Onze aanpak: automatische conversie naar WebP formaat met een AVIF fallback waar ondersteund. Responsive images via het srcset attribuut zodat mobiele apparaten niet dezelfde 2000 pixels brede afbeelding laden als een desktop scherm. Lazy loading met de native loading="lazy" attribuut voor alle afbeeldingen buiten de initiële viewport, gecombineerd met fetchpriority="high" voor de Largest Contentful Paint afbeelding. Aspect ratio attributen op elk img element om layout shifts te voorkomen. Width en height definiëren we altijd, zodat de browser ruimte reserveert voordat de afbeelding geladen is. Die combinatie levert een Cumulative Layout Shift van 0 op, wat rechtstreeks bijdraagt aan een hogere Google ranking.
Resource hints en preloading
Moderne browsers ondersteunen resource hints die de laadstrategie verbeteren: dns-prefetch voor domeinen waar de pagina naar linkt, preconnect voor domeinen waar direct resources van geladen worden en preload voor kritieke bestanden die zo snel mogelijk beschikbaar moeten zijn. Wij configureren deze hints specifiek per pagina op basis van welke resources die pagina daadwerkelijk nodig heeft. Geen generieke lijst met preloads die op elke pagina geladen wordt, maar gerichte hints die de browser helpen om de juiste prioriteiten te stellen. In combinatie met HTTP/2 multiplexing en onze LiteSpeed configuratie levert dat een waterfall diagram op waar vrijwel alle resources parallel geladen worden, zonder onnodige round trips.
Core Web Vitals als meetlat
Google meet de gebruikerservaring van websites via drie Core Web Vitals: Largest Contentful Paint (hoe snel de grootste content verschijnt), Cumulative Layout Shift (hoe stabiel de pagina is tijdens het laden) en Interaction to Next Paint (hoe snel de pagina reageert op interactie). Onze WordPress websites scoren consistent in de groene zone op alle drie de metrics. Niet omdat we achteraf optimaliseren tot de scores kloppen, maar omdat de scores het natuurlijke resultaat zijn van hoe we bouwen. Als je begint met schone code, minimale resources en een doordachte laadstrategie, volgen goede Core Web Vitals vanzelf. Bij pagebuilder sites is het andersom: je begint met een zwaar framework en probeert achteraf de impact te beperken met caching plugins en lazy loading trucs. Dat werkt tot op zekere hoogte, maar het is bestrijding van symptomen in plaats van het wegnemen van de oorzaak.
Van ontwerp naar werkende WordPress website: het technische bouwproces
Het ontwerp is klaar. Goedgekeurd. De mockups zien er precies uit zoals je ze voor ogen had. Maar hoe wordt een visueel ontwerp een werkende WordPress website? Dat transformatieproces is waar het technische vakmanschap zit. Hieronder nemen we je stap voor stap mee door hoe wij een goedgekeurd ontwerp omzetten in een volledig functioneel WordPress theme.
Stap 1: Componentenanalyse
Voordat we een enkele regel code schrijven, ontleden we het ontwerp in herbruikbare componenten. Welke elementen komen op meerdere pagina's terug? Welke secties zijn variaties op hetzelfde patroon? Waar zitten de dynamische onderdelen die vanuit WordPress gevuld moeten worden? Die analyse bepaalt de bestandsstructuur van het theme, de template parts die we aanmaken en de manier waarop we content velden definiëren. Het is het architectuurplan van het bouwwerk. Als je hier slordig bent, betaal je dat later terug in dubbele code, inconsistenties en een dashboard dat onlogisch in elkaar zit.
Stap 2: HTML en CSS als statisch prototype
We beginnen met het vertalen van het ontwerp naar statische HTML en CSS. Zonder WordPress, zonder PHP, zonder dynamische content. Pure markup en styling. Dit prototype is pixel-perfect identiek aan het goedgekeurde ontwerp en functioneert in de browser als een volledig responsieve website. Het voordeel van deze tussenstap: we valideren het ontwerp in de browser voordat we het complexer maken met WordPress integratie. Responsive gedrag, typografie, animaties, hover states en formulierlayouts worden nu getest en verfijnd. Elke inconsistentie die we hier vangen, hoeven we niet later in PHP te repareren.
Stap 3: WordPress integratie
Nu wordt het statische prototype een dynamisch WordPress theme. De HTML templates worden PHP bestanden in de WordPress template hierarchy. Hardcoded teksten worden WordPress functies: the_title, the_content, the_excerpt. Herhalende secties worden WordPress loops met WP_Query. Bewerkbare velden worden geregistreerd via Advanced Custom Fields en gekoppeld aan de juiste templates. Navigatie wordt een wp_nav_menu met een custom walker class die de HTML genereert die het ontwerp vereist. Het WordPress dashboard wordt ingericht met custom post types, taxonomieën en option pages zodat elke bewerkbare content een logische plek heeft.
Stap 4: Custom post types en content architectuur
WordPress kent standaard twee content types: posts en pages. Voor de meeste bedrijfswebsites is dat niet voldoende. Een aannemer heeft projecten. Een restaurant heeft gerechten op een menu. Een advocatenkantoor heeft rechtsgebieden en teamleden. Wij registreren custom post types die passen bij de content structuur van het bedrijf. Met custom taxonomieën voor categorisering, custom meta fields voor gestructureerde data en template files die specifiek zijn voor elk post type. De slugs, labels en menu posities worden afgestemd op de navigatiestructuur van het ontwerp. Het resultaat is een WordPress dashboard dat aanvoelt alsof het speciaal voor jouw bedrijf gebouwd is, omdat het dat ook is.
Stap 5: Formulieren, interactie en functionaliteit
Contactformulieren, offerte aanvragen, filterbare portfolio's, interactieve kaarten, accordeons, tabbladen: elke interactieve functionaliteit wordt op maat geschreven. Formulieren worden verwerkt via AJAX met nonce verificatie en server-side validatie. Geen page reload, geen onnodige plugin overhead. De bevestigingsmails worden getriggerd via wp_mail met een custom HTML template. Formulierdata wordt opgeslagen in een custom database tabel als de opdrachtgever dat wil, of direct doorgestuurd per mail. Interactieve elementen gebruiken vanilla JavaScript of minimale libraries. Geen jQuery dependency tenzij het project het vereist, geen 200KB animatiebibliotheek voor een simpele fade-in.
Stap 6: Testen op elk niveau
Voordat een website onze testomgeving verlaat, doorloopt die een uitgebreide testprocedure. Cross-browser testing in Chrome, Firefox, Safari en Edge. Responsive testing op fysieke apparaten: iPhones, Android telefoons, iPads en diverse schermformaten. Formuliertests met geldige en ongeldige input. Toegankelijkheidschecks met axe DevTools. Performance audits met Lighthouse en WebPageTest. Broken link checks over alle pagina's. SSL validatie. Open Graph en Twitter Card validatie voor social media previews. Schema markup validatie via het Google Rich Results Test tool. We gaan pas live als elk onderdeel groen licht heeft.
Beveiliging op codeniveau en toekomstbestendigheid
Een WordPress website beveiligen is meer dan een security plugin installeren en hopen dat het goed komt. Echte beveiliging begint in de code zelf, bij elke functie die data verwerkt, bij elke query die de database raakt en bij elke actie die een gebruiker kan uitvoeren. Hier is hoe wij beveiliging inbouwen op het niveau waar het thuishoort.
Prepared statements voor database queries
SQL injection is een van de oudste en meest voorkomende aanvalstechnieken op webapplicaties. Het principe is simpel: een aanvaller voegt SQL code in via een invoerveld, en als de applicatie die input ongefilterd in een database query stopt, kan de aanvaller data lezen, wijzigen of verwijderen. De verdediging is even simpel: prepared statements. WordPress biedt de wpdb::prepare methode die placeholders gebruikt in plaats van directe string concatenatie. Wij gebruiken prepared statements voor elke custom database query, zonder uitzondering. Het is een absolute regel in onze codebase: geen enkele variabele van buitenaf komt ooit direct in een SQL query terecht.
Nonce verificatie voor formulieren en AJAX
Nonces in WordPress zijn eenmalige tokens die verifiëren dat een actie uitgevoerd wordt door een geautoriseerde gebruiker via het verwachte formulier of endpoint. Zonder nonce verificatie kan een kwaadwillige website een verzoek doen namens een ingelogde gebruiker. Dat heet cross-site request forgery en het is verrassend eenvoudig uit te voeren op websites die geen nonces gebruiken. Wij genereren nonces voor elk formulier en elke AJAX call, verifiëren ze server-side met wp_verify_nonce en weigeren elk verzoek dat de verificatie niet doorstaat. Het is een extra stap in de code die een groot verschil maakt in de beveiliging.
Capability checks voor admin functies
WordPress heeft een uitgebreid rollen- en rechtensysteem. Niet elke ingelogde gebruiker mag dezelfde dingen doen. Een redacteur mag content bewerken maar geen plugins installeren. Een abonnee mag een profiel bewerken maar geen pagina's publiceren. Wij controleren bij elke actie of de huidige gebruiker de juiste rechten heeft via current_user_can. Custom admin pagina's, custom REST API endpoints en custom AJAX handlers: ze bevatten allemaal een capability check voordat ze een actie uitvoeren. Het voorkomt dat een gebruiker met beperkte rechten per ongeluk of opzettelijk functies bereikt die niet voor hen bedoeld zijn.
Toekomstbestendigheid door standaarden
WordPress brengt meerdere keren per jaar updates uit. Major versies voegen nieuwe functies toe en wijzigen soms de manier waarop het platform werkt. Themes die gebouwd zijn met shortcuts, deprecated functies of directe database manipulatie breken bij zulke updates. Onze themes gebruiken uitsluitend de officiële WordPress API's en functies. Geen directe $wpdb queries waar een WordPress functie beschikbaar is. Geen directe bestandsmanipulatie waar de WordPress Filesystem API gebruikt kan worden. Geen hardcoded paden waar WordPress constanten bestaan. Die discipline betekent dat onze themes compatibel blijven met toekomstige WordPress versies zonder aanpassingen. We hebben themes draaien die vijf jaar geleden zijn gebouwd en die na elke WordPress update feilloos blijven functioneren.
Het contrast met een pagebuilder website
Een Elementor of Divi website is afhankelijk van een jaarlijkse licentie. Als je stopt met betalen, krijg je geen updates meer. Geen updates betekent geen beveiligingspatches. Het betekent ook dat bij een WordPress major update de pagebuilder mogelijk niet meer compatibel is. Je bent overgeleverd aan het updateschema van een commercieel bedrijf. Bij een custom theme heb je die afhankelijkheid niet. De code is van jou, volgt WordPress standaarden en is niet gekoppeld aan een licentiemodel. Als WordPress over vijf jaar versie 8 draait, werkt jouw theme nog steeds. Omdat het gebouwd is op de fundamenten die WordPress zelf gebruikt, niet op een laag erboven die elk moment kan veranderen.
Hoe scoort jouw website?
Scan je website op snelheid, veiligheid en privacy. Direct resultaat, volledig gratis.
Wat onze klanten zeggen
Echte reviews van echte klanten.
Handgeschreven code vs. een pagebuilder constructie.
Onder de motorkap verschilt een custom gebouwde WordPress website fundamenteel van een website die met een visuele builder is samengesteld.
Wiwi custom bouw
- Theme geschreven vanaf een leeg bestand
- HTML output: 7 elementen voor een sectie
- CSS totaal: 15-25KB compressed
- Database queries per pagina: 15-25
- Geen jaarlijkse licentiekosten voor het theme
- Compatibel met toekomstige WordPress updates
- Code leesbaar voor elke PHP developer
Pagebuilder constructie
- Visuele builder bovenop een gekocht theme
- HTML output: 50+ elementen voor een sectie
- CSS totaal: 300KB+ ongecompressed
- Database queries per pagina: 80-120
- Jaarlijkse licentie verplicht voor updates
- Afhankelijk van compatibiliteit na updates
- Code onleesbaar door gegenereerde structuur
Hetzelfde WordPress platform. Een fundamenteel ander bouwwerk.
Veelgestelde vragen.
Neem contact op.
We denken graag mee. Vrijblijvend en eerlijk.
Projecten op maat.
Een selectie van onze recente projecten.