web-dev-qa-db-fra.com

WP_Widget: erreur déconseillée dans Wordpress V4.3

Cette erreur ne s'est produite que ce matin lorsque j'ai mis à jour mon site wordpress vers la version 4.3. Deux autres sites sur le même hébergement (et tous utilisant CPanel comme portail d'administrateur pour l'hébergement) ne rencontrent aucun problème. Sur ce site problématique company.com, bien que sur le portail admin wordpress et le site actif, une erreur se répète plusieurs fois en haut de la page, à savoir:

 The error continues down the page like this 9 times. 

 The error page is then finished off with this error/line. 

J'ai lu aujourd'hui à ce sujet et c'est peut-être à propos de la mise à niveau de PHP4 à PHP5, bien qu'il n'y ait aucun problème avec les autres sites WP sur le même serveur. J'ai également désactivé tous les plugins sur le site à tester et le problème était toujours là. À moins de restaurer à partir d'une sauvegarde (ce qui n'est pas facile et peut provoquer des erreurs), y a-t-il quelqu'un d'autre qui a ce problème aujourd'hui/récemment?

Cela n'aide pas que le message d'erreur semble suggérer une solution elle-même avant qu'elle ne soit coupée à la fin avec

Utilisez ... ". Le message d'erreur commence par" company/public_html/wp-includes/... ". La deuxième ligne est" La méthode du constructeur pour WP_Widget est obsolète depuis la version 4.3.0.

La version 4.3 est la version avec laquelle WP a été mis à jour aujourd'hui. Cela a apparemment provoqué cette erreur mais je ne sais pas comment le corriger.

Toute autre information nécessaire pour répondre à cette question se fera un plaisir de vous fournir.

2
MuccyCork

L’erreur n’est pas causée par votre version de PHP (les constructeurs de PHP 4 ne seront supprimés que par PHP 7). Chaque répétition de l'erreur représente un plugin utilisant le code obsolète.

Jusqu'à ce que les auteurs de vos plugins les mettent à jour, vous pouvez exécuter la commande Shell suivante sur un système Linux pour rechercher les anciens appels de constructeur:

grep -R "WP_Widget\(" /path/to/your/wp/install

Cela vous donnera une liste de fichiers que vous pouvez modifier sur la ligne de commande ou utiliser l'éditeur de plug-ins de WP. Chaînes correspondantes - la plupart du temps, parent::WP_Widget(args) devrait être remplacé par parent::__construct(args).

4
tjbp

Il semble que ce ne soit pas le WP_Widget qui soit mis à jour, mais la façon dont il est référencé.

Je crois que ce que nous voulons, c'est partir de ceci:

class mZ_Mindbody_day_schedule extends WP_Widget {

        function mZ_Mindbody_day_schedule() {
                $widget_ops = array(
                        'classname' => 'mZ_Mindbody_day_schedule_class',
                        'description' => __('Display class schedule for current day.', 'mz-mindbody-api')
                        );
                $this->WP_Widget('mZ_Mindbody_day_schedule', __('Today\'s MindBody Schedule', 'mz-mindbody-api'),
                                                        $widget_ops );
        } 

Pour ça:

class mZ_Mindbody_day_schedule extends WP_Widget {

        function mZ_Mindbody_day_schedule() {
                $widget_ops = array(
                        'classname' => 'mZ_Mindbody_day_schedule_class',
                        'description' => __('Display class schedule for current day.', 'mz-mindbody-api')
                        );
                parent::__construct('mZ_Mindbody_day_schedule', __('Today\'s MindBody Schedule', 'mz-mindbody-api'),
                                                        $widget_ops );
        } 

Où ce n'est que la ligne six du code ci-dessus qui est mise à jour.

3
MikeiLL

WordPress vous avertit que cette construction est obsolète, car elle se prépare pour PHP7. Vous devriez vérifier votre code personnalisé et tous les plug-ins pour l'utilisation de la construction WP_Widget. Il y a (encore) beaucoup de plug-ins qui ont besoin de mettre à jour leur code.

Voici une liste des plug-ins qui utilisent la construction obsolète WP_Widget: https://Gist.github.com/chriscct7/d7d077afb01011b1839d

Vous pouvez soit attendre que les auteurs des plug-ins mettent à jour leur code, soit modifier vous-même (temporairement) le code des plug-ins. Il y a un bon résumé sur la modification de votre code (par Chris Christoff )

Fondamentalement, au lieu de faire ceci:

  • {classname}::{classname}() comme dans WP_Widget::WP_Widget() ou
  • parent::{classname}() comme dans parent::WP_Widget() ou
  • {object}->{classname}() comme dans {object}->WP_Widget() (un exemple plus spécifique: $this->WP_Widget())

Faire:

  • parent::__construct() pour appeler le constructeur de la classe parent à partir d'une classe enfant
  • $var = new {class name}() comme dans $var = new My_Widget_Class() pour contenir une instance d'un widget (n'utilisez pas My_Widget_Class comme nom de votre classe de widget, utilisez quelque chose de plus unique et applicable pour éviter les conflits de nom de classe avec d'autres plugins.
2
studiobovenkamer

Si vous voulez garder WP_DEBUG et si vous voulez cacher ce type d'erreur spécifique, insérez dans votre thème functions.php cette ligne:

add_filter('deprecated_constructor_trigger_error', '__return_false');

Cela empêchera ce type d'erreur d'être affiché.

J'espère que ça aide :)

1
Lorenzo Zottar

J'étais dans un bateau similaire (je devais d'abord réparer certains widgets personnalisés dans un thème), mais le message était affiché même après l'avoir corrigé.

Basculé sur un thème par défaut: toujours la même erreur.

TL; DR : Début de la désactivation des plugins un par un ... trouvé https://wordpress.org/plugins/list-category-posts/ était le coupable.

0
bishless