Eroare 500 WP Rocket / CLSOP dupa WordPress 7.1 – fix pentru substr(): Argument #1 ($string) must be of type string, int given
Dupa actualizarea la WordPress 7.1, unele site-uri WordPress care folosesc WP Rocket sau CLSOP, pluginul distribuit prin CloudLinux AccelerateWP, pot afisa eroarea HTTP 500.
Problema poate aparea atunci cand pluginul incearca sa proceseze un callback cu un ID numeric pe anumite hook-uri WordPress, iar codul pluginului transmite o valoare de tip int catre functia PHP substr(), care asteapta un string.
Problema este documentata in issue-ul oficial WP Rocket:
https://github.com/wp-media/wp-rocket/issues/8596
Cum arata eroarea
In error_log poate aparea un mesaj similar cu:
PHP Fatal error: Uncaught TypeError: substr(): Argument #1 ($string) must be of type string, int given
Eroarea poate indica fisierul:
wp-content/plugins/wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.phpsau, in cazul pluginului CLSOP:
wp-content/plugins/clsop/inc/ThirdParty/Plugins/CDN/Cloudflare.phpMetoda implicata este unregister_callback, iar hook-ul poate fi deleted_post sau transition_post_status.
De ce apare problema?
In anumite situatii, WP Rocket incearca sa determine o metoda folosind o cheie care poate fi de tip numeric.
Codul problematic era:
substr( $key, - strlen( $method ) )Pe PHP 8+, daca $key este un integer, PHP poate genera:
TypeError: substr(): Argument #1 ($string) must be of type string, int givenFixul este conversia explicita a valorii la string inainte de apelarea substr():
substr( (string) $key, -strlen( $method ) )Practic, modificarea este foarte mica, dar previne eroarea de tip TypeError.
Cum se aplica fixul
WP Rocket
Daca problema este prezenta in WP Rocket, identificati fisierul:
wp-content/plugins/wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.phpCautati:
substr( $key, - strlen( $method ) )si modificati in:
substr( (string) $key, -strlen( $method ) )Salvati fisierul si verificati din nou site-ul.
CLSOP / AccelerateWP
Problema poate aparea si in CLSOP, pluginul distribuit prin CloudLinux AccelerateWP, deoarece acesta este bazat pe un fork al WP Rocket.
In acest caz, fisierul poate fi:
wp-content/plugins/clsop/inc/ThirdParty/Plugins/CDN/Cloudflare.phpCautati:
substr( $key, - strlen( $method ) )si modificati in:
substr( (string) $key, -strlen( $method ) )Important: modificarea este temporara
Nu recomandam modificarea manuala a fisierelor pluginului ca solutie permanenta.
Un update ulterior al WP Rocket sau CLSOP poate suprascrie modificarea.
Dupa ce dezvoltatorii publica o versiune oficiala care contine acest fix, recomandarea este sa actualizati pluginul si sa eliminati modificarile manuale.
De asemenea, inainte de orice modificare directa a fisierelor pluginului, este recomandat sa aveti un backup functional al site-ului.
Daca site-ul afiseaza deja eroare 500
Daca nu mai puteti accesa WordPress deoarece pluginul genereaza eroarea fatala, puteti dezactiva temporar pluginul prin redenumirea directorului acestuia.
Pentru WP Rocket:
wp-content/plugins/wp-rocket/poate fi redenumit, de exemplu:
wp-content/plugins/wp-rocket.disabled/Pentru CLSOP:
wp-content/plugins/clsop/poate fi redenumit:
wp-content/plugins/clsop.disabled/Dupa dezactivarea pluginului, verificati daca site-ul revine online.
Daca aveti acces SSH si folositi WP-CLI, puteti dezactiva pluginul cu:
wp plugin deactivate wp-rocketsau, pentru CLSOP:
wp plugin deactivate clsopAtentie: daca WP-CLI returneaza acelasi Fatal error, dezactivarea prin WP-CLI poate sa nu fie posibila. In acest caz, redenumirea temporara a directorului pluginului este o alternativa.
Este o problema cauzata de WordPress 7.1?
Nu neaparat.
Problema este documentata oficial in WP Rocket si este legata de modul in care pluginul proceseaza anumite callback-uri. WordPress 7.1 poate face ca problema sa fie observata in anumite configuratii, dar eroarea nu trebuie interpretata automat ca un bug al WordPress Core.
De aceea, daca vedeti in error_log:
substr(): Argument #1 ($string) must be of type string, int givenimpreuna cu:
ThirdParty/Plugins/CDN/Cloudflare.phpverificati in primul rand versiunea si implementarea pluginului WP Rocket/CLSOP.
Rezumat
Daca site-ul dvs. returneaza HTTP 500 si in error_log apare:
substr(): Argument #1 ($string) must be of type string, int giveniar eroarea indica:
wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.phpsau:
clsop/inc/ThirdParty/Plugins/CDN/Cloudflare.phpverificati codul:
substr( $key, - strlen( $method ) )si, ca workaround temporar, folositi:
substr( (string) $key, -strlen( $method ) )Pentru informatii suplimentare si statusul rezolvarii oficiale, puteti consulta issue-ul WP Rocket:
https://github.com/wp-media/wp-rocket/issues/8596
Recomandarea noastra: folositi modificarea manuala doar ca workaround si actualizati WP Rocket/CLSOP la versiunea oficiala care include remedierea imediat ce aceasta devine disponibila.