— —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 —
54
-
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.