# Un connecteur d’affiliation maison, sans plugin de tracking généraliste

> Une extension minimale enregistre un identifiant de parrainage en cookie de première partie et l'associe à la commande finale, sans dépendance lourde.

- Auteur : Clément Hadrot
- Publié le : 2025-06-05
- Mis à jour le : 2025-06-05
- Catégorie : Extensions
- URL : https://wpmoderne.dev.wordpress-developpement.fr/extensions/connecteur-affiliation-maison-sans-plugin-tracking/

## L’essentiel

- Un identifiant de parrainage se lit dans l'URL et se stocke en cookie de première partie
- L'association à la commande se fait au moment de la validation, pas avant
- Une table dédiée reste préférable à une métadonnée de commande pour l'historique

Combien de temps un lien de parrainage doit-il rester valable après le premier clic ? Cette question, posée par une coopérative d'artisans qui souhaitait récompenser ses membres parrainant de nouveaux clients, a servi de point de départ à une extension minimale, construite sans plugin de tracking généraliste et sans dépendance à un service d'affiliation externe.

Ce tutoriel construit, étape par étape, un connecteur d'affiliation simple : capture de l'identifiant de parrainage dans l'URL, stockage en cookie de première partie, puis association à la commande finale au moment de sa validation. Le calcul des commissions elles-mêmes reste hors du périmètre de cet article, volontairement, car il dépend trop du barème propre à chaque organisation.

## Étape 1 : capturer l'identifiant de parrainage dans l'URL

Un lien de parrainage prend la forme `https://exemple.fr/boutique/?parrain=ART-1204`. Il faut intercepter ce paramètre dès qu'un visiteur arrive avec cette URL, avant qu'il ne navigue ailleurs sur le site et ne le perde.

```
add_action( 'init', 'parrainage_capturer_identifiant' );

function parrainage_capturer_identifiant() {
    if ( empty( $_GET['parrain'] ) ) {
        return;
    }

    $identifiant = sanitize_text_field( wp_unslash( $_GET['parrain'] ) );

    if ( ! preg_match( '/^[A-Z0-9\-]{3,20}$/', $identifiant ) ) {
        return; // format inattendu, on ignore plutôt que de stocker une donnée douteuse
    }

    setcookie(
        'parrainage_id',
        $identifiant,
        time() + ( 30 * DAY_IN_SECONDS ),
        COOKIEPATH,
        COOKIE_DOMAIN,
        is_ssl(),
        true // httponly
    );
}
```

Le cookie est déposé en première partie, directement par le domaine du site, ce qui évite les restrictions de plus en plus strictes appliquées par les navigateurs aux cookies tiers. La durée de trente jours correspond à une fenêtre d'attribution raisonnable pour un parcours d'achat qui ne se conclut pas toujours au premier passage.

## Étape 2 : associer l'identifiant à la commande au moment de sa validation

> L'essentiel à retenir : Un identifiant de parrainage se lit dans l'URL et se stocke en cookie de première partie ; L'association à la commande se fait au moment de la validation, pas avant ; Une table dédiée reste préférable à une métadonnée de commande pour l'historique

L'association ne doit pas se faire trop tôt : un visiteur qui clique sur un lien de parrainage n'a pas encore de commande, et il serait risqué de créer une association avant que l'achat ne soit réellement confirmé. Le hook `woocommerce_checkout_order_processed` constitue un point d'ancrage fiable pour capturer cette information au bon moment.

```
add_action( 'woocommerce_checkout_order_processed', 'parrainage_associer_commande' );

function parrainage_associer_commande( $order_id ) {
    if ( empty( $_COOKIE['parrainage_id'] ) ) {
        return;
    }

    $identifiant = sanitize_text_field( wp_unslash( $_COOKIE['parrainage_id'] ) );

    global $wpdb;

    $wpdb->insert(
        $wpdb->prefix . 'parrainage_associations',
        array(
            'commande_id'   => $order_id,
            'parrain_id'    => $identifiant,
            'associee_le'   => current_time( 'mysql' ),
        )
    );
}
```

## Étape 3 : privilégier une table dédiée plutôt qu'une métadonnée de commande

Stocker l'identifiant de parrainage directement en métadonnée de commande, via `update_post_meta()` ou son équivalent pour les commandes stockées en HPOS, fonctionnerait aussi. Mais une table dédiée présente un avantage concret dès que le volume de commandes grandit : elle permet d'interroger facilement l'historique complet d'un parrain, sans devoir parcourir l'ensemble des commandes pour retrouver celles qui lui sont associées.

```
CREATE TABLE {$wpdb->prefix}parrainage_associations (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    commande_id BIGINT UNSIGNED NOT NULL,
    parrain_id VARCHAR(20) NOT NULL,
    associee_le DATETIME NOT NULL,
    PRIMARY KEY (id),
    KEY parrain_id (parrain_id)
) {$charset_collate};
```

## Étape 4 : afficher un tableau de bord minimal au parrain

Une fois les associations stockées, un tableau de bord simple, accessible depuis l'espace membre de la coopérative, peut lister les commandes rattachées à un identifiant de parrainage donné, sans révéler d'informations personnelles sur l'acheteur au-delà du strict nécessaire.

1. Requêter la table d'associations filtrée par identifiant de parrain connecté.
2. Afficher uniquement le nombre de commandes et leur date, jamais le détail du panier ni les coordonnées de l'acheteur.
3. Renvoyer le calcul de commission à un traitement séparé, distinct de ce connecteur de tracking.

## Ce qu'il faut éviter

- Ne jamais stocker l'identifiant de parrainage dans le panier lui-même : un panier abandonné puis repris plus tard pourrait porter une information obsolète.
- Ne pas écraser un identifiant déjà présent en cookie par un nouveau clic, sauf si la politique de la coopérative prévoit explicitement une règle de « dernier clic gagnant ».
- Valider strictement le format de l'identifiant reçu en paramètre d'URL avant tout stockage, pour éviter d'y injecter une valeur inattendue.

> Un tracking d'affiliation maison n'a pas besoin d'être sophistiqué pour être fiable : un cookie de première partie bien scellé et une table d'associations claire suffisent dans la grande majorité des cas.

## En résumé

Ce connecteur minimal répond à un besoin précis sans complexité inutile : capturer, stocker temporairement, puis associer de façon durable un identifiant de parrainage à une commande validée. Le calcul des commissions, qui varie d'une organisation à l'autre, reste volontairement un sujet distinct.
