Le WordPress d'aujourd'hui, décodé pour les développeurs

Elementor

PHP 8.3 et Elementor : les warnings à corriger sur vos widgets personnalisés

Message d'erreur précis rencontré sur un widget maison utilisant une syntaxe désormais dépréciée après une montée vers PHP 8.3.

Par WordPress Développement • 21 janvier 2024 • 4 min de lecture • Aucun commentaire
PHP 8.3 et Elementor : les warnings à corriger sur vos widgets personnalisés

Deprecated: Implicit conversion from float-string "3.5" to int loses precision in /wp-content/plugins/widgets-maison/widget-notation.php on line 58. Ce message est apparu dans les logs juste après une montée de version vers PHP 8.3 sur un environnement de recette, sur un widget Elementor personnalisé affichant une note moyenne sous forme d’étoiles.

PHP 8.3 resserre encore la vérification des conversions de type implicites héritées de versions plus anciennes du langage. Une valeur transmise sous forme de chaîne contenant un nombre décimal, convertie silencieusement en entier lors d’une opération arithmétique, déclenche désormais un avertissement explicite plutôt qu’une conversion muette.

Localiser le widget concerné

Sur ce parc de douze widgets personnalisés, deux étaient concernés par ce type d’avertissement : le widget de notation par étoiles décrit ici, et un widget de compte à rebours qui manipulait des durées sous forme de chaînes issues d’un champ personnalisé ACF. Les logs de l’environnement de recette, avec WP_DEBUG_LOG activé, ont suffi à localiser précisément les deux fichiers en cause.

Le code fautif du widget de notation

class Widget_Notation extends \Elementor\Widget_Base {

    protected function render() {
        $settings = $this->get_settings_for_display();
        $note = $settings['note_moyenne']; // ex. "3.5" (chaîne issue d'un champ texte)

        $nombre_etoiles_pleines = $note % 1;
        // Deprecated: Implicit conversion from float-string "3.5" to int loses precision
    }
}

Le contrôle Elementor associé à ce réglage était de type TEXT plutôt que NUMBER, ce qui explique pourquoi la valeur arrivait sous forme de chaîne. L’opérateur modulo (%) attend un entier, et PHP tentait jusqu’ici une conversion implicite silencieuse d’une chaîne décimale vers un entier, en perdant la partie décimale sans prévenir. PHP 8.3 signale désormais explicitement cette perte de précision.

Le correctif : typer explicitement avant tout calcul

L'essentiel à retenir : Warning localisé à une conversion implicite de type ; Cause liée à une comparaison lâche entre chaîne et entier ; Correctif par typage strict des paramètres du widget
class Widget_Notation extends \Elementor\Widget_Base {

    protected function render() {
        $settings = $this->get_settings_for_display();
        $note = (float) ($settings['note_moyenne'] ?? 0);

        $nombre_etoiles_pleines = (int) floor($note);
        $demi_etoile = ($note - $nombre_etoiles_pleines) >= 0.5;
    }
}

Le correctif convertit explicitement la valeur en nombre flottant dès sa lecture, puis utilise floor() pour obtenir la partie entière plutôt que l’opérateur modulo, mal adapté ici. Cette approche élimine l’avertissement tout en corrigeant, au passage, un calcul de demi-étoile qui était légèrement approximatif dans la version d’origine.

Revoir aussi le contrôle du panneau Elementor

Au-delà du correctif ponctuel, le contrôle Elementor lui-même a été modifié pour utiliser Controls_Manager::NUMBER avec un pas de 0.5 plutôt qu’un champ texte libre, ce qui garantit désormais une valeur numérique cohérente dès la saisie dans l’éditeur, sans dépendre uniquement d’une conversion défensive côté rendu.

$this->add_control('note_moyenne', [
    'label' => 'Note moyenne',
    'type' => \Elementor\Controls_Manager::NUMBER,
    'min' => 0,
    'max' => 5,
    'step' => 0.5,
    'default' => 4.5,
]);

Méthode appliquée aux dix autres widgets

  • Recherche systématique des opérations arithmétiques (%, /, *) sur des valeurs issues de get_settings_for_display()
  • Vérification du type de contrôle Elementor déclaré pour chaque champ concerné
  • Ajout d’un cast explicite ((int), (float)) avant tout calcul, même quand le type du contrôle semble cohérent
  • Rejeu complet des tests de recette sur PHP 8.3 avant validation

Ce que cet article ne couvre pas

D’autres dépréciations existent en PHP 8.3, notamment autour de certaines fonctions de date et de sérialisation, sans lien avec ce cas précis. La migration des extensions tierces non maintenues en interne suit un calendrier propre à chaque éditeur et sort du périmètre de cet article, centré sur du code de widgets internes.

Un avertissement de conversion implicite n’est jamais un faux positif : il signale une perte d’information réelle, même quand le résultat semblait visuellement correct jusque-là.

En résumé

La montée vers PHP 8.3 a permis de repérer un calcul de demi-étoile légèrement erroné, invisible à l’œil nu mais bien réel dans les données. Corriger le typage à la source, aussi bien côté contrôle Elementor que côté code de rendu, reste la meilleure protection contre ce type d’avertissement à chaque nouvelle version de PHP.

Laisser un commentaire

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

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi