— —Blog
Notities van de kade.
Praktisch werk over verouderde WordPress-, Drupal-, Joomla-, Magento- en custom-PHP-sites — en het gereedschap eromheen. Dinsdag en donderdag.
— Recent —
132
-
Joomla 4 geeft 500 na Akeeba-restore: action_logs-fix
Een gewone Akeeba-restore. Een blanco 500. Veertig minuten grep, schema-reconstructie en één stille INSERT later draaide de Joomla 4-site weer. -
PHP 7.4 naar 8.2 upgrade: pre-flight audit-checklist
Je hebt ja gezegd tegen de PHP 8.2-sprong op een tien jaar oude WordPress. Voordat het onderhoudsvenster opengaat, dit is de audit die het saai houdt. -
Drupal watchdog handmatig: severity, type, vier queries
De dblog-adminpagina toont 50 rijen en aggregeert niets. De watchdog-tabel zelf beantwoordt wat de UI niet kan. Drie kolommen en vier queries. -
wp-config.php debug-constanten: de negen die wij altijd zetten
Een site valt in je inbox: SFTP-creds, vage symptomen, geen documentatie. Voor we ook maar één regel pluginbroncode lezen, zetten we negen wp-config-constanten. -
WordPress multisite migreren in één zondag: playbook
Een Plesk-bak op PHP 7.4 met een multisite van 12 sites, een verse VPS bij Hetzner, en een zondag van 09:00 tot 17:00 om alles om te zetten voor maandag. -
Symfony 6-intranetmigratie: elf weekenden, nul downtime
Elf weekenden, één strangler-proxy en een urenformulier dat nooit uitviel. Hoe een intern team een PHP-intranet uit 2011 op Symfony 6 zette. -
Magento 2 cron_schedule op 14M rijen: een vrijdagpostmortem
Een Magento 2-shop zag zijn cron_schedule op vrijdagmiddag 14 miljoen rijen halen. Hier de prune, de lock die we accepteerden, en de config die het stopte. -
Spammend contactformulier: 30 minuten incidentrespons
23:41 op een dinsdag. Een oud WordPress-formulier werd een open relay en de hosting heeft vijftien minuten geduld. Hier is een IR van dertig minuten. -
WordPress nonces: wat wp_verify_nonce werkelijk doet
Het formulier werkt 's ochtends, breekt 's middags, niemand kan het reproduceren. De bug zit in hoe je leest wat wp_verify_nonce teruggeeft. -
Van osCommerce naar WooCommerce: zes weekenden, SEO intact
Een osCommerce-shop van 14 jaar oud in zes weekenden omgezet naar WooCommerce. De URL-map, de specials-naar-sale-price brug en de SEO die bleef staan. -
PHP-FPM pools afstemmen: 2GB, 4GB en 8GB VPS vergeleken
Een WooCommerce shop crasht om lunchtijd. PHP-FPM zit op 100% poolcapaciteit en je host wil je VPS opschalen. Voor je klikt: hier is de rekensom. -
Magento 1 AI-productteksten: staging die standhoudt
Een read-only staging-kopie is de goedkoopste verzekering tegen AI-teksten die de verkeerde SKU overschrijven in een Magento 1-shop uit 2014. -
Een verouderde site overnemen: de overdracht-audit op één pagina
Je neemt een WordPress-site over van een ander bureau. De code oogt prima. Dan faalt het SSL stilletjes op een server die niemand noemde. Dit is de audit die wij draaien. -
Cache-Control-lek: het woord dat PHP-sessies liet lekken
Om 16:47 zag een klant andermans bestelhistorie in zijn eigen dashboard. De bug: een Cache-Control-header op de PHP-accountpagina, één woord te kort. -
De Joomla 3 #__extensions-tabel: een veldgids in zes kolommen
Zes kolommen in #__extensions vertellen je wat Joomla daadwerkelijk laadt. Een veldgids voor het moment dat je een site overneemt waarvan de admin niet opent. -
mysqldump-flags voor legacy MySQL: de .my.cnf cheatsheet
De .my.cnf en mysqldump-flags die we op elke legacy MySQL-server zetten voor een export, plus de drie die om twee uur 's nachts een restore hebben gered. -
Drupal 7 naar static op Cloudflare Pages: 2-uur draaiboek
Drupal 7 is end of life. Je hebt er eentje geërfd. Hier is een route van twee uur naar een static export op Cloudflare Pages met het contactformulier nog werkend. -
Magento sales_order_grid: zo krimpten we 'm met 4GB
Een NL-bureau zat na Black Friday met een sales_order_grid van 4GB. Hier is de gefaseerde krimp die 'm terugbracht, met elke order intact. -
WooCommerce schrijft twee keer af: dubbele Stripe-hook
Twee payment intents, drie seconden uit elkaar, dezelfde order, dezelfde kaart. Een incident-walkthrough van een dubbele hook verstopt in mu-plugins. -
Legacy-sites bewaken: vier signalen voor solo-shops
Dertig legacy sites, één persoon, en een zondagochtend die begon met een Slack: 'checkout kapot sinds vrijdag'. Vier signalen hadden het donderdag al gevangen. -
Statamic-migratie: het vijfdaagse content-freeze draaiboek
Gefaseerd content-freeze draaiboek voor een vijfdaagse Statamic-cutover: redactionele lock, drie diff-checkpoints en de .htaccess die meegaat. -
PHP session race: de verkeerde factuur-PDF in de mail
Een Nederlands bureau belde om 23:41. Hun custom-PHP factuurportaal had de verkeerde factuur-PDF gemaild. We gaven session_start zes uur de schuld. -
Magento 1 chatbot: de read-only vorm die blijft staan
Een klant wil een chatbot op een Magento 1-shop uit 2017 schroeven. De kunst: read-only houden, weg van de checkout en uit de order-tabellen. -
Xdebug 3 via een SSH-tunnel: opzet voor SFTP-only hosts
Een werkende Xdebug 3-opzet tegen een externe SFTP-only host, met de tunnelrichting, padmapping en idekey-valkuilen die anders je middag kosten. -
Curl-recon op legacy sites: zeven one-liners voor je offerte
Een bureau dropt om 23:41 een URL en vraagt morgenvroeg een hardening-offerte. Zeven curl one-liners kosten vijf minuten en wegen het werk eerlijk. -
Joomla 3-beeldbibliotheek naar S3: 22GB-migratielog
Hoe we in één weekend een Joomla 3-beeldbibliotheek van 22GB naar S3 verplaatsten, zonder één artikelreferentie te breken of een trilling in het access log. -
WordPress functions.php hack: opruimen in vier rondes
Een gehackte theme functions.php komt zelden alleen. Dit is de cleanup in vier rondes die we draaien voor iemand wp-options of wp-posts aanraakt. -
mysqlbinlog row events lezen: een praktische veldgids
Om 23:41 pingt een agency-lead: iemand swapte wp_options.siteurl, de weblogs zijn schoon. Zo lees je mysqlbinlog row events en vind je ze terug. -
Drupal 9 502 alleen voor redacteuren: sessions-tabel vol
Een Drupal 9-site gaf op een donderdagmiddag 502's, maar alleen voor ingelogde redacteuren. De oorzaak: een sessions-tabel die ibdata1 had volgegeten. -
TLS-overdracht: cert, chain, cron en vier verborgen valkuilen
Een eenpaginige TLS-overdrachtchecklist voor overgenomen sites: de leaf, de chain, de cron en de vier verborgen valkuilen die hosts vergeten te noemen. -
Magento 2 reindex op 100% MySQL: een verouderde flat-rij
Een Magento 2 catalogus-reindex hield MySQL op 100% CPU op een dinsdag om 07:14. Oorzaak: 47 orphan rows in catalog_product_flat_1. Hier het spoor. -
wp_users SQL: drie queries die tonen wie echt inlogt
412 rijen in wp_users betekent niet 412 inloggers. Drie SQL-queries op wp_usermeta tonen wie er echt komt, wie sluimert en wie risico vormt. -
phpMyAdmin achter .htpasswd: een veilig copy-paste recept
phpMyAdmin heeft al een eigen login. Een Basic Auth-poort ervoor houdt bots volledig weg van de PHP. Het recept, plus de vier manieren waarop het je buitensluit. -
LiteSpeed vs Apache vs Nginx: WooCommerce-cache vergeleken
Eén WooCommerce-shop van zes jaar oud, 14k producten, één VPS. We wisselden drie keer van reverse cache en keken wat de TTFB daadwerkelijk verschoof. -
Retainerfactuur sjabloon: zes regels voor legacy sites
Een Utrechtse studio verving het servicecontract van twee pagina's door zes regels op de factuur zelf. Het sjabloon, en de discussies die het voorkomt. -
Drupal SFTP-lockout: herstel in 90 minuten en fail2ban-regel
Een brute-force-run sloot om 23:41 de enige admin van een Drupal 8-site buiten. Dit is het herstel van 90 minuten en de fail2ban-regel die het stopte. -
Joomla 3 naar 4: de triagetabel voor stukke extensies
Zevenenveertig extensies, zes fatals op de adminlogin en een deadline op vrijdag. Zo sorteer je die puinhoop in Update, Vervangen, Forken of Slopen. -
Freelancer-overdracht: twaalf minuten voor ze verdwijnt
Twaalf minuten is genoeg om de SSH-key, de wees-cronjob, de knoop in file ownership en de mail-alias te vinden die de freelancer vergat te noemen. -
php-fpm slowlog lezen: drie stack-trace patronen herkennen
Veldgids voor php-fpm slowlogs op shared hosting: de drie stack-trace vormen die je tegenkomt, wat ze betekenen en waar je het volgende uur moet zoeken. -
Laravel-migratie zonder downtime: booking engine herbouwd
Een 14 jaar oude custom-PHP booking engine, een agenda die elke 90 seconden een reservering verwerkte, en een Laravel-herbouw zonder één gemiste boeking. -
.htaccess-headerblok: security cheatsheet voor de oplevering
Een kant-en-klaar .htaccess-blok met security headers, file locks en PHP-in-uploads-blokkades. Eén keer plakken, beter slapen, sleutels overdragen zonder knoop in je maag. -
Magento 2 cache warmer: een bash-playbook dat reboots overleeft
Het is vrijdag 21:14, je hebt net cache:flush gedraaid, en de volgende bezoeker wacht vier seconden. Dit is de bash-warmer die een NL-bureau nu op elke webshop draait. -
WordPress multisite-lek: een vergeten blogs.dir symlink
Een WordPress multisite serveerde de PDF's van klant B onder de URL's van klant A. De oorzaak: een symlink ouder dan het bureau. Dit is de trace. -
ChatGPT in een Joomla-admin uit 2015: de kleinste veilige vorm
Een klant wil een AI-schrijfassistent in zijn Joomla 3-admin. Dit is de kleinste veilige vorm die wij kennen, en de onderdelen die we weigeren te leveren. -
Apache vs Nginx headers: veldgids voor legacy hosting
De response headers van een verouderde site verraden welke webserver draait, wie de pagina cachet en wat er stilletjes tussen jou en de origin zit. Zo lees je ze. -
Pre-quote audit in vijf minuten: ls, curl en SQL counts
De vaste-prijs offerte die uitloopt tot drie weken migratie begint meestal met het overslaan van een audit van vijf minuten. Onze checklist voor legacy werk. -
Custom PHP CMS naar WordPress-shell: rebuild in vier weken
Een Nederlands bureau had vier weken om een PHP CMS uit 2009 naar WordPress te tillen zonder één van 14.000 URL's te verliezen. Zo deden ze het. -
SFTP-backups voor verouderde sites: roterende snapshots
Goedkope hosting blokkeert vaak mysqldump en SSH maar laat SFTP openstaan. Een rotatierecept voor snapshots dat je toch een schoon herstelpunt geeft. -
Joomla 3 500 bij opslaan: ontbrekende #__assets-rij in 40 min
Een Joomla 3-site gaf een 500 bij elke save. De oorzaak: één ontbrekende rij in #__assets. Hier is de trace, met de SQL erbij. -
WordPress-audit in SQL: acht snippets uit ons spiekbriefje
De wp_options-tabel is 480MB. wp-admin laadt in negen seconden. Je nam het project vorige dinsdag over. Dit zijn de acht queries die we als eerste draaien. -
Een Magento 2 di.xml lezen: de vier nodes die tellen
Een class in je Magento 2-shop gedraagt zich anders dan de vendor-broncode. Het antwoord zit in di.xml: vier nodes doen het echte werk, de rest is ruis. -
Van PHP 7.4 naar 8.2: een compatibility pass in zes stappen
Een echte migratie van PHP 7.4 naar 8.2: 60.000 regels, vier auteurs, geen testsuite. De zes-stappen-pass die deprecations en stille fouten vindt. -
Drupal 7 achter Cloudflare: admin en image styles intact
Een Drupal 7-site achter Cloudflare zetten en twee dingen breken meteen: editor login loopt vast, image styles geven 404. Een playbook die wel houdt. -
wp_options van 7GB splitsen: een autoload-veldgids
Je wp_options-tabel is 7GB en wordt bij elke request geladen. Hier de SQL om de autoload-rijen te vinden die stilletjes 800ms kosten. -
WooCommerce dubbele afschrijvingen: payment_complete hook
Een WooCommerce-shop schreef elke kaart twee keer af tussen 14:00 en 16:00. De boosdoener was niet Stripe, maar een payment_complete hook die vanuit twee plekken tegelijk afging. -
600 PHP-pagina's naar WordPress migreren zonder linkbreuk
Een Nederlands bureau verhuisde 612 URL's custom PHP naar WordPress in vijf weken. Geen dode links. De crawl, de rewrites, de MySQL-port en wat alsnog brak. -
Joomla-template ontkoppelen: een gefaseerd extractieplan
Een 12 jaar oude Joomla-template, vastgeklonken aan het CMS, moest eruit zonder de live site om te leggen. Dit is hoe we het bestand voor bestand uit elkaar trokken. -
PHP-FPM tunen: de zes settings achter de 40-user crash
Je traffic verdubbelt en de site wordt wit. PHP-FPM workers staan vast op vijf, de queue zit vol, Apache krijgt time-outs. Dit is de cheatsheet. -
Magento bestelmails stoppen: één rij in queue_message_status
Een Nederlands bureau belt om 23:41: hun Magento-shop verstuurde drie dagen geen bevestiging. Het spoor leidt naar één rij in queue_message_status. -
EXPLAIN lezen bij een WooCommerce-query: de veldgids
Een trage WooCommerce-productquery. Het EXPLAIN-plan benoemt het probleem in drie kolommen: type, rows en Extra. Lees ze precies in die volgorde. -
Drupal 7 EOL-triage: de audit-checklist van tien minuten
Je erft een Drupal 7-site om 23:41 op zondagavond. Maandag wil de klant een rebuild-offerte. Dit is wat je écht moet checken voor je reageert. -
Staging via alleen SFTP: het lftp-en-rewrite draaiboek
Een werkende staging-omgeving op een SFTP-only host: geen shell, geen git, geen Docker. Alleen lftp, een serialized-safe rewrite en een lock. -
chmod -R 777 herstel: rechten terugzetten op een legacy site
Een chmod -R 777 in paniek voelde om 23:41 als de snelste oplossing. Twaalf minuten later weigerde PHP-FPM elk script en gaf de loginpagina 500s. -
AI scopen op een WordPress uit 2014: nuchtere methode
Een klant vraagt om 'gewoon een kleine AI-functie' op een WordPress-site uit 2014. Dit is de scoping-methode die voorkomt dat je blind offreert op PHP 5.6. -
wp_postmeta opschonen: 4,2M rijen weg zonder ACF te slopen
Bij een Nederlands bureau passeerde wp_postmeta de 4,2 miljoen rijen en begon de WordPress-admin uit te vallen. Dit is de prune die ACF heel liet. -
Transactionele e-mail migreren zonder verzendadres te wijzigen
Je hostingmaatschappij zet over achttien dagen de gedeelde SMTP uit en het verzendadres op drie verouderde sites mag geen byte verschuiven. Het draaiboek. -
Custom PHP-framework of spaghetti: een test in vijf vragen
Je opent de repo, ziet een map lib en vindt een functions.php van 4.200 regels. Voordat je een rewrite offreert, loop je deze vijf vragen langs. -
wp_posts opschonen: 600 dode CPT-rijen veilig wissen
Een staging-kopie, een kerkhof van 600 CPT-rijen, en vier foreign key-valluiken die een snelle DELETE veranderen in een week kapotte admin-schermen. -
Magento-audit: 40-minuten checklist voor overgenomen shop
Een bureau van 22 man neemt een Magento 2.3-shop over. De vorige dev is onbereikbaar. Dit is de audit van 40 minuten die we draaien voor je iets aanraakt. -
Mod_security false positives: strakke whitelist zonder gaten
Woensdag 16:12: de WAF blokkeert de opslaan-knop van WordPress. De fix is niet SecRuleEngine Off, maar een strakke whitelist per regel, per route. -
phpMyAdmin in 2026: drie instellingen die het veilig houden
De helft van de senior engineers waar we mee werken wil phpMyAdmin weg in 2026. De andere helft gebruikt het wekelijks. De drie instellingen die de discussie beslechten. -
Checkout-JavaScript auditen: 15 minuten via de network-tab
Een pass van vijftien minuten in de network-tab voor third-party scripts die je verouderde checkout nog laadt maar niemand in het team kan plaatsen. -
SFTP-only deployment: een recept dat de developer overleeft
Een omkeerbare SFTP-deploy zo opgezet dat de volgende eigenaar van de credentials de hele release-flow vanaf alleen de server kan reconstrueren. -
Drupal 9 read-only om 16:08: een /tmp-inode-verhaal
Op een dinsdagmiddag werd een Drupal 9-site stilletjes read-only. De schijf zat op 39 procent. /tmp had bytes genoeg. Maar geen enkele inode was nog vrij. -
slow_query_log lezen op shared hosting: vier patronen
Vier MySQL slow_query_log-patronen die het grootste deel van de pijn op shared hosting verklaren. De EXPLAIN die je krijgt, de index die het oplost, en wat je kunt laten staan. -
Magento 1.9 naar Magento 2: zes weekenden live cutover
Een Nederlands bureau moest een Magento 1.9-winkel naar 2.4.7 verhuizen zonder de catalogus te bevriezen. Dit is het zes-weekenden-plan dat hield. -
Trage admin-ajax.php: 30 seconden terug naar één plugin
Een WooCommerce-backend hing dertig seconden bij elke pagina. De trage request was steeds admin-ajax.php. Zo traceerden we hem naar één Heartbeat-plugin. -
Joomla 2.5 component naar Joomla 5 plugin: geen rewrite
Een oud Joomla 2.5 component draait nog de catalogus van de klant. PHP 8.2 komt eraan. Zo til je het naar Joomla 5 als plugin zonder het schema aan te raken. -
Offerte voor legacy werk: een offertebrief in vier tiers
De offertebrief in vier tiers die we sturen voordat we aan een legacy site beginnen. Offreer de oppervlakte, omhein het moeras, en houd de klant eerlijk. -
Rogue cron vult /tmp: een lek van 12 GB aan PHP-sessions
Op een dinsdagnacht om 3:14 kwam de alert binnen. /tmp op een kleine VPS was over 12 GB aan losse PHP-sessions gegaan. Zo vonden we de cron erachter. -
phpinfo() lezen: een topografische kaart van je host
Zet een phpinfo.php in de docroot en de muur aan beige tabellen die je terugkrijgt is een topografische kaart van de host. Lees hem sectie voor sectie. -
Magento CSV-import zonder downtime: 9.000 rijen wisselen
Een Loom van 23:41, een leverancier-CSV met 9.043 rijen en een webshop die niet plat mocht. Hoe een Nederlands bureau de import draaide zonder een minuut downtime. -
Twee schermen, één blik: FTP en MySQL bij legacy sites
Op een verouderde PHP-site zit de bug bijna altijd op de naad tussen bestandssysteem en database. Hier lees je waarom je de twee nooit los koppelt. -
Elf .htaccess-directives die blijven, drie die eruit moeten
Een spiekbriefje voor het .htaccess-bestand dat je erfde op die verouderde WordPress- of Magento-site: elf regels die blijven, drie die kwaad doen. -
Latin1 naar utf8mb4 op oude Joomla: zonder mojibake migreren
Een Nederlands bureau erfde een Joomla-site uit 2011. Alles leek prima tot iemand op een accent zocht. Zo migreer je latin1 naar utf8mb4 zonder mojibake. -
MySQL collation-mismatches: een veldgids voor lege resultaten
Je zoekopdracht geeft niets terug. De rij staat er in phpMyAdmin. Welkom bij MySQL collation-mismatches, waar twee strings het oneens zijn over gelijk. -
14 PHP-includes per pagina: dependencies in kaart brengen
Veertien require-statements per pagina, een sidebar die er nog drie binnenhaalt en niemand weet meer waarom. Breng de graph in kaart voor je iets aanraakt. -
Drupal 7 pharma hack: een oude uploads-injectie traceren
De Google-snippet van de klant zei 'Buy Cialis 20mg' maar de pagina zelf zag er schoon uit. De Drupal 7 pharma hack traceren ging via htaccess cloaking. -
Twee SFTP-trees diffen: vind het bestand dat veranderde
Zaterdagochtend, 09:14. De klant zweert dat er niets veranderd is sinds vrijdag. Drie shell-commands die het bestand vinden dat het wél deed. -
wp-login.php brute force: het .htaccess-blok dat werkt
De bots beuken al drie dagen om de twee seconden op wp-login.php. Dit is het .htaccess-blok dat ze tegenhoudt zonder het dashboard om zeep te helpen. -
AI-SQL: wanneer mag je de voorgestelde JOIN vertrouwen?
Een AI schrijft in twee seconden een JOIN over zes tabellen. De helft daarvan klopt. Zo zie je welke helft klopt, voordat je 'run' drukt op productie. -
9GB site herstellen: kapotte dump en drie FTP-shards
Een middag besteed aan het samenrapen van een 9GB WordPress-site uit één afgekapte mysqldump en drie half kapotte FTP-backups. Dit is het herstelverslag. -
Onderhoud van legacy sites: de val van de kleine fix
De derde 'even een kleine fix' op een WordPress uit 2017 is waar freelancers failliet gaan. Een retainer die risico beprijst, geen toetsaanslagen. -
Database als source of truth: refactor de data, niet de code
Je erft een 14 jaar oude WordPress-site. Je pullt de repo, grept naar het kapotte gedrag, vindt niets. De logica zit in een rij in wp_options. -
Valse plugin-updates in wp-content: zeven audit-signalen
Praktische audit voor valse plugin-updates en supply-chain malware in wp-content. Zeven signalen, met grep en SQL die je direct kunt draaien. -
Magento 2 indexer vastgelopen: herstel zonder orderverlies
Een vastgelopen Magento 2 indexer geeft foute prijzen, ontbrekende producten en spookvoorraad. Dit is de herstelvolgorde die lopende orders beschermt. -
PHP error logs lezen als bloedonderzoek: een triage-gids
Vrijdag 16:47, bericht binnen: de site geeft soms 500s. Je SSH't in, tailt het log, ziet achthonderd regels rood. Zo triage je ze op volgorde. -
40GB wp_options autoload: één nacht terug naar 800ms TTFB
Een Loom om 23:41, homepage-TTFB boven acht seconden, en een wp_options-tabel die stil naar 40GB was gegroeid. Drie SQL-statements, één lange nacht. -
Gecrashte MyISAM-tabel herstellen: een incidentverslag
Een WooCommerce wp_options-tabel crashte op shared hosting om 23:41. Negentig minuten, geen SSH, alleen phpMyAdmin en FTP. Het incident in volgorde. -
WooCommerce checkout audit: de plugin van 2,3 seconden
Loom van een Nederlands bureau: WooCommerce checkout hangt drie seconden op elke postcodewijziging. De audit van twintig minuten die de plugin vindt. -
Klantwerk zelf hosten: waarom een studio de dock bezit
Een studio van drie man draait elf verouderde sites. Het pleidooi om de tooling zelf te hosten in plaats van te huren wordt elk kwartaal sterker. -
Een geërfde .htaccess lezen: blok voor blok zonder paniek
Een site geërfd waarvan de .htaccess begint met drie blokken dode RewriteRules in het Nederlands? Lees hem blok voor blok. Zo pakken wij dat aan. -
PHP 5.6 naar 8.2 in één weekend: de realistische versie
De Loom kwam binnen om 23:41 op vrijdagavond. 48 uur om een 14 jaar oude PHP-codebase van 5.6 naar 8.2 te krijgen. Dit is de volgorde waarin het brak. -
jQuery uitfaseren uit een legacy theme: een draaiboek
Oude themes laden jQuery vaak voor twee regels code: een hamburgermenu en een smooth scroll. Zo haal je het weg zonder zaterdag aan rollbacks te besteden. -
AI-suggesties: controleer in vier stappen voor je ze toepast
De chat geeft je een SQL-diff van één regel die je niet zelf schreef en maar half herkent. Voor je hem op een live site toepast: vier stappen. -
Custom PHP-intranet van Windows 2008 af in één weekend
Een ongedocumenteerd custom PHP-intranet, een Windows 2008-machine die maandag uit het rack gaat, en één weekend. De inventaris, de breuken, de cutover. -
Joomla 3 naar Joomla 5: overrides die de sprong overleven
Zestig procent van je Joomla 3 overrides is te redden. De andere veertig procent sloopt je site geruisloos. Dit is de volgorde die wij draaien. -
CMS herkennen via het filesystem: een korte veldgids
Je krijgt een FTP-login, geen documentatie, en 20 minuten voor het klantgesprek. Vijf plekken die een CMS benoemen voor je één PHP-bestand opent. -
Cron jobs via FTP: een overgenomen server doorlichten
Je erft een site met een FTP-login en een database-dump. Ergens draaien er taken op schema. Vind ze, voor er één om 03:00 op zondag stuk gaat. -
Manifestbestand voor legacy sites: audit in 20 minuten
Je erft vrijdagmiddag om 16:00 een 9 jaar oude WordPress-site. Om 16:20 hoort er een manifest te liggen dat de volgende persoon vertelt wat er draait. -
Dode WordPress-site reanimeren: een 90-minuten playbook
Een Nederlandse bureau-eigenaar stuurde een Loom om 23:41: wit scherm, geen logs, geen SSH. Negentig minuten later draaide de checkout weer. De volgorde. -
Drupal sessietokens lekken: drie patronen, drie fixes
Een admin die zonder reden uitgelogd raakt komt zelden door een rare cookie. Op oude Drupal-sites is het meestal een sessietoken uit een referrer-log of een cache. -
phpMyAdmin alternatieven in 2026: native versus browser
phpMyAdmin zit nog in elk cPanel. Dat maakt het geen goede plek voor een UPDATE op 180.000 wp_postmeta-rijen om vijf over elf op vrijdagavond. -
Gehackte WordPress herkennen: de 5-minuten audit
Je hebt FTP, het databasewachtwoord en misschien vijf minuten voordat de klant wakker wordt. Dit is de audit die je tot een oordeel brengt, ongeveer in deze volgorde. -
WordPress zonder dashboard: waarom bureaus in FTP wonen
Waarom ervaren WordPress-bureaus wp-admin overslaan en hun werkdag draaien vanuit een file tree, een SQL-prompt en een tail op het error log. -
Ruwe .sql-dumps lezen zonder import: een CLI-playbook
Een back-up van 3 GB belandt in Slack en de klant wil weten of één rij erin staat. De CLI-workflow voor ruwe .sql-dumps zonder import op schijf. -
Backups die geen backup zijn: audit in zeven punten
Een agency-lead stuurde om 23:41 een Loom: het restore-bestand was 11 MB, de database 4,7 GB. Zo gebeurt het, en zo voorkom je dat het jou overkomt. -
Inline CSS en embedded fonts: oude gewoontes die werken
Elf jaar later doet in een WordPress-theme uit 2014 nog precies dat nuttig werk wat we ooit bespotten: inline CSS, self-hosted fonts, kale JavaScript. -
Shared cPanel klanten: de vier soorten en wat ze nodig hebben
Vrijwel elk bureau heeft nog een staart aan shared cPanel klanten. Er leven er vier soorten op, en weten welke voor je zit scheelt een uur per gesprek. -
Legacy PHP-site snapshotten in één middag: een playbook
Je krijgt SFTP-credentials, een vage Slack-thread en een site waar niemand vier jaar aan heeft gezeten. Zo weet je voor vijf uur waar je naar kijkt. -
Composer op legacy PHP: eerst inventariseren, dan init
Je hebt een WordPress-installatie geërfd met drie plugins, drie versies van Guzzle en geen composer.json. Composer init is de verkeerde eerste stap. -
Magento 1 in 2026: live bewerken zonder cache te slopen
Een Nederlands bureau, een vastgelopen Magento 1-shop, vrijdag 23:41, en de catalog_product_flat-tabellen die bijna de storefront sloopten. -
Web root: zeven bestanden die je nooit publiek serveert
Een WordPress-site die sinds 2014 draait, vertelt alles over zichzelf als je weet welke zeven bestanden je moet opvragen. Geen ervan hoort er te staan. -
AI-codereview op legacy PHP: vangsten en blinde vlekken
Een eerlijke kijk op wat AI-codereview echt verandert bij het refactoren van 14 jaar oude PHP: de bugs die je in seconden vindt en de keuzes die het mist. -
Front-controller routing: waarom /contact niet contact.php is
Bezoek /contact op een verouderde WordPress- of Drupal-site en contact.php is bijna nooit wat draait. Zo verwerken Apache, mod_rewrite en PHP de URL. -
Drupal 7 end-of-life: checklist voor klanten die blijven
Drupal 7 ging in januari 2025 end-of-life. De sites die er medio 2026 nog op draaien doen dat niet per ongeluk, maar uit pure verwaarlozing. -
WordPress MySQL queries: spiekbriefje voor legacy beheer
De handvol SQL-queries die een verouderde WordPress-site redden op dinsdagavond: URL-paar, autoload-audit, revisies opschonen, wachtwoord, transients. -
FTP leeft nog: wanneer SFTP overkill is en FTPS volstaat
SFTP is de juiste default als je de server zelf beheert. Op shared hosting zonder poort 22 sluit FTPS met expliciete TLS aan op wat er al draait. -
wp-config.php in productie: een veilige edit-procedure
wp-config.php is één regel van een wit scherm verwijderd. Zo bewerk je het op een live WordPress-site zonder ooit een request te laten vallen. -
Joomla-migratie zonder SEO-verlies: een case na 12 jaar
Een Joomla 2.5-site van 12 jaar oud, drie lagen SEF-plugins diep, naar PHP 8.2-hosting. Zo overleefden de redirects, de database en de rankings. -
Legacy PHP herbesmetting: de .htaccess-muur die houdt
De WordPress van een klant werd om de paar dagen opnieuw besmet. Bestanden opschonen hielp niet. Dit is het .htaccess-patroon dat het stopte. -
Legacy WordPress .htaccess: de regels die 80% oplossen
De .htaccess-regels die stilletjes de meeste redirect loops, mixed content en kapotte pretty permalinks op overgenomen WordPress-sites oplossen.