Erori fatale WordPress 6.0 în class-wp-widget.php pentru PHP 8.1.6
/wp-includes/class-wp-widget.php îmi dă o eroare pentru un blog, dar nu și pentru celălalt, și ambele au aceeași versiune de class-wp-widget.php ceea ce nu are sens pentru mine.
PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function WP_Widget::__construct(), 0 passed in /home/www/stackexchange.com/wp-includes/class-wp-widget-factory.php on line 61 and at least 2 expected in /home/www/stackexchange.com/wp-includes/class-wp-widget.php:162
Citind codul, se pare că class-wp-widget.php este sursa problemei, dar s-ar putea să mă înșel.
Celălalt blog (care funcționează) de pe același server are același fișier și nu primesc eroarea.
Puteți vedea funcția WordPress defectă aici https://developer.wordpress.org/reference/classes/wp_widget/__construct/
Există vreo modalitate de a "dezactiva" widget-urile pentru a dezactiva acest cod WordPress defect?
Actualizare: mulțumesc @bosco pentru idee, analizarea Stack trace-ului a ajutat...
Stack trace:
#0 /home/www/example.com/wp-includes/class-wp-widget-factory.php(61): WP_Widget->__construct()
#1 /home/www/example.com/wp-includes/widgets.php(115): WP_Widget_Factory->register()
#2 /home/www/example.com/wp-content/themes/theme1516/includes/register-widgets.php(22): register_widget()
#3 /home/www/example.com/wp-includes/class-wp-hook.php(307): load_my_widgets()
#4 /home/www/example.com/wp-includes/class-wp-hook.php(331): WP_Hook->apply_filters()
#5 /home/www/example.com/wp-includes/plugin.php(476): WP_Hook->do_action()
#6 /home/www/example.com/wp-includes/widgets.php(1854)
Deoarece "register-widgets.php" este singurul cod non-core de aici, și pentru că presupun că comentariul lui @bosco este corect, am comentat widget-urile vechi și cel puțin asta a eliminat "ecranul alb al morții" între timp pagina de start arată ciudat, probabil voi face doar copy/paste la HTML-ul de pe site-ul cu PHP 7.x.
În cazul în care nu poți reveni la o versiune de PHP mai veche de 8.1 sau să repari înregistrarea widget-urilor (și ai încredere în tema ta veche de peste 10 ani), poți actualiza linia 61 din wp-includes/class-wp-widget-factory.php
în felul următor:
$this->widgets[ $widget ] = new $widget( $widget, $widget );
Această modificare poate rezolva problema înregistrării widget-urilor.

Aceasta a fost exact și problema mea, iar această modificare de cod a rezolvat-o pentru mine. Mulțumesc mult pentru asta!

A fost incredibil! După această mică modificare, am putut porni WordPress și apoi am dezactivat cu ușurință plugin-ul problematic. Apoi am putut să schimb codul înapoi la cel implicit din WordPress ($this->widgets[ $widget ] = new $widget()
), iar site-ul încă funcționează. Mulțumesc mult!

Bănuiesc că cauza este un widget personalizat construit incorect. Uită-te la acest exemplu din Codex:
class My_Widget extends WP_Widget {
/**
* Configurează numele widgetului etc.
*/
public function __construct() {
$widget_ops = array(
'classname' => 'my_widget',
'description' => 'My Widget este fantastic',
);
parent::__construct( 'my_widget', 'My Widget', $widget_ops );
}
Ceea ce fac multe pluginuri prost construite este următorul lucru:
class My_Widget extends WP_Widget {
/**
* Configurează numele widgetului etc.
*/
public function __construct() {
parent::__construct();
}
Sau nu includ deloc o metodă __construct
! Transmiterea fără parametri sau absența unui constructor este incorectă. Versiunile anterioare de PHP ar fi putut înlocui aceste valori cu null
sau undefined
, rezolvându-le ca ''
, dar mă așteptam ca aceasta să devină o problemă înainte de actualizarea la 8.1 și cu siguranță ar fi apărut în jurnalul de erori ca o notificare.
Deci identifică care plugin sau temă este responsabil pentru aceasta, fie prin urmărire a stivei, fie printr-un proces de eliminare, poate chiar prin căutarea în codul sursă cu un instrument.
Dacă aceasta este în cod pe care îl întreții, cum ar fi o temă sau un plugin personalizat, poți rezolva problema prin implementarea corectă a API-ului Widget, așa cum instruiesc Codex și ghidurile devhub. Mai exact, prin furnizarea primilor doi parametri.
Dacă nu ești interesat să repari widgeturile, le poți elimina complet de pe site.
Între timp, revino la versiunea 8.0 pentru un timp. Atât 8.0 cât și 8.1 sunt versiuni acceptate de PHP și primesc actualizări. WordPress încă nu a construit suport oficial pentru 8.0, iar 8.1 este o versiune foarte recentă (începutul anului 2022), așa că nu este surprinzător că ai întâmpinat probleme de compatibilitate și conflicte cu codul terților la actualizare.

Deși apreciez efortul, acest răspuns seamănă cu alte răspunsuri pe care le-am găsit pe Google. În cazul meu particular, nu folosesc widget-urile, acestea au fost doar incluse ca extra în temă și nu am nicio dorință să repar o duzină de widget-uri vechi de peste 10 ani. În ceea ce privește PHP 8.x, am două bloguri de test care rulează fără probleme pe Arch, apropo ;-)

indiferent dacă ai folosit widget-urile sau nu, acest aspect este irelevant pentru problemă (eu rulez propriul site pe 8.0). Dacă nu intenționezi să folosești widget-urile și nu vrei să le repari, atunci ar trebui să le elimini. Problema nu este WordPress, ci codul terță parte care folosește greșit API-ul și generează erori.

Pentru a spune altfel, atunci când codul tău scris pentru o bibliotecă concepută pentru standardul C++ 98 nu compilează când actualizezi codul la standardul C++ 20, nu este deloc vina Comitetului/Grupului de Lucru C++ - încerci să folosești o bibliotecă scrisă acum peste 20 de ani de cineva care nu a actualizat-o niciodată, pe o platformă care nu a fost construită să o susțină. WordPress are o convingere enervant de puternică în ceea ce privește compatibilitatea retroactivă - dar schimbările care rup compatibilitatea sunt bune pentru sănătatea și dezvoltarea oricărei tehnologii.

Pe când în acest caz, Widget-ul a fost construit incorect din prima zi

Pentru cei care încă întâmpină această problemă, puteți încerca să mergeți în
wordpress/wp-includes/class-wp-widget-factory.php
la linia 61 și să faceți următoarea modificare pentru a remedia problema fără a schimba alt cod:
Schimbați această linie: $this->widgets[ $widget ] = new $widget();
În: $this->widgets[ $widget ] = new $widget( $widget, $widget );
Acum totul ar trebui să funcționeze conform așteptărilor.

Cu siguranță este o idee proastă și nu ar trebui să faci această modificare și apoi să pleci pur și simplu, dar când site-ul tău nu se încarcă și nici măcar nu poți exporta sau recupera datele pentru că interfața de administrare este indisponibilă, această soluție este de mare ajutor.
