Errori fatali WordPress 6.0 class-wp-widget.php in PHP 8.1.6

31 mag 2022, 02:05:12
Visualizzazioni: 21.9K
Voti: 5

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

8
Commenti

Se fosse un problema di compatibilità con PHP 8.1, scommetterei che vedresti un avviso di deprecazione invece - come riportato su Make: "Tutti i problemi conosciuti rimanenti con PHP 8.1 sono avvisi di deprecazione". Molto probabilmente, questo errore è il prodotto di un plugin o tema che utilizza un metodo di registrazione dei Widget obsoleto da tempo - il fatto che lo stack di chiamate nell'errore non menzioni un'estensione non significa che l'errore non sia stato causato da una. Il tradizionale metodo di risoluzione dei problemi di disabilitare/abilitare uno per uno potrebbe aiutare a identificare il colpevole

bosco bosco
31 mag 2022 02:47:03

Leggendo il codice personalmente, sembra che un'estensione stia probabilmente passando qualcosa a register_widget() che non sovrascrive correttamente il costruttore WP_Widget.

bosco bosco
31 mag 2022 02:59:08

Aspetterei prima di aggiornare a PHP 8.1. Anche se WordPress funziona su PHP 8.0, non lo supporta ancora ufficialmente, e molti plugin e temi non sono stati testati o non funzionano su 8.0. La versione 8.1 è ancora più recente e molti strumenti non sono stati aggiornati per funzionarci. Almeno per qualche altro mese dovresti considerare PHP 8.1 all'avanguardia. Fintanto che sei su una versione di PHP ancora nel suo periodo di supporto, andrai bene per ora

Tom J Nowell Tom J Nowell
31 mag 2022 03:00:19

Altrimenti Bosco probabilmente ha ragione, disattiva tutti i plugin e riattivali uno per uno, quindi cerca in quel plugin le chiamate di registrazione dei widget, una traccia dello stack avrebbe indicato direttamente il plugin rilevante. L'errore che hai condiviso indica solo che è correlato ai Widget, molto probabilmente un widget personalizzato sta cercando di chiamare il costruttore genitore ma non passa alcun argomento, come questo: parent::__construct() quando dovrebbe essere così parent::__construct( 'my_widget', 'My Widget' );

Tom J Nowell Tom J Nowell
31 mag 2022 03:02:27

OK @bosco lo proverò di nuovo, ho trovato alcune vecchie chiamate register_widget in un vecchio tema, forse posso commentarle.

Jay Brunet Jay Brunet
31 mag 2022 03:10:10

@PJBrunet dovresti pubblicare la tua soluzione come soluzione, non come modifica, il sito non vedrà mai che hai risolto il tuo problema e continuerà a mostrarlo per cercare di ottenere una risposta.

Tom J Nowell Tom J Nowell
31 mag 2022 03:54:09

@TomJNowell Sì, l'ho considerato. Non sono nuovo qui LOL. Non sono convinto che il problema sia risolto. Un tema vecchio che ha funzionato per 10+ anni fino a PHP 7.x non dovrebbe far crashare WordPress con una schermata bianca della morte. Ancora meglio, una sorta di wizard per la migrazione di temi/plugin per PHP 8.x sarebbe fantastico. Programmo in PHP da 20 anni e non ho alcun desiderio di imparare i widget di WordPress. Nella mia esperienza da esperto, sono stati una cattiva idea fin dall'inizio, e guarda, non hanno mai veramente preso piede. Quello, e l'OOP è stato oggetto di battute per anni, nessuno vuole sistemare nemmeno gli errori dei costruttori PHP.

Jay Brunet Jay Brunet
31 mag 2022 04:20:53

Non mi fido dei temi che non ricevono aggiornamenti regolari - non mi fiderei mai di un tema scritto per compatibilità con un core di WordPress che ha 10+ anni e non è mai stato toccato da allora. Non c'è motivo per cui WordPress dovrebbe supportare il codice dei widget nel tuo tema dato che non sono mai stati implementati correttamente fin dall'inizio. Sarebbe meglio trovare un nuovo tema del tutto poiché questo problema potrebbe benissimo essere indicativo di ulteriori abusi di API/funzionalità mal codificate, e considerando che non è mai stato aggiornato, molto probabilmente anche di una serie di vulnerabilità di sicurezza.

bosco bosco
31 mag 2022 22:44:03
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 3
4
16

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.

31 ago 2022 11:25:52
Commenti

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

SqlRyan SqlRyan
6 feb 2023 18:09:25

Grazie. Mi hai salvato la pellaccia.

recantha recantha
16 mag 2023 22:28:50

È 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!

Jesper Jesper
29 lug 2023 19:35:31

Gentile promemoria che modificare il core non è mai una buona idea. Fai un aggiornamento e puff, devi rifarlo di nuovo.

Fredy31 Fredy31
17 ago 2023 22:38:56
5

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.

31 mag 2022 03:10:03
Commenti

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 ;-)

Jay Brunet Jay Brunet
31 mag 2022 03:42:31

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.

Tom J Nowell Tom J Nowell
31 mag 2022 03:52:04

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.

bosco bosco
31 mag 2022 22:31:46

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

Tom J Nowell Tom J Nowell
31 mag 2022 22:34:19

@TomJNowell Queste cose capitano, ma PHP 8.x sembra essere più severo delle versioni precedenti. Ho trovato altri errori fatali, ma fortunatamente sono stati risolti in WP 6.

Jay Brunet Jay Brunet
2 giu 2022 01:33:23
3

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.

19 gen 2023 21:54:43
Commenti

No, non modificare mai i file core.

vancoder vancoder
20 gen 2023 00:40:26

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.

SqlRyan SqlRyan
6 feb 2023 18:16:57

nell'aggiornamento di Wordpress di marzo 2023 (6.2) c'è ancora un'incompatibilità con la versione PHP 8.1 che deve ancora essere risolta in questo modo... :/ (sì, questo file viene sovrascritto dopo ogni aggiornamento)

hello_earth hello_earth
10 apr 2023 16:55:50