Douze mille entrées dans la table wp_posts pour le seul type tribe_events, dont plus des trois quarts concernaient des dates révolues depuis longtemps. C’est le chiffre relevé lors d’un audit mené sur le site d’une salle de spectacle, dont la page d’agenda affichait un temps de génération qui avait doublé en deux saisons sans qu’aucune extension n’ait été ajoutée entre-temps.
The Events Calendar, le plugin d’agenda le plus utilisé sur WordPress pour ce type de structure, gère très bien un volume raisonnable d’événements. Le problème ne vient pas du plugin lui-même, mais de l’absence de politique de purge : chaque nouvelle saison ajoute ses dates sans que les anciennes soient jamais retirées de la circulation.
Symptôme : une page qui s’alourdit saison après saison
Le signal d’alerte est progressif, ce qui le rend difficile à repérer : la page d’agenda ne devient pas subitement lente, elle perd quelques dixièmes de seconde à chaque nouvelle saison de programmation. Au bout de deux ou trois ans d’exploitation, le temps de génération peut avoir été multiplié par cinq ou six sans qu’aucun incident isolé n’ait déclenché d’investigation.
Sur le site étudié, le tableau de bord Query Monitor affichait une requête principale portant sur plus de dix mille lignes, alors que la page n’affichait jamais que les huit prochains événements à venir. Le filtre de date fonctionnait bien côté affichage, mais la requête sous-jacente continuait d’explorer l’intégralité de la table.
Diagnostic : une requête WP_Query sans limite raisonnable sur l’historique
En creusant le code du thème, la cause apparaît : une requête personnalisée construite autour de WP_Query pour afficher un widget « événements passés » dans la barre latérale, sans argument posts_per_page explicite ni bornage de date. MySQL devait donc trier l’ensemble des événements historiques avant de n’en retourner qu’une poignée.

Correctif : archiver plutôt que garder tout en ligne
La solution retenue combine deux actions. D’abord, corriger la requête fautive en ajoutant une borne de date et une limite explicite :
$query = new WP_Query( array(
'post_type' => 'tribe_events',
'posts_per_page' => 6,
'meta_key' => '_EventStartDate',
'meta_value' => date( 'Y-m-d H:i:s' ),
'meta_compare' => '<',
'orderby' => 'meta_value',
'order' => 'DESC',
'no_found_rows' => true,
) );
Ensuite, mettre en place un archivage régulier des événements dont la date est passée depuis plus d’un an : leur statut passe de publish à un statut personnalisé archive, ce qui les retire des requêtes standards du plugin sans supprimer l’historique.
- Un événement conserve son contenu et ses métadonnées après archivage
- Les requêtes de la page d’accueil et de l’agenda excluent le statut
archivepar défaut - Un export CSV annuel garde une trace lisible pour les besoins de communication
Prévention : un nettoyage périodique plutôt qu’une intervention ponctuelle
Un correctif isolé ne suffit pas si rien ne surveille l’accumulation à venir. La bonne pratique consiste à programmer une tâche récurrente avec wp_schedule_event, exécutée une fois par mois, qui bascule automatiquement les événements dépassés vers le statut d’archive.
if ( ! wp_next_scheduled( 'wpmoderne_archive_evenements' ) ) {
wp_schedule_event( time(), 'monthly', 'wpmoderne_archive_evenements' );
}
add_action( 'wpmoderne_archive_evenements', function () {
$anciens = get_posts( array(
'post_type' => 'tribe_events',
'posts_per_page' => 200,
'meta_key' => '_EventEndDate',
'meta_value' => date( 'Y-m-d H:i:s', strtotime( '-1 year' ) ),
'meta_compare' => '<',
'fields' => 'ids',
) );
foreach ( $anciens as $id ) {
wp_update_post( array( 'ID' => $id, 'post_status' => 'archive' ) );
}
} );
Sur un agenda vivant, la meilleure protection reste la même que pour une cave à vin : ce qui n’est plus consommé doit être rangé ailleurs, pas empilé devant la porte.
En résumé
Le ralentissement progressif d’une page d’agenda culturel n’est presque jamais dû à une panne isolée : il vient d’une accumulation silencieuse que personne n’a pensé à borner. Corriger la requête fautive redonne un gain immédiat, mais seule une purge périodique programmée évite de revivre le même scénario deux saisons plus tard.
Ce billet ne couvre volontairement pas l’affichage front de l’agenda ni le choix des gabarits de templates : le sujet mérite un traitement séparé, tant les options de personnalisation de The Events Calendar sont nombreuses.