Widgets : corriger l’erreur du constructeur de classe

Les widgets WordPress utilisent la programmation orientée objet. Leur développement doit suivre des règles précises. Celles relatives au constructeur de classe ont été modifiées à partir de la version WordPress 4.3. Cet article montre comment adapter d’anciens widgets.

Le message d’erreur

Lorsqu’on utilise un widget développé suivant la méthode « obsolète », on peut voir apparaître le message suivant à l’écran ou dans un fichier journal (log) :

Exemple d'affichage à l'écran d'une erreur liée au constructeur de classe widget
Affichage d’une erreur liée au constructeur de classe widget

Ceci n’est qu’un message d’alerte. Le widget fonctionne, mais il n’est plus dans les normes de programmation. Il est préférable d’adapter le programme gérant le widget pour plusieurs raisons :

  • même si on cache le message à l’écran, php doit inutilement gérer ce qui est une erreur,
  • si on n’affiche l’alerte que dans le fichier log, celui-ci va être saturé par ce message qui s’y inscrit chaque fois qu’une page du site est affichée,
  • si on retire les alertes du fichier log, d’autres alertes utiles risquent de ne plus apparaître,
  • arrivera un moment où une nouvelle version de WordPress ou php n’acceptera plus cette façon de programmer,
  • l’erreur est facile à corriger (même si on ne maîtrise pas la programmation orientée objet).

Analysons le message d’alerte :

Notice: la méthode du constructeur appelée pour WP_Widget dans wpdf_dam_widget est obsolète depuis la version 4.3. utilisez __construct() à la place. in…

Tout est dit :

  • le problème vient du constructeur de la classe WP_Widget,
  • utilisé pour créer le widget wpdf_dam_widget,
  • il faut utiliser la fonction « __construct()« .

Corriger l’appel au constructeur

Éditer le fichier php dans lequel est défini le widget. Suivant les cas, ce sera le fichier functions.php associé au thème ou une extension (plugin ou mu-plugin.

Voici le code qui pose problème dans notre exemple :

class wpdf_dam_widget extends WP_Widget {

/*
*
* la première fonction doit porter le même nom que la classe de notre widget,
* elle permet de gérer le widget dans le tableau de bord
*
*/

function wpdf_dam_widget() {
$wpdf_dam_widget_options = array( ‘classname’ => ‘wpdf_dam_widget_css’, // class ajoutée dans la balise <li> pour gérer le css
‘description’ => __(‘Affichage des n derniers articles modifiés’, ‘wpdf_widget_dam’) // description du widget dans le tableau de bord des widgets
);

$wpdf_dam_widget_controle = array( ‘width’ => 200, // largeur du formulaire de saisie des paramètres du widget
‘height’ => 350, // non utilisé
‘id_base’ => ‘wpdf_dam’ // base de l’identifiant utilisé quand le widget est instancié plusieurs fois
);

$this->WP_Widget( ‘wpdf_dam’, __(‘Derniers articles modifiés’, ‘wpdf_widget_dam’), $wpdf_dam_widget_options, $wpdf_dam_widget_controle );
} // fin fonction wpdf_dam_widget

class wpdf_dam_widget extends WP_Widget { ... }

Nous créons une classe d’objet « wpdf_dam_widget » qui étend la classe « WP_Widget».

Autrement dit, on utilise le modèle qui permet de gérer les widgets (la classe « WP_Widget« ) pour définir un type de widget particulier : « wpdf_dam_widget».
Avec cette seule instruction, WordPress comprend que « wpdf_dam_widget » aura toutes les caractéristiques d’un widget, mais avec en plus certaines particularités qui sont décrites dans la partie comprise entre les parenthèses « {«  et « } » .

$this->WP_Widget( 'wpdf_dam', __('Derniers articles modifiés', 'wpdf_widget_dam'), $wpdf_dam_widget_options, $wpdf_dam_widget_controle );

La fonction de constructeur permet de créer un widget particulier, dans notre exemple un widget affichant la lise des derniers messages modifiés.

Jusqu’à la version php 4 (pour information php en est à la version 7), le constructeur (« $this->WP_Widget« ) était inclus dans une fonction ayant le même nom que la classe. Dans notre exemple « wpdf_dam_widget()». Désormais il convient d’utiliser la fonction « __construct() », toujours dans la méthode de construction.

En pratique, il suffit de remplacer le code :

$this->WP_Widget…

par

parent::__construct...

Dans notre exemple, la fonction de constructeur devient :

parent::__construct('wpdf_dam', __('Derniers articles modifiés', 'wpdf_widget_dam'), $wpdf_dam_widget_options, $wpdf_dam_widget_controle );

Ne plus nommer la méthode comme la classe

Voici un autre message d’alerte que vous pouvez rencontrer :

Message : "Les méthodes avec le même nom que la classe ne seront plus des méthodes de construction dans une future version de php
Message d’alerte à propos de la méthode de construction

« Les méthodes avec le même nom que leur classe ne seront plus des méthodes de construction dans une future version de php ».

Regardons le code :

Le nom de la classe est identique à celui de la méthode : wpdf_dam_widget
L’ancien code

Nous voyons que le nom de la classe est le même que le nom de la méthode (fonction associée à une classe) qui permet la construction de notre objet widget.

Ceci correspondait à une ancienne convention : le nom de la méthode de construction était le même que le nom de la classe. Le message d’alerte nous indique que cette convention sera bientôt ignorée.

Que faire alors ? Tout simplement indiquer qu’il s’agit d’une méthode de construction en renommant la fonction de construction en « __construct » :

Renommer la fonction ayant le même nom que la classe en "__construct"
Utilisation de la fonction de construction

Quelques notions de POO

Vous ne connaissez pas du tout la Programmation Orientée Objet, aussi vous ne comprenez pas grand chose à ce que je vous suggère de faire. Je vais essayer de vous donner des clés pour comprendre l’essentiel.

Tous les widgets ont des caractéristiques communes, notamment un titre mais aussi la possibilité d’apparaître dans l’administration pour être positionné dans un barre latérale. Toutes ces caractéristiques sont définies dans une classe d’objet : la classe WP_widget.

L’instruction « class wpdf_dam_widget extends WP_widget» crée une nouvelle classe d’objets (« wpdf_dam_widget« ) qui possède toutes les caractéristiques des objets WP_widget. Le code qui suit permet de définir des caractéristiques particulières à notre widget « wpdf_dam_widget ».

C’est comme si on définissait un objet voiture (une carrosserie, un moteur, des sièges…) et qu’on puisse créer un nouveau modèle en indiquant que la carrosserie est en plastique, le moteur un diesel, les sièges en cuir…. On peut aussi ajouter que le modèle dispose d’un GPS intégré, ce qui n’est pas une caractéristique commune à toutes les voitures.

Jusque là, tout reste virtuel, nous n’avons que des descriptions.
La construction est l’étape qui permet de créer un exemplaire particulier. Quand le widget est ajouté à une barre latérale, WordPress déclenche la construction d’un widget « Derniers articles modifiés ». Si on l’ajoute à une autre barre latérale, un nouveau widget est construit.
Chacun aura des caractéristiques communes définies dans les classes « WP_widget » et « wpdf_dam_widget ». Mais ils auront aussi des caractéristiques spécifiques : nombre d’articles à afficher, affichage ou non de la date de publication.
Si on reprend l’exemple de la voiture, nous pourrons créer des modèles avec une carrosserie rouge, bleu…, des motorisations différentes, des couleurs et des textures de siège différentes.

Vérifier que le nouveau widget existe

On peut vérifier que la fonction de constructeur est bien prise en compte en se rendant dans l’administration :

  1. cliquer sur le menu « Apparence »,
  2. cliquer sur le sous-menu « Widgets »
  3. le widget « Dernier articles modifiés » doit faire partie des widgets disponibles
Le nom du nouveau widget s'affiche dans une boîte rectangulaire comme pour les autres widgets
Affichage du nouveau widget dans l’administration
Haut de page

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *