3 points pour une victoire, 1 pour un match nul, 0 pour une défaite : cette formule suffit à calculer un classement de championnat amateur, à condition de disposer d’un moyen fiable de saisir les résultats au fil des rencontres. Pour un club de handball qui gère à peine douze équipes, un logiciel de gestion sportive du commerce coûte souvent bien plus que ce que le budget associatif peut supporter, pour des fonctionnalités qui, dans les faits, resteraient à moitié utilisées.
Ce billet détaille comment répondre à ce besoin avec un type de contenu « match » simple et un bloc dynamique de calcul, sans base de données dédiée ni service de gestion sportive externe. La billetterie des matchs à domicile, gérée séparément par le club, ne fait pas partie de ce périmètre.
Un type de contenu « match », rien de plus
Chaque rencontre se saisit comme une entrée d’un type de contenu personnalisé match, avec trois champs personnalisés simples : équipe adverse, score de l’équipe du club, score de l’équipe adverse.
register_post_type( 'match', array(
'label' => 'Matchs',
'public' => true,
'show_in_rest' => true,
'supports' => array( 'title' ),
) );
La formule de calcul du classement
Le club utilise un barème classique : trois points pour une victoire, un point pour un match nul, zéro pour une défaite. Le bloc dynamique parcourt l’ensemble des matchs enregistrés, additionne les points par équipe, et trie le résultat :
function calculer_classement() {
$matchs = get_posts( array( 'post_type' => 'match', 'numberposts' => -1 ) );
$points = array();
foreach ( $matchs as $match ) {
$score_club = (int) get_post_meta( $match->ID, 'score_club', true );
$score_adverse = (int) get_post_meta( $match->ID, 'score_adverse', true );
$adversaire = get_post_meta( $match->ID, 'equipe_adverse', true );
$points[ $adversaire ] = $points[ $adversaire ] ?? 0;
if ( $score_club > $score_adverse ) {
$points[ $adversaire ] += 0; // défaite de l'adversaire face au club
}
}
// logique complète de comptabilisation omise pour rester lisible ici
arsort( $points );
return $points;
}

Pourquoi recalculer à chaque affichage plutôt que planifier une tâche
Avec une douzaine d’équipes et une trentaine de matchs par saison, le volume de données reste suffisamment faible pour recalculer le classement à chaque affichage de la page, sans mise en cache ni tâche planifiée. Cette simplicité évite un écueil classique : un classement mis en cache qui reste affiché avec un jour de retard après la saisie d’un résultat, ce qui aurait forcément généré des messages de supporters mécontents auprès du secrétariat du club.
Le rendu affiché en tableau
<table>
<thead>
<tr><th>Équipe</th><th>Points</th></tr>
</thead>
<tbody>
<tr><td>Club local</td><td>27</td></tr>
<tr><td>Équipe visiteuse A</td><td>24</td></tr>
</tbody>
</table>
Ce que le secrétariat du club a gagné
- Une saisie de résultat en moins de deux minutes après chaque match, directement depuis un téléphone
- Un classement toujours à jour, sans aucune intervention manuelle de recalcul
- Aucun abonnement supplémentaire à un logiciel de gestion sportive
Les limites de cette approche
Cette solution convient parfaitement à un petit championnat amateur avec un faible volume de matchs. Un club gérant plusieurs centaines de rencontres par saison, sur de nombreuses catégories, aurait intérêt à revoir la stratégie de mise en cache pour éviter de recalculer un classement complet à chaque visite de page.
Avant de proposer un développement sur mesure à une association, on vérifie toujours le volume réel de données à traiter : un recalcul systématique, jugé trop simpliste sur un gros projet, reste parfaitement adapté à un petit club.
En résumé
Un type de contenu simple associé à un bloc dynamique de calcul répond largement au besoin d’un club sportif amateur, sans base de données ni logiciel de gestion coûteux. Cette approche reste limitée par le volume, mais parfaitement adaptée à l’échelle d’un championnat local.