Errore WP_Widget deprecato in WordPress V4.3

19 ago 2015, 17:25:07
Visualizzazioni: 14.4K
Voti: 5

Questo errore è apparso stamattina dopo aver aggiornato il mio sito WordPress alla versione 4.3. Altri due siti sullo stesso hosting (che utilizzano tutti CPanel come porta di amministrazione) non hanno alcun problema. Solo su questo sito problematico company.com, sia nel pannello di amministrazione WordPress che nel sito live, compare un errore che si ripete più volte in cima alla pagina:

L'errore continua lungo la pagina ripetendosi 9 volte.

La pagina termina con quest'ultimo errore/riga.

Ho fatto delle ricerche oggi e sembra possa essere legato all'aggiornamento da PHP4 a PHP5, sebbene non ci siano problemi con gli altri siti WP sullo stesso server. Ho anche disabilitato tutti i plugin del sito per testare, ma il problema persisteva. A parte il ripristino da un backup (che non è semplice da fare e può causare errori a sua volta), c'è qualcun altro che ha avuto questo problema recentemente?

Non aiuta il fatto che il messaggio d'errore sembri suggerire una soluzione prima di essere troncato alla fine con

Use...". Il messaggio d'errore inizia con "company/public_html/wp-includes/...". La seconda riga è "constructor method for WP_Widget is deprecated since version 4.3.0.

La versione 4.3 è quella a cui WordPress è stato aggiornato oggi. Sembra aver causato questo errore ma non so come risolverlo.

Se servono altre informazioni per rispondere, sarò felice di fornirle.

3
Commenti

Non aiuta il fatto che il messaggio di errore sembra suggerire una soluzione prima di essere troncato alla fine -- Se fai View Source della pagina, riesci a leggere l'intero messaggio di errore?

Pat J Pat J
19 ago 2015 18:20:13

A quanto pare l'errore in realtà non viene troncato, ho aggiornato il post con un'immagine più accurata dell'errore. Ho visto quell'articolo. C'è un modo in CPanel/WP/Hosting per vedere quale versione di PHP viene utilizzata? Perché 'PHP Configuration' in CPanel non sembra mostrarla.

MuccyCork MuccyCork
20 ago 2015 12:43:06
Tutte le risposte alla domanda 6
2

L'errore non è effettivamente causato dalla tua versione di PHP (i costruttori PHP 4 non verranno rimossi fino a PHP 7) - è un avviso generato da WordPress in preparazione a questo cambiamento. Ogni ripetizione dell'errore rappresenta un plugin che utilizza il codice obsoleto.

Fino a quando gli autori dei tuoi plugin non li aggiorneranno, puoi eseguire il seguente comando shell su un sistema Linux per trovare le chiamate ai costruttori vecchi:

grep -R "WP_Widget\(" /percorso/della/tua/installazione/wp

Questo ti fornirà una lista di file che puoi modificare tramite la riga di comando o utilizzando l'editor di plugin di WP. Le stringhe trovate - principalmente parent::WP_Widget(args) dovrebbero essere cambiate in parent::__construct(args).

20 ago 2015 04:10:18
Commenti

Questo non è negato dal fatto che ho disattivato tutti i plugin e ho comunque ricevuto gli stessi errori?

MuccyCork MuccyCork
20 ago 2015 12:34:23

@MuccyCork il codice deprecato potrebbe far parte del tuo tema - il comando grep lo troverà ovunque sia. Tieni presente che corrisponderà a plugin e temi che non sono attivi, nel qual caso puoi ignorare quei file.

tjbp tjbp
20 ago 2015 13:00:19
0

WordPress ti sta notificando che questo costrutto è deprecato, perché si sta preparando per PHP7. Dovresti controllare il tuo codice personalizzato e qualsiasi plugin che utilizzi il costrutto WP_Widget. Ci sono (ancora) molti plugin che necessitano di aggiornare il loro codice.

Ecco una lista di plugin che utilizzano il costrutto deprecato WP_Widget: https://gist.github.com/chriscct7/d7d077afb01011b1839d

Puoi aspettare che gli autori dei plugin aggiornino il loro codice oppure puoi modificare temporaneamente tu stesso il codice dei plugin. C'è un buon riassunto su come modificare il tuo codice (di Chris Christoff)

In sostanza invece di fare queste operazioni:

  • {classname}::{classname}() come in WP_Widget::WP_Widget() oppure
  • parent::{classname}() come in parent::WP_Widget() oppure
  • {object}->{classname}() come in {object}->WP_Widget() (un esempio più specifico: $this->WP_Widget())

Fai:

  • parent::__construct() per chiamare il costruttore della classe genitore da una classe figlia
  • $var = new {class name}() come in $var = new My_Widget_Class() per creare un'istanza di un widget (non usare My_Widget_Class come nome della tua classe widget, usa qualcosa di più unico e pertinente per evitare conflitti di nomi di classe con altri plugin.
31 ago 2015 17:49:01
0

Sembra che non sia WP_Widget ad essere aggiornato, ma il modo in cui viene referenziato.

Credo che ciò che vogliamo sia passare da questo:

class mZ_Mindbody_day_schedule extends WP_Widget {

        function mZ_Mindbody_day_schedule() {
                $widget_ops = array(
                        'classname' => 'mZ_Mindbody_day_schedule_class',
                        'description' => __('Mostra l'orario delle lezioni per il giorno corrente.', 'mz-mindbody-api')
                        );
                $this->WP_Widget('mZ_Mindbody_day_schedule', __('Orario MindBody di Oggi', 'mz-mindbody-api'),
                                                        $widget_ops );
        } 

A questo:

class mZ_Mindbody_day_schedule extends WP_Widget {

        function mZ_Mindbody_day_schedule() {
                $widget_ops = array(
                        'classname' => 'mZ_Mindbody_day_schedule_class',
                        'description' => __('Mostra l'orario delle lezioni per il giorno corrente.', 'mz-mindbody-api')
                        );
                parent::__construct('mZ_Mindbody_day_schedule', __('Orario MindBody di Oggi', 'mz-mindbody-api'),
                                                        $widget_ops );
        } 

Dove è solo la sesta riga del codice sopra che viene aggiornata.

25 set 2015 00:12:23
2

Se vuoi mantenere WP_DEBUG attivo ma desideri nascondere questo specifico tipo di errore, inserisci nel file functions.php del tuo tema questa riga:

add_filter('deprecated_constructor_trigger_error', '__return_false');

Questo impedirà la visualizzazione di questo tipo di errore.

Spero sia utile :)

28 ago 2015 00:16:50
Commenti

Questo sta ancora evitando di risolvere il problema?

MuccyCork MuccyCork
31 ago 2015 19:41:41

Preferisco lasciare che gli sviluppatori del plugin risolvano il vero problema: non è un errore, solo un avviso per ricordare A LORO di sistemarlo :)

Lorenzo Zottar Lorenzo Zottar
1 set 2015 03:23:50
1

Mi trovavo in una situazione simile (prima ho dovuto sistemare alcuni widget personalizzati in un tema), ma continuavo a ricevere il messaggio anche dopo averli corretti.

Ho cambiato con un tema predefinito: l'errore persisteva.

TL;DR: Ho iniziato a disattivare i plugin uno per uno... ho scoperto che https://wordpress.org/plugins/list-category-posts/ era il colpevole.

19 ago 2015 22:24:19
Commenti

Buon metodo ma ho disattivato tutti i plugin e ho comunque lo stesso errore. Se ci fosse un modo per disattivare i widget e riattivarli con la stessa facilità con cui si può fare con i plugin, questo renderebbe il troubleshooting molto più semplice.

MuccyCork MuccyCork
20 ago 2015 12:31:58
1
-1

La modalità di debug di WordPress può generare questo tipo di messaggi.

Ho avuto lo stesso problema su uno dei miei siti.

Forse hai questa riga di codice nel tuo file wp-config.php:

define('WP_DEBUG', true);

Prova a cambiarla con:

define('WP_DEBUG', false);

Spero sia utile.

27 ago 2015 14:47:26
Commenti

Questo nasconderà solo il bug. Il debug è lì per un motivo. Dovresti sempre correggere un bug e non semplicemente nasconderlo, un bug rimane un bug, nascosto o meno

Pieter Goosen Pieter Goosen
27 ago 2015 15:03:42