Comment WooCommerce stocke les informations d’une commande order ?
WooCommerce permet de stocker les éléments de chaque commande en tant qu’order_item, c’est à dire que chaque ligne constituant la facture d’une commande sera stockée dans la table woocommerce_order_items (voir ici les infos concernant les tables WooCommerce)
Un exemple concret avec une commande WooCommerce
Exemple concret pour une commande, la commande 10720. Cette commande est assez complète car compte 3 produits, des frais, des informations de livraison, de tva, ainsi qu’un réduction utilisée via un coupon de réduction (-10% sur la commande)
On sait donc que cette commande est composée de tous les order_items correspondant à l’id de cette commande (order) à savoir 10720.
Chaque ligne de cette commande a des informations spécifiques, qui sont stockées dans la table woocommerce_order_itemmeta en tant que order_item-meta, et pour retrouver ces infos on utilise le order_item_id
Concrètement, voici les informations concernant la 1ère ligne de cette commande (285)
Une subtilité intéressante est « _line_subtotal » qui représente le total de la ligne de facturation (qté * prix) AVANT remise alors que « _line_total » représente la ligne APRÈS remise.
Les autres lignes produit ont le même type d’infos, voici celle concernant la livraison (289)
En résumé, les méta de order_item contiennent des infos très intéressantes dont vous pouvez avoir besoin, et nous allons voir comment les obtenir en php
Comment obtenir les données order_item_meta de WooCommerce
Cela est possible via la fonction wc_get_order_item_meta qui prend plusieurs paramètres :
- l’id de l’order_item
- la clé méta voulue
- si la valeur est unique (default: true))
global $post; $order = wc_get_order( $post->ID ); $items = $order->get_items(); foreach ($items as $item_id => $item ) { // On récupère ici la order meta dont on a besoin $custom_field = wc_get_order_item_meta( $item_id, '_tmcartepo_data', true ); // Pour tester vous pouvez décommenter la ligne ci dessous // print_r($custom_field); // si on récupère un tableau ... if( is_array( $custom_field ) ){ echo implode( '<br>', $custom_field ); // one value displayed by line } // ... ou si c'est juste une chaîne else { echo $custom_field; } }