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

E-commerce

« Uncaught Error: Call to a member function get_total() on bool » sur une commande supprimée

Ce fatal error surgit toujours au pire moment : un rapport ou un webhook suppose qu'une commande existe encore, alors qu'elle a été supprimée entre-temps.

Par WordPress Développement • 5 mars 2023 • 4 min de lecture • Aucun commentaire
« Uncaught Error: Call to a member function get_total() on bool » sur une commande supprimée

Uncaught Error: Call to a member function get_total() on bool : ce message, remonté dans les journaux d’erreur PHP, indique une chose précise et souvent mal comprise au premier regard : quelque part dans le code, une variable censée contenir un objet WC_Order contient en réalité la valeur booléenne false, et une méthode a été appelée dessus sans vérification préalable.

Symptôme : un fatal qui survient de façon imprévisible

Ce type d’erreur a la particularité de ne jamais se manifester de façon systématique. Elle apparaît lors du traitement d’un webhook différé, d’un rapport planifié exécuté la nuit, ou d’un export qui parcourt un lot d’identifiants de commande collectés plus tôt. Le point commun à ces trois cas : un identifiant de commande a été mémorisé à un instant donné, puis réutilisé plus tard, après que la commande correspondante a été supprimée entre-temps.

Diagnostic : localiser l’appel fautif

L'essentiel à retenir : wc_get_order() renvoie false si la commande n'existe plus, jamais une exception ; Chaque appel doit vérifier ce retour avant d'appeler une méthode ; Un identifiant de commande obsolète survit souvent dans un cache ou une file de tâches

La fonction wc_get_order( $id ) constitue le point d’entrée standard pour récupérer un objet commande à partir de son identifiant. Son comportement est documenté et sans ambiguïté : si aucune commande ne correspond à l’identifiant fourni, elle renvoie false, jamais une exception, et jamais un objet vide qui accepterait silencieusement un appel de méthode.

$commande = wc_get_order( $id_commande );
$total = $commande->get_total(); // fatal si $commande vaut false

Le diagnostic consiste donc à remonter, dans la pile d’appels fournie par le message d’erreur, jusqu’au premier endroit où wc_get_order() est appelée sans que son retour ne soit vérifié avant l’appel de méthode suivant. Sur le cas traité, l’origine se trouvait dans un rapport planifié qui conservait une liste d’identifiants de commande collectée la veille, sans anticiper qu’une commande de test aurait entre-temps été supprimée manuellement par un administrateur.

Correctif : vérifier systématiquement le retour

$commande = wc_get_order( $id_commande );

if ( ! $commande instanceof WC_Order ) {
    continue; // ou journaliser l'identifiant orphelin, selon le contexte
}

$total = $commande->get_total();

La vérification instanceof WC_Order plutôt qu’un simple test de vérité booléenne présente un avantage supplémentaire : elle couvre également le cas, plus rare mais réel, où wc_get_order() renverrait un objet d’un autre type selon la configuration du site, par exemple lors d’une migration en cours entre deux modes de stockage des commandes.

Prévention : ne jamais faire confiance à un identifiant mémorisé

Au-delà du correctif ponctuel, ce type d’incident pointe un problème d’architecture plus large : dès qu’un identifiant de commande est mémorisé pour un traitement différé, que ce soit dans une option, un fichier temporaire, ou une file de tâches planifiées, il faut considérer que la commande correspondante peut avoir disparu au moment du traitement effectif.

  • Toujours vérifier le retour de wc_get_order() avant tout appel de méthode, sans exception.
  • Pour un traitement en lot, journaliser les identifiants orphelins plutôt que de les ignorer silencieusement, afin de détecter une suppression anormale de commandes.
  • Éviter de conserver des identifiants de commande sur une durée longue sans mécanisme de nettoyage : plus le délai entre collecte et traitement est long, plus le risque de commande supprimée entre-temps augmente.

Un appel à wc_get_order() sans vérification du retour est, à mes yeux, le même genre d’oubli qu’un accès à un tableau sans vérifier isset() au préalable : anodin en apparence, fatal en production dès que le contexte change.

Ce que ce correctif ne traite pas

Ce billet ne couvre pas la question de la restauration d’une commande supprimée par erreur : une fois une commande réellement effacée de la base, sans passage par la corbeille, elle reste perdue, sauf sauvegarde de base de données antérieure à la suppression. Le sujet ici se limite à éviter que cette suppression, légitime ou non, ne provoque un fatal error ailleurs dans le code.

En résumé

Ce fatal error, en apparence obscur, se résout toujours de la même façon : vérifier que wc_get_order() a bien renvoyé un objet commande avant d’appeler une méthode dessus. La vraie leçon dépasse ce correctif ponctuel : tout identifiant de commande conservé pour un traitement différé doit être traité comme potentiellement obsolète au moment de son utilisation réelle.

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