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.php

sau, in cazul pluginului CLSOP:

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

Metoda 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 given

Fixul 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.php

Cautati:

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.php

Cautati:

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-rocket

sau, pentru CLSOP:

wp plugin deactivate clsop

Atentie: 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 given

impreuna cu:

ThirdParty/Plugins/CDN/Cloudflare.php

verificati 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 given

iar eroarea indica:

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

sau:

clsop/inc/ThirdParty/Plugins/CDN/Cloudflare.php

verificati 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.

Lasă un comentariu

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *