Un SMS de rappel facturé à l’unité par une plateforme de téléphonie coûte quelques centimes ; un email de rappel programmé avec WP-Cron ne coûte rien de plus que quelques lignes de code et une bonne compréhension de la planification différée de WordPress. C’est cette deuxième option qu’un cabinet médical utilisant WordPress pour la prise de rendez-vous en ligne — sans extension de rendez-vous complète, seulement un CPT « rendez-vous » créé sur mesure — a choisi de mettre en place.
Le besoin restait ciblé : envoyer un email de rappel exactement trois jours avant chaque rendez-vous, sans queue d’envoi complexe, sans tableau de bord de notifications, et surtout sans dépendre d’un module de prise de rendez-vous complet qui aurait imposé de migrer tout le système existant.
Programmer un événement Cron à la création du rendez-vous
Chaque rendez-vous, enregistré comme article du CPT rendez_vous avec un champ personnalisé date_rdv, déclenche à sa création la programmation d’un événement Cron unique, planifié précisément trois jours avant la date du rendez-vous :
function wpm_programmer_rappel( $post_id, $post ) {
if ( 'rendez_vous' !== $post->post_type || 'publish' !== $post->post_status ) {
return;
}
$date_rdv = get_post_meta( $post_id, 'date_rdv', true );
$timestamp_rdv = strtotime( $date_rdv );
$timestamp_rappel = $timestamp_rdv - ( 3 * DAY_IN_SECONDS );
if ( $timestamp_rappel > time() ) {
wp_schedule_single_event( $timestamp_rappel, 'wpm_envoyer_rappel_rdv', array( $post_id ) );
}
}
add_action( 'save_post', 'wpm_programmer_rappel', 10, 2 );
wp_schedule_single_event() plutôt que wp_schedule_event() : le rappel ne doit se déclencher qu’une seule fois, jamais de façon récurrente. La condition $timestamp_rappel > time() évite de programmer un rappel dans le passé pour un rendez-vous pris à moins de trois jours d’échéance.
Envoyer l’email au moment prévu

function wpm_envoyer_rappel_rdv( $post_id ) {
$email_patient = get_post_meta( $post_id, 'email_patient', true );
$date_rdv = get_post_meta( $post_id, 'date_rdv', true );
if ( empty( $email_patient ) ) {
return;
}
wp_mail(
$email_patient,
'Rappel : votre rendez-vous approche',
sprintf( "Votre rendez-vous est prevu le %s.\nMerci de nous prevenir en cas d'empechement.", $date_rdv )
);
}
add_action( 'wpm_envoyer_rappel_rdv', 'wpm_envoyer_rappel_rdv' );
L’action personnalisée wpm_envoyer_rappel_rdv sert à la fois de nom d’événement Cron et de nom de fonction de rappel, ce qui simplifie la lecture du code — une convention à adopter avec prudence sur un projet plus vaste, où la confusion entre les deux peut vite s’installer.
Gérer l’annulation d’un rendez-vous
Un rendez-vous annulé après la programmation du rappel laisserait sinon un email partir pour un rendez-vous qui n’existe plus. Le nettoyage se fait via wp_clear_scheduled_hook(), déclenché sur le passage du rendez-vous au statut « annulé » :
wp_clear_scheduled_hook( 'wpm_envoyer_rappel_rdv', array( $post_id ) )retire l’événement programmé- Le second argument doit correspondre exactement aux arguments passés à la programmation initiale
- Sans cette précaution, un rendez-vous annulé génère malgré tout un email de rappel erroné
Les limites de WP-Cron sur ce type d’envoi
WP-Cron ne se déclenche qu’à l’occasion d’une visite sur le site, ce qui peut décaler l’envoi de quelques minutes à quelques heures sur un site à faible trafic. Pour un rappel de rendez-vous programmé trois jours à l’avance, ce décalage reste largement acceptable ; il ne le serait pas pour un rappel programmé à la minute près. Un cron système véritable, déclenché indépendamment du trafic, reste recommandé si la précision devient critique.
Vérifier qu’un rappel a bien été programmé
Pour rassurer le personnel du cabinet sur la fiabilité du dispositif, une colonne discrète a été ajoutée à la liste d’administration des rendez-vous, affichant simplement « Rappel programmé » ou « Aucun rappel » selon le résultat de wp_next_scheduled() pour ce rendez-vous précis. Ce petit ajout a suffi à couper court aux doutes exprimés lors des premières semaines d’utilisation, quand personne n’était encore certain que les emails partaient réellement.
En résumé
Un rappel de rendez-vous programmé avec wp_schedule_single_event() et nettoyé avec wp_clear_scheduled_hook() couvre l’essentiel du besoin sans extension de prise de rendez-vous complète. Le vrai point de vigilance reste la gestion des annulations, trop souvent oubliée lors de la première mise en production.