Errori fatali WordPress 6.0 class-wp-widget.php in PHP 8.1.6
/wp-includes/class-wp-widget.php mi dà un errore per un blog, ma non per l'altro, ed entrambi hanno la stessa versione di class-wp-widget.php che per me non ha senso.
PHP Fatal error: Uncaught ArgumentCountError: Troppi pochi argomenti per la funzione WP_Widget::__construct(), 0 passati in /home/www/stackexchange.com/wp-includes/class-wp-widget-factory.php alla riga 61 e almeno 2 previsti in /home/www/stackexchange.com/wp-includes/class-wp-widget.php:162
Leggendo il codice, sembra che class-wp-widget.php sia la radice del problema, ma potrei sbagliarmi.
Il mio altro blog (funzionante) sullo stesso server ha questo stesso file e non ottengo l'errore.
Puoi vedere la funzione WordPress non funzionante qui https://developer.wordpress.org/reference/classes/wp_widget/__construct/
C'è un modo per "disattivare" i widget per disabilitare questo codice WordPress non funzionante?
Aggiornamento: grazie @bosco per l'idea, guardare lo Stack trace ha aiutato...
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)
Dato che "register-widgets.php" è l'unico codice non core qui, e poiché presumo che il commento di @bosco sia corretto, ho commentato i vecchi widget e questo ha almeno rimosso il "white screen of death" nel frattempo la homepage appare strana, probabilmente dovrò solo tagliare/incollare l'HTML dal sito PHP 7.x.
Nel caso in cui non sia possibile tornare a una versione di PHP precedente alla 8.1 o correggere la registrazione del widget (e ti fidi del tuo tema con più di 10 anni), puoi aggiornare la riga 61 del file wp-includes/class-wp-widget-factory.php
in questo modo:
$this->widgets[ $widget ] = new $widget( $widget, $widget );
Questa modifica potrebbe risolvere il problema della registrazione del widget.

Anche io avevo esattamente questo problema e questa modifica al codice lo ha risolto per me. Grazie mille per questo!

È stato incredibile! Dopo aver apportato quella piccola modifica sono riuscito ad avviare WordPress e poi disattivare facilmente il plugin problematico. Poi ho potuto ripristinare il codice a quello predefinito di WordPress ($this->widgets[ $widget ] = new $widget()
), e il sito funziona ancora. Grazie mille!

Sospetto che la causa sia un widget personalizzato costruito in modo errato. Guarda questo esempio dal Codex:
class My_Widget extends WP_Widget {
/**
* Configura il nome del widget e altre proprietà
*/
public function __construct() {
$widget_ops = array(
'classname' => 'my_widget',
'description' => 'Il mio Widget è fantastico',
);
parent::__construct( 'my_widget', 'My Widget', $widget_ops );
}
Ciò che molti plugin costruiti male fanno è questo:
class My_Widget extends WP_Widget {
/**
* Configura il nome del widget e altre proprietà
*/
public function __construct() {
parent::__construct();
}
O addirittura non includono affatto un metodo __construct
! Passare zero parametri o non avere un costruttore è sbagliato. Versioni precedenti di PHP potevano sostituire questi valori con null
o undefined
, risolvendo in ''
, ma mi sarei comunque aspettato che questo diventasse un problema prima di aggiornare a 8.1, e sicuramente sarebbe apparso nel log degli errori come un notice.
Quindi identifica quale plugin o tema è responsabile di questo, sia con stack trace, sia con un processo di eliminazione, o addirittura facendo una ricerca nel codice con uno strumento specifico.
Se si tratta di codice che gestisci tu, come un tema o un plugin personalizzato, puoi risolvere il problema implementando correttamente la Widget API come indicato dal Codex e dai manuali di devhub. In particolare, fornendo i primi due parametri.
Se non sei interessato a correggere i widget, puoi anche rimuoverli completamente dal tuo sito.
Nel frattempo, torna temporaneamente alla versione 8.0. Sia 8.0 che 8.1 sono attualmente versioni supportate di PHP e ricevono aggiornamenti. WordPress non ha ancora costruito un supporto ufficiale per 8.0, e 8.1 è un'uscita molto recente (inizio 2022), quindi non sorprende che tu abbia incontrato problemi di compatibilità e conflitti con codice di terze parti quando hai effettuato l'aggiornamento.

Sebbene apprezzi lo sforzo, questa risposta assomiglia ad altre che ho trovato su Google. Nel mio caso specifico, non sto utilizzando i widget, erano solo inclusi come extra nel tema, e non ho alcuna intenzione di sistemare una dozzina di widget vecchi di 10+ anni. Per quanto riguarda PHP 8.x, ho due blog di test che lo eseguono senza problemi su Arch, tra l'altro ;-)

che tu abbia usato i widget o meno è irrilevante per il problema (io stesso gestisco il mio sito su 8.0). Se non intendi usare i widget e non vuoi sistemarli, allora dovresti rimuoverli. Il problema non è WordPress, è codice di terze parti che utilizza male l'API generando errori.

Per dirla in altro modo, quando il tuo codice scritto dipendendo da una libreria creata per lo standard C++ 98 non compila più quando aggiorni al standard C++ 20, non è assolutamente colpa del Comitato/Gruppo di Lavoro del C++ - stai cercando di usare una libreria che qualcuno ha scritto più di 20 anni fa e mai aggiornato su una piattaforma che non è mai stata costruita per supportarla. WordPress ha una fastidiosamente forte convinzione quando si tratta di compatibilità all'indietro - ma i cambiamenti che rompono la compatibilità sono salutari per lo sviluppo di qualsiasi tecnologia.

In questo caso il Widget è stato costruito in modo errato fin dal primo giorno

Per chiunque abbia ancora questo problema, puoi provare ad andare in
wordpress/wp-includes/class-wp-widget-factory.php
alla riga 61 e apportare questa modifica per risolvere il problema senza cambiare altro codice:
Cambia questo: $this->widgets[ $widget ] = new $widget();
In questo: $this->widgets[ $widget ] = new $widget( $widget, $widget );
Ora tutto dovrebbe funzionare come previsto.

Sicuramente è una pessima idea e non dovresti apportare questa modifica per poi andartene, ma quando il tuo sito non si carica e non puoi nemmeno esportarlo o recuperarlo perché l'interfaccia di amministrazione non è disponibile, questo trucco è di enorme aiuto.
