# Le taux de complétion moyen d’un cours affiché sur sa vignette e-learning

> Un pourcentage moyen sur la vignette d'un cours guide le futur apprenant sans jamais exposer la progression individuelle de qui que ce soit.

- Auteur : Clément Hadrot
- Publié le : 2024-02-05
- Mis à jour le : 2024-02-05
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/taux-completion-moyen-cours-vignette-elearning/

## L’essentiel

- Moyenne calculée côté serveur, jamais par apprenant
- Mise en cache pour ne pas alourdir le catalogue
- Seuil minimal avant affichage du chiffre

68 %. C'est le taux de complétion moyen que nous avons fini par afficher sur les vignettes du catalogue d'une plateforme de formation interne, après plusieurs itérations ratées. La première version affichait la progression de la dernière personne connectée par erreur de requête, ce qui avait provoqué un incident de confidentialité mineur mais gênant : un salarié avait vu apparaître le prénom d'un collègue dans le code source d'une page qu'il n'aurait jamais dû consulter.

Le besoin exprimé par l'équipe pédagogique était pourtant simple : donner un signal de confiance sur la vignette d'un cours, avant même que l'apprenant ne clique dessus. Un cours suivi et terminé par la majorité des inscrits rassure davantage qu'une page blanche. Encore fallait-il construire ce chiffre sans jamais exposer, même indirectement, qui a terminé et qui a abandonné.

## Le problème posé par une moyenne mal calculée

Avec LearnDash, la progression d'un apprenant est stockée sous forme de méta-données utilisateur, une par cours suivi. Calculer une moyenne « à la volée » à chaque affichage de vignette signifie interroger cette table pour chaque inscrit du cours, à chaque chargement de la page d'archive des cours. Sur un catalogue de soixante cours et plusieurs milliers d'inscrits cumulés, cela représentait des centaines de requêtes supplémentaires par visite, visibles immédiatement dans Query Monitor.

Deuxième problème, plus insidieux : si le cours ne compte que deux ou trois inscrits, afficher « 100 % de complétion » ou « 0 % » revient à révéler la situation exacte d'une personne précise. Ce n'est pas une fuite de données au sens strict, mais c'est un manque de tact qui peut braquer une petite équipe.

## La recette : une moyenne pré-calculée avec seuil de confidentialité

> L'essentiel à retenir : Moyenne calculée côté serveur, jamais par apprenant ; Mise en cache pour ne pas alourdir le catalogue ; Seuil minimal avant affichage du chiffre

La solution retenue combine trois ingrédients : un calcul en tâche de fond, un stockage en meta de cours, et un seuil minimal d'inscrits avant affichage.

```
function agence_calculer_taux_completion_cours( int $course_id ) : ?float {
    $users = learndash_get_users_for_course( $course_id );
    $ids   = $users->get_results();

    if ( count( $ids ) < 15 ) {
        return null; // pas assez d'inscrits pour un chiffre pertinent
    }

    $termines = 0;
    foreach ( $ids as $user_id ) {
        if ( learndash_course_completed( $user_id, $course_id ) ) {
            $termines++;
        }
    }

    $taux = round( ( $termines / count( $ids ) ) * 100 );
    update_post_meta( $course_id, '_agence_taux_completion', $taux );

    return $taux;
}
```

Cette fonction ne tourne jamais au moment de l'affichage. Elle est accrochée à un événement WP-Cron quotidien, planifié via `wp_schedule_event`, qui parcourt l'ensemble des cours publiés et met à jour la meta `_agence_taux_completion`. La vignette du cours se contente ensuite de lire cette valeur déjà calculée :

```
$taux = get_post_meta( get_the_ID(), '_agence_taux_completion', true );

if ( '' !== $taux ) {
    echo '<span class="taux-completion">' . esc_html( $taux ) . ' % des apprenants terminent ce cours</span>';
}
```

## Pourquoi le seuil de quinze inscrits n'est pas arbitraire

Le nombre quinze est né d'une discussion avec l'équipe pédagogique, pas d'une formule magique. En dessous de ce seuil, un taux de complétion de 33 % ou 66 % permet de reconstituer trop facilement qui a terminé sur un petit effectif. Au-delà de quinze inscrits, la moyenne devient suffisamment lissée pour ne plus rien dire d'une personne en particulier, tout en restant un indicateur honnête de la qualité perçue du cours.

- Sous quinze inscrits : aucune vignette n'affiche de chiffre, remplacée par une simple mention « Cours récent ».
- Entre quinze et cinquante inscrits : le taux est arrondi à la dizaine la plus proche pour brouiller davantage les cas limites.
- Au-delà de cinquante inscrits : le taux exact, arrondi à l'unité, est affiché sans précaution supplémentaire.

## Variantes selon le contexte

Sur un site utilisant Tutor LMS plutôt que LearnDash, la logique reste identique mais s'appuie sur `tutor_utils()->get_course_completed_percent()`, qui renvoie déjà un pourcentage par apprenant : il suffit alors d'agréger ces valeurs plutôt que de recalculer une complétion booléenne cours par cours.

Une autre variante, demandée par un second client dans le secteur associatif, consistait à afficher non pas un taux de complétion mais un taux de satisfaction moyen issu d'un questionnaire de fin de cours. Le principe de seuil minimal et de calcul différé reste rigoureusement le même, seule la source de la donnée change.

> Un chiffre agrégé n'est acceptable au regard de la confidentialité que s'il reste impossible à inverser pour retrouver un individu. C'est la règle que nous appliquons désormais à toute vignette statistique, quel que soit le module concerné.

## Pour aller plus loin

Cette approche se généralise facilement à d'autres indicateurs sensibles : taux d'ouverture moyen d'une newsletter par segment, note moyenne d'un produit avant qu'il n'ait reçu suffisamment d'avis, ou encore ancienneté moyenne des membres d'un groupe privé. Dans tous les cas, la même discipline s'applique : calculer en tâche de fond, stocker une valeur agrégée, et fixer un seuil minimal en dessous duquel on préfère ne rien montrer plutôt que d'exposer un cas particulier.
