Categorie:AlleAISEOMarketingDesignCodeWordpressWoocommerceHTML/CSS

WordPress 7.1 kan websites met WP Rocket laten crashen: zo los je het op

Heb je WordPress bijgewerkt naar WordPress 7.1 en krijg je ineens een wit scherm of de melding “Er heeft zich een kritieke fout voorgedaan op deze website”? Dan kan WP Rocket de boosdoener zijn.

Na de release van WordPress 7.1 blijkt er een compatibiliteitsprobleem te zijn met WP Rocket. Het vervelende is dat de fout niet alleen de voorkant van de website platlegt. Ook wp-admin, de REST API, admin-ajax en zelfs WP-CLI kunnen hierdoor niet meer werken.

Gelukkig is de website vrij eenvoudig weer online te krijgen.

Welke foutmelding krijg je?

In de PHP error log van de server verschijnt onder andere de volgende fout:

PHP Fatal error: Uncaught TypeError:
substr(): Argument #1 ($string) must be of type string, int given

Daarbij wordt verwezen naar:

wp-content/plugins/wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.php

en specifiek naar regel 562.

Zie je deze combinatie na een update naar WordPress 7.1? Dan is de kans groot dat je tegen deze bug in WP Rocket aanloopt.

Oplossing 1: tijdelijke fix via een MU-plugin

Er is een tijdelijke fix beschikbaar waarmee je WP Rocket actief kunt houden. De oplossing wordt als een klein PHP-bestand in de map mu-plugins geplaatst.

Een MU-plugin (Must Use Plugin) wordt automatisch door WordPress geladen. Je hoeft deze dus niet via wp-admin te activeren.

Stap 1: download het fix-bestand: wp-rocket-cloudflare-intkey-fix.php

Download het bestand

Het bestand kan in je browser als platte tekst worden geopend. Klik in dat geval met de rechtermuisknop op de pagina en kies ‘Opslaan als’.

Sla het bestand exact op als:

wp-rocket-cloudflare-intkey-fix.php

Laat het bestand als één .php-bestand staan. Je hoeft het dus niet in een ZIP-bestand te plaatsen.

Stap 2: maak verbinding met je website

Maak via SFTP verbinding met je website of gebruik de File Manager van je hostingprovider.

Ga vervolgens naar:

/wp-content/

Stap 3: controleer de map mu-plugins

Controleer of binnen wp-content een map met de volgende naam bestaat:

mu-plugins

Bestaat deze map nog niet? Maak hem dan zelf aan.

Let erop dat de map exact deze naam krijgt:

/wp-content/mu-plugins/

Stap 4: upload het fix-bestand

Upload:

wp-rocket-cloudflare-intkey-fix.php

rechtstreeks naar:

/wp-content/mu-plugins/

Het uiteindelijke pad moet dus zijn:

/wp-content/mu-plugins/wp-rocket-cloudflare-intkey-fix.php

Plaats het bestand niet in een extra submap.

Stap 5: herlaad je website

Herlaad nu de website.

Als de fout inderdaad wordt veroorzaakt door deze WP Rocket/WordPress 7.1 incompatibiliteit, zou de kritieke fout direct verdwenen moeten zijn.

Het voordeel van deze methode is dat je WP Rocket niet volledig hoeft uit te schakelen.

Belangrijk: zie dit als een tijdelijke workaround. Zodra WP Rocket een officiële update heeft uitgebracht waarin het probleem is opgelost, is het verstandig de plugin te updaten en te controleren of deze MU-plugin nog nodig is.

Oplossing 2: WP Rocket volledig uitschakelen

Wil je geen tijdelijke PHP-fix gebruiken? Dan kun je WP Rocket ook volledig uitschakelen.

Dat klinkt simpel, maar er is een probleem: doordat de fout tijdens het opstarten van WordPress optreedt, kun je meestal ook niet meer inloggen op /wp-admin/.

Je zult WP Rocket daarom buiten WordPress om moeten uitschakelen.

Via FTP of SFTP

Maak via FTP/SFTP verbinding met de server en ga naar:

/wp-content/plugins/

Zoek vervolgens de map:

wp-rocket

en hernoem deze bijvoorbeeld naar:

wp-rocket-disabled

WordPress kan de plugin vervolgens niet meer laden en zal WP Rocket automatisch als gedeactiveerd beschouwen.

Herlaad daarna de website. In de meeste gevallen werkt de site direct weer.

Via WP-CLI

Heb je SSH-toegang tot de server? Dan kun je WP Rocket ook via WP-CLI uitschakelen.

Een normale:

wp plugin deactivate wp-rocket

kan echter óók crashen, omdat WP-CLI WordPress en de actieve plugins probeert te laden.

Gebruik daarom:

wp plugin deactivate wp-rocket --skip-plugins=wp-rocket

Hiermee vertel je WP-CLI dat WP Rocket tijdens het uitvoeren van het commando niet geladen moet worden.

Verwijder niet zomaar Cloudflare.php

Omdat de foutmelding naar Cloudflare.php verwijst, kan het verleidelijk zijn om dit bestand uit WP Rocket te verwijderen of aan te passen.

Doe dit liever niet.

Het bestand maakt onderdeel uit van WP Rocket en simpelweg verwijderen kan weer andere fatale fouten veroorzaken.

Gebruik liever de tijdelijke MU-plugin hierboven of schakel WP Rocket volledig uit.

Maar ik gebruik helemaal geen Cloudflare?

Opvallend genoeg hoef je Cloudflare niet daadwerkelijk te gebruiken om tegen deze fout aan te lopen.

De betreffende Cloudflare-compatibiliteitscode van WP Rocket kan namelijk worden uitgevoerd zonder dat je zelf Cloudflare hebt gekoppeld.

Een verwijzing naar Cloudflare.php in de foutmelding betekent dus niet automatisch dat het probleem bij Cloudflare ligt.

Wat veroorzaakt de fout?

De oorzaak zit in een wijziging in WordPress 7.1 in de manier waarop WordPress unieke ID’s voor callbacks van hooks opbouwt.

Tot en met WordPress 7.0.x werd hiervoor bij objecten onder andere spl_object_hash() gebruikt. Dat leverde een lange tekenreeks op.

WordPress 7.1 gebruikt hiervoor spl_object_id(). Dit resulteert in een numerieke waarde.

Hoewel WordPress de waarde als string teruggeeft, kan PHP een numerieke string die als array-key wordt gebruikt automatisch omzetten naar een integer.

WP Rocket gaat er in de betreffende Cloudflare-code echter vanuit dat deze keys altijd strings zijn.

Vervolgens wordt ongeveer het volgende uitgevoerd:

substr( $key, - strlen( $method ) )

Wanneer $key inmiddels een integer is, gaat dat mis.

Omdat het betreffende WP Rocket-bestand met strict typing werkt, weigert PHP de integer automatisch naar een string om te zetten.

Het resultaat:

TypeError: substr(): Argument #1 ($string) must be of type string, int given

Omdat dit al tijdens het initialiseren van WordPress gebeurt, kan vervolgens praktisch de hele WordPress-installatie eruit liggen.

Wanneer treedt het probleem op?

Niet iedere WordPress 7.1-website met WP Rocket hoeft automatisch te crashen.

De combinatie ontstaat wanneer onder andere:

  • WordPress 7.1 wordt gebruikt;
  • WP Rocket actief is;
  • een plugin of theme een bepaalde closure aan een WordPress-hook koppelt;
  • WP Rocket deze callback vervolgens probeert te verwerken.

Een plugin die de situatie kan triggeren is bijvoorbeeld Elementor Pro.

Dat betekent overigens niet dat Elementor Pro iets verkeerd doet. Het gebruik van closures binnen WordPress-hooks is normaal. Het probleem zit in de aanname die WP Rocket maakt over het datatype van de callback-ID.

Nog niet bijgewerkt naar WordPress 7.1?

Gebruik je WP Rocket en draait je website nog op WordPress 7.0.x?

Dan kan het verstandig zijn om nog even te wachten met de update naar WordPress 7.1 totdat WP Rocket een versie heeft uitgebracht waarin het probleem officieel is opgelost.

Controleer daarbij ook of automatische WordPress core-updates ingeschakeld zijn.

Kan ik WordPress terugzetten naar 7.0.4?

Ja. Het terugzetten van een backup of downgraden naar WordPress 7.0.4 kan het probleem eveneens oplossen.

In de meeste gevallen is dat echter niet nodig.

Gebruik eerst de tijdelijke MU-plugin of schakel WP Rocket uit. Dat heeft doorgaans minder impact dan het downgraden van de volledige WordPress-installatie.

Conclusie

Krijg je na de update naar WordPress 7.1 een fatale PHP-fout met:

substr(): Argument #1 ($string) must be of type string, int given

en verwijst de stacktrace naar:

wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.php

dan is WP Rocket waarschijnlijk de oorzaak.

De voorkeursoplossing is om de tijdelijke wp-rocket-cloudflare-intkey-fix.php als MU-plugin te plaatsen:

/wp-content/mu-plugins/wp-rocket-cloudflare-intkey-fix.php

Hierdoor kun je WP Rocket actief houden terwijl de fout wordt omzeild.

Lukt dat niet, dan kun je WP Rocket tijdelijk volledig uitschakelen via SFTP of WP-CLI.

Zodra WP Rocket met een officiële oplossing komt, update je WP Rocket en kun je de tijdelijke fix na controle weer verwijderen.

Tip: maak voordat je grote WordPress-, plugin- of PHP-updates uitvoert altijd eerst een backup en test belangrijke updates indien mogelijk op een stagingomgeving. Dat voorkomt dat een onverwachte incompatibiliteit direct je live website platlegt.

Hoeveel plugins zijn te veel? Zo houd je je WordPress-site slank en snel

Zwitsers zakmes met alle gereedschappen uitgeklapt

Het is de vraag die elke WordPress-beheerder zich weleens stelt bij het scrollen door de pluginlijst: is dit te veel? Er circuleren allerlei vuistregels — maximaal tien, maximaal twintig — maar die missen het punt. Er draaien uitstekende sites met veertig plugins en trage, lekke sites met acht. Niet het aantál is het probleem, maar wat elke plugin doet, hoe goed hij onderhouden wordt en of hij er überhaupt nog toe doet. Toch is de onderliggende zorg terecht: op de meeste sites die een paar jaar meegaan, groeit de pluginlijst stilletjes dicht. Tijd voor een sanering — met beleid.

Wat plugins je werkelijk kosten

Elke actieve plugin draait code mee — sommige bij elke paginaweergave, ook als je de functie zelden gebruikt. De kosten komen in drie vormen. Snelheid: vooral plugins die op elke pagina eigen CSS- en JavaScript-bestanden inladen (sliders, formulieren, social-knoppen) stapelen op tot een merkbaar tragere site. Veiligheid: elke plugin is een extra deur; verouderde en verlaten plugins zijn de nummer één-oorzaak van gehackte WordPress-sites. Onderhoudslast: meer plugins betekent meer updates, meer kans op conflicten na een update, en meer uitzoekwerk als er iets stuk gaat. Eén zware, slecht gebouwde plugin kost overigens meer dan tien lichte — dáárom is tellen zinloos en wegen zinvol.

De grote schoonmaak: zo pak je het aan

  • Loop de lijst langs met één vraag per plugin: wat doet deze, en gebruiken we dat nog? Op vrijwel elke site vallen er meteen een paar af — de opgezegde dienst, het overbodige experiment, de slider van het vorige ontwerp.
  • Zoek overlap. Twee SEO-plugins, drie cache-oplossingen, een pagebuilder én blokken-plugins: kies er één per taak en saneer de rest.
  • Check onderhoud en reputatie: wanneer was de laatste update, is de plugin getest met je WordPress-versie, hoeveel actieve installaties? Een plugin die twee jaar niets ontving, is een risico, ook al werkt hij nog.
  • Vervang zwaargewichten door lichtgewichten waar het kan; voor veel taken bestaat een moderne, snellere variant — en een simpele functie (zoals een stukje tracking-code plaatsen) kan vaak zelfs zonder plugin, met een paar regels code.
  • Verwijder in plaats van deactiveren. Een gedeactiveerde plugin draait niet mee, maar zijn bestanden staan nog op de server en blijven een aanvalsoppervlak. Weg is weg.

Werk bij het opruimen zoals bij updates: back-up vooraf, één plugin tegelijk verwijderen, site nalopen. Sommige plugins laten instellingen of databasetabellen achter — de betere hebben een optie om bij verwijdering echt alles op te ruimen.

Beleid voor daarna: de poortwachter

Een sanering zonder aannamebeleid is dweilen met de kraan open. Spreek met jezelf (en collega’s met beheerdersrechten) drie regels af. Eén: voor elke nieuwe plugin eerst checken of een bestaande plugin of het thema het al kan. Twee: nieuwe plugins beoordelen op onderhoud, reviews en aantal installaties — en bij twijfel eerst op een staging-omgeving testen, waar je ook meteen het effect op de laadtijd meet. Drie: elk half jaar een kwartier de lijst doorlopen. Zo blijft de lijst een gereedschapskist in plaats van een rommelzolder.

Conclusie

Er bestaat geen magisch maximumaantal plugins — wel een simpele norm: elke plugin moet zijn plek verdienen met een taak die je echt gebruikt, degelijk onderhoud en een aanvaardbaar gewicht. Saneer eens goed, verwijder wat uit staat, kies één oplossing per taak en wees streng aan de poort. Een slanke pluginlijst is sneller, veiliger en — niet onbelangrijk — een stuk rustiger om te beheren.

WordPress multisite: meerdere websites beheren vanuit één installatie

Modern appartementencomplex met balkons aan het water

Wie meerdere WordPress-sites beheert, kent de vermenigvuldiging: vijf sites betekent vijf keer updates draaien, vijf keer plugins beheren, vijf keer inloggen. WordPress heeft daar een ingebouwd maar relatief onbekend antwoord op: multisite. Daarmee draait één WordPress-installatie een heel netwerk van websites — van twee tot duizenden — met één beheerder aan de knoppen. Grote uitgevers en universiteiten draaien er complete portfolio’s mee. Maar multisite is geen gratis efficiëntie: je koopt gemak en betaalt met gedeeld lot. Daarom is de wanneer-vraag belangrijker dan de hoe-vraag.

Wat multisite precies is

Multisite is een netwerkstand van gewone WordPress: één set bestanden, één database, één keer plugins en thema’s geïnstalleerd — en daarbinnen onbeperkt sites, elk met een eigen adres (subdomein zoals blog.bedrijf.nl, submap zoals bedrijf.nl/blog, of via domain mapping een volledig eigen domeinnaam). Elke site heeft eigen content, eigen menu’s en eigen gebruikers, maar de “netwerkbeheerder” (super admin) staat boven alles: die installeert plugins en thema’s, maakt sites aan en bepaalt wat sitebeheerders wél en niet mogen. Eén klik op updaten werkt het hele netwerk bij. Voor wie tien sites onderhoudt, is dat het verschil tussen een dag werk en een kwartier.

Wanneer multisite een goed idee is

  • Meerdere vestigingen of merken van één organisatie die dezelfde huisstijl en techniek delen, maar eigen content voeren.
  • Landen- of taalvarianten als aparte sites binnen één netwerk (nl.bedrijf.com, de.bedrijf.com) met gedeelde basis.
  • Organisaties met veel deelsites: scholen(gemeenschappen), gemeenten, franchiseformules, verenigingen met afdelingen.
  • Een eigen platform waarbij je klanten of leden elk een eigen (sub)site geeft op jouw voorwaarden.

De rode draad: de sites horen wezenlijk bij elkaar, delen techniek en vormgeving, en vallen onder één verantwoordelijke partij.

Wanneer je er juist vanaf moet blijven

Voor een webbureau dat sites van verschíllende klanten host, klinkt multisite verleidelijk — en is het meestal een valkuil. Alles deelt namelijk één lot: één database, één set plugins, één beveiligingsperimeter. Gaat het netwerk plat, dan zijn álle klanten offline; wordt één site gehackt, dan is niets in het netwerk meer te vertrouwen. Een klant “los verkopen” of verhuizen is bovendien lastig — een site uit een multisite ontvlechten is specialistenwerk. Ook niet doen: multisite inzetten omdat één site een blog én een shop heeft (dat kan gewoon in één site), of voor twee totaal verschillende projecten die toevallig van jou zijn. En let op plugins: niet elke plugin is multisite-bewust; vooral webshop-, back-up- en beveiligingsplugins verdienen controle vooraf. WooCommerce in multisite kán, maar elke shop is dan echt een aparte shop — geen gedeelde voorraad of winkelwagen.

Praktische aandachtspunten vóór je begint

Multisite zet je bij voorkeur vanaf het begin op; een bestaande drukke site ombouwen kan, maar is een migratieklus. Kies de structuur (subdomeinen of submappen) bewust — achteraf wisselen is pijnlijk. Reken op iets zwaardere hosting-eisen: alle sites delen dezelfde serverbronnen, dus één drukke site kan de rest vertragen. En regel back-ups op netwerkniveau én per site: je wilt één site kunnen terugzetten zonder het hele netwerk terug te draaien.

Conclusie

Multisite maakt van sitebeheer-in-veelvoud één overzichtelijk netwerk: één keer updaten, centraal beheer, en toch eigen content per site. Het is de juiste keuze voor sites die echt bij elkaar horen — vestigingen, merken, afdelingen — en de verkeerde voor losse klantensites of ongerelateerde projecten. Kies bewust vooraf, want de structuurkeuze van dag één draag je jaren mee.

Wat is een child theme? En waarom je nooit rechtstreeks in je thema aanpast

Drie matroesjka-poppen van groot naar klein op een rij

Het is een klassieker onder de WordPress-ongelukken. Je (of je neefje, of een vorige bouwer) past wat aan in de bestanden van het thema — een kleurtje in de stylesheet, een stukje PHP in de footer. Alles werkt naar wens, maandenlang. Dan verschijnt er een thema-update, je klikt op bijwerken, en álle aanpassingen zijn weg. Geen bug, geen hack: zo horen updates te werken. Een update vervangt simpelweg de themabestanden — inclusief die van jou. Precies voor dit probleem bestaat het child theme.

Hoe een child theme werkt

Een child theme is een minithema dat bovenop je eigenlijke thema (het “parent”) draait. Het bevat alleen jouw afwijkingen; voor al het overige valt WordPress automatisch terug op het parent-thema. Vraagt WordPress een bestand op, dan kijkt het eerst in het child theme — staat daar een eigen versie, dan wint die. Het resultaat: het parent-thema kan gewoon updates blijven ontvangen (belangrijk, want ook thema’s krijgen beveiligingsfixes), terwijl jouw aanpassingen veilig in hun eigen mapje staan en elke update overleven. Je krijgt dus het beste van twee werelden: een up-to-date thema én blijvend maatwerk.

Wanneer heb je een child theme nodig — en wanneer niet?

Niet elke aanpassing rechtvaardigt er een. Kleuren, lettertypen en veel indelingsopties regel je gewoon in de Customizer of de instellingen van je thema — die staan in de database en overleven updates vanzelf. Ook een kort stukje extra CSS kan prima in het veld “Aanvullende CSS”. Een child theme wordt nodig zodra je aan bestánden wilt zitten: templates aanpassen (bijvoorbeeld de opbouw van een productpagina of blogbericht), eigen PHP-functies toevoegen aan functions.php, of structureel meer CSS kwijt wilt dan een los veldje netjes aankan. Vuistregel: instellingen in het thema zelf → geen child theme nodig; wijzigingen aan themabestanden → altijd een child theme.

Zo ziet een child theme eruit

  • Een eigen map in wp-content/themes, naast het parent-thema.
  • Een style.css met bovenin een commentaarblok dat het parent-thema aanwijst (de regel “Template: themanaam”) — dit is wat het een child theme máákt.
  • Een functions.php die de stylesheet van het parent-thema netjes blijft laden en waar jouw eigen functies bij kunnen. Anders dan andere bestanden vervángt deze het origineel niet: beide functions.php-bestanden draaien, die van het child eerst.
  • Alleen de templatebestanden die je echt wijzigt — gekopieerd uit het parent-thema en dan aangepast. De rest laat je weg.

Activeer daarna het child theme onder Weergave → Thema’s. Controleer wel even je Customizer-instellingen en menu’s: die hangen aan het actieve thema en moeten na de overstap soms opnieuw gekoppeld worden. Zet je een child theme op een bestaande, drukbezochte site in, test de overstap dan eerst op een staging-omgeving.

De grens van het child theme

Een eerlijke kanttekening: een child theme beschermt tegen updates, maar niet tegen wildgroei. Wie in de loop der jaren tientallen overschreven templates verzamelt, merkt dat grote parent-updates alsnog handwerk vragen — jouw kopieën ontvangen de vernieuwingen immers niet. Aanpassingen die niet aan de vormgeving maar aan functionaliteit raken (een koppeling, een eigen formulierverwerking), horen bovendien niet in je thema thuis maar in een kleine eigen plugin: dan blijven ze ook werken als je ooit van thema wisselt. En groeit de stapel maatwerk echt, dan is een volledig eigen thema vaak schoner dan een child theme vol uitzonderingen.

Conclusie

Pas nooit rechtstreeks bestanden van je thema aan — de eerstvolgende update wist je werk. Zet voor bestandswijzigingen een child theme op: een lichte laag met alleen jouw afwijkingen, terwijl het parent-thema veilig kan blijven updaten. Houd het slank, stop functionaliteit in een eigen plugin, en je site blijft jaren aanpasbaar én up-to-date tegelijk.