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

- Auteur : WordPress Développement
- Publié le : 2024-01-21
- Mis à jour le : 2024-01-21
- Catégorie : Elementor
- URL : https://www.wpmoderne.fr/elementor/php-83-elementor-widgets-personnalises-warnings/

## L’essentiel

- 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

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