# Mettre en place un programme de points de fidélité WooCommerce maison

> Recette complète pour construire un système de points de fidélité sur WooCommerce sans dépendre d'une extension propriétaire, du calcul à la conversion en réduction.

- Auteur : Clément Hadrot
- Publié le : 2024-05-27
- Mis à jour le : 2024-05-27
- Catégorie : E-commerce
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ecommerce/programme-fidelite-points-woocommerce-maison/

## L’essentiel

- Un solde de points stocké en métadonnée utilisateur
- Un taux de conversion configurable en une constante
- Une conversion en coupon généré à la volée

« 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();
}
```

> L'essentiel à retenir : Un solde de points stocké en métadonnée utilisateur ; Un taux de conversion configurable en une constante ; Une conversion en coupon généré à la volée

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