« Café Numérique », torréfacteur en ligne, voulait récompenser ses clients réguliers sans payer un abonnement mensuel à une extension de fidélité tierce, jugé disproportionné pour son volume de ventes. Le besoin réel tenait en trois lignes : un point gagné pour chaque tranche de dépense, un solde visible dans l’espace client, et la possibilité de convertir ces points en réduction sur une commande future.
Ce genre de demande revient régulièrement chez les petites boutiques qui veulent fidéliser sans s’engager dans un abonnement supplémentaire à vie. La bonne nouvelle : WooCommerce fournit déjà tous les points d’accroche nécessaires, sous forme de hooks natifs, pour construire ce système en quelques dizaines de lignes maison.
Problème : où stocker le solde de points ?
Le choix le plus simple et le plus robuste consiste à stocker le solde directement en métadonnée utilisateur, via update_user_meta(), plutôt que dans une table personnalisée. Pour un volume de quelques milliers de clients, la métadonnée utilisateur reste largement suffisante et évite d’avoir à gérer une migration de base de données pour un besoin aussi simple.
Snippet commenté : attribuer les points à la commande
Les points sont attribués au passage de la commande au statut terminée, plutôt qu’à la validation du paiement, pour éviter d’attribuer des points sur une commande finalement annulée ou remboursée avant expédition :
define( 'CN_TAUX_POINTS', 10 ); // 1 point tous les 10 euros
add_action( 'woocommerce_order_status_completed', 'cn_attribuer_points_fidelite' );
function cn_attribuer_points_fidelite( $order_id ) {
$order = wc_get_order( $order_id );
$user_id = $order->get_customer_id();
if ( ! $user_id || $order->get_meta( '_cn_points_attribues' ) ) {
return; // pas de compte client, ou points déjà attribués
}
$points_gagnes = floor( $order->get_total() / CN_TAUX_POINTS );
$solde_actuel = (int) get_user_meta( $user_id, 'cn_solde_points', true );
update_user_meta( $user_id, 'cn_solde_points', $solde_actuel + $points_gagnes );
$order->update_meta_data( '_cn_points_attribues', 1 );
$order->save();
}

Snippet commenté : convertir les points en coupon
La conversion des points ne modifie pas directement le tunnel de commande : elle génère un coupon WooCommerce à usage unique via wc_create_new_coupon(), réutilisant ainsi tout le moteur de réduction déjà présent, avec ses propres règles d’expiration et de non-cumul, sans réinventer de logique de calcul de remise.
function cn_convertir_points_en_coupon( $user_id, $points_a_utiliser ) {
$solde = (int) get_user_meta( $user_id, 'cn_solde_points', true );
if ( $points_a_utiliser > $solde || $points_a_utiliser < 100 ) {
return new WP_Error( 'points_insuffisants', 'Solde insuffisant ou minimum non atteint.' );
}
$montant_remise = $points_a_utiliser * 0.08; // 1 point = 0,08 EUR
$code = 'FIDELITE-' . strtoupper( wp_generate_password( 6, false ) );
$coupon = array(
'post_title' => $code,
'post_status' => 'publish',
'post_type' => 'shop_coupon',
);
$coupon_id = wp_insert_post( $coupon );
update_post_meta( $coupon_id, 'discount_type', 'fixed_cart' );
update_post_meta( $coupon_id, 'coupon_amount', $montant_remise );
update_post_meta( $coupon_id, 'usage_limit', 1 );
update_post_meta( $coupon_id, 'customer_email', array( wp_get_current_user()->user_email ) );
update_user_meta( $user_id, 'cn_solde_points', $solde - $points_a_utiliser );
return $code;
}
Afficher le solde dans l’espace client
Un onglet personnalisé, ajouté au menu du compte via le filtre woocommerce_account_menu_items et un point d’entrée déclaré avec add_rewrite_endpoint, affiche le solde courant et un petit formulaire de conversion. C’est un ajout léger qui rend le programme visible sans complexifier le reste du site.
- Affichage du solde en points et de son équivalent en euros
- Formulaire de conversion avec un minimum de 100 points imposé
- Historique des coupons de fidélité déjà générés
Variantes possibles
Ce squelette peut évoluer facilement : un multiplicateur de points pendant une opération commerciale ponctuelle, un bonus de points à l’inscription, ou une expiration des points après douze mois d’inactivité, implémentée via une tâche planifiée WP-Cron qui parcourt les métadonnées utilisateur les plus anciennes.
Un programme de fidélité maison n’a pas besoin d’être sophistiqué pour être efficace : il doit surtout être visible et simple à comprendre pour le client, deux qualités qu’une extension trop riche en options finit parfois par diluer.
Pour aller plus loin
Cette approche maison convient tant que le volume de clients reste raisonnable et que les règles de fidélité restent simples. Au-delà de quelques dizaines de milliers de comptes ou de règles de calcul plus fines par catégorie de produit, une table personnalisée dédiée aux mouvements de points, plutôt qu’une simple métadonnée utilisateur, devient préférable pour garder un historique auditable des gains et des dépenses.