Comment repérer, parmi cent-cinquante cours d’une plateforme e-learning, les dix qui perdent le plus d’apprenants en cours de route ? Avant cette évolution, la seule réponse possible consistait à ouvrir chaque fiche cours une par une pour consulter son taux de complétion — une méthode qui décourageait précisément le suivi qu’elle était censée permettre.
La plateforme stockait déjà, pour chaque inscription à un cours, un pourcentage de progression en champ personnalisé sur le CPT inscription_cours. Il ne restait qu’à agréger cette donnée existante et l’exposer directement dans la liste d’administration des cours, sous forme de colonne triable — sans toucher au calcul de progression lui-même, déjà en place.
Étape 1 : ajouter la colonne à la liste des cours
Le hook manage_{post_type}_posts_columns permet d’insérer une colonne personnalisée dans la liste d’administration d’un CPT, ici juste après la colonne du titre :
function wpm_colonne_completion( $colonnes ) {
$nouvelles = array();
foreach ( $colonnes as $cle => $libelle ) {
$nouvelles[ $cle ] = $libelle;
if ( 'title' === $cle ) {
$nouvelles['completion_moyenne'] = 'Complétion moyenne';
}
}
return $nouvelles;
}
add_filter( 'manage_cours_posts_columns', 'wpm_colonne_completion' );
Étape 2 : calculer et afficher la valeur

function wpm_afficher_completion( $colonne, $post_id ) {
if ( 'completion_moyenne' !== $colonne ) {
return;
}
$inscriptions = get_posts( array(
'post_type' => 'inscription_cours',
'posts_per_page' => -1,
'meta_query' => array(
array( 'key' => 'cours_id', 'value' => $post_id ),
),
) );
if ( empty( $inscriptions ) ) {
echo '—';
return;
}
$total = 0;
foreach ( $inscriptions as $inscription ) {
$total += (int) get_post_meta( $inscription->ID, 'progression', true );
}
$moyenne = round( $total / count( $inscriptions ) );
update_post_meta( $post_id, 'completion_moyenne_cache', $moyenne );
echo $moyenne . ' %';
}
add_action( 'manage_cours_posts_custom_column', 'wpm_afficher_completion', 10, 2 );
Le calcul stocke volontairement son résultat dans un champ completion_moyenne_cache, réutilisé à l’étape suivante pour permettre le tri sans recalculer la moyenne de chaque cours à chaque clic sur l’en-tête de colonne.
Étape 3 : rendre la colonne triable
Deux hooks supplémentaires suffisent à activer le tri, en s’appuyant sur le champ mis en cache plutôt que sur un calcul à la volée :
add_filter( 'manage_edit-cours_sortable_columns', function( $colonnes ) {
$colonnes['completion_moyenne'] = 'completion_moyenne';
return $colonnes;
} );
add_action( 'pre_get_posts', function( $query ) {
if ( ! is_admin() || 'completion_moyenne' !== $query->get( 'orderby' ) ) {
return;
}
$query->set( 'meta_key', 'completion_moyenne_cache' );
$query->set( 'orderby', 'meta_value_num' );
} );
Étape 4 : rafraîchir le cache régulièrement
La moyenne mise en cache ne se met à jour qu’à l’affichage de la liste des cours — ce qui suffit largement pour un usage de suivi hebdomadaire par l’équipe pédagogique. Un rafraîchissement plus systématique, déclenché à chaque mise à jour de progression d’un apprenant, resterait possible mais nettement plus coûteux en requêtes pour un bénéfice marginal sur ce cas d’usage précis.
- Cache recalculé à chaque affichage de la liste d’administration
- Tri fiable, basé sur une valeur stockée plutôt que recalculée à chaque clic
- Aucune modification du calcul de progression individuel des apprenants
Ajouter un repère visuel sur les valeurs critiques
Un simple pourcentage affiché dans une colonne reste facile à ignorer au milieu d’une longue liste. Une petite adaptation a consisté à colorer le texte en orange lorsque la moyenne de complétion descend sous 40 %, directement dans la fonction d’affichage de la colonne, sans dépendance à une bibliothèque graphique externe. Ce repère minimal a suffi à ce que l’équipe pédagogique remarque d’un coup d’œil les cours qui méritaient une attention particulière, sans avoir à trier systématiquement la liste à chaque visite.
En résumé
Trois hooks natifs de colonnes d’administration — ajout, affichage, tri — suffisent à transformer une donnée déjà stockée en outil de pilotage exploitable par l’équipe pédagogique, sans reconstruire le système de suivi de progression existant.