Passer au contenu principal

Camille-C Chardon, gestion de projet web

Et cron et cron petit patapon

Et cron et cron petit patapon

Automatiser l’envoi de rapports depuis WordPress avec WP-Cron

Lorsqu’un site WordPress collecte régulièrement des données via un formulaire, certaines tâches administratives peuvent rapidement devenir répétitives : exporter les données, sélectionner la bonne période, générer un fichier CSV puis l’envoyer aux personnes concernées.

Dans le cadre d’un projet client, l’objectif était d’automatiser complètement ce processus pour les évaluations laissées par les utilisateurs : les réponses sont enregistrées dans WordPress via Contact Form 7 et Flamingo, puis un rapport doit être généré et envoyé automatiquement par e-mail.

La solution mise en place repose sur WP-Cron, le système de planification de tâches intégré à WordPress.


Les outils utilisés

Cette automatisation repose sur deux extensions WordPress et plusieurs fonctionnalités natives :

  • Contact Form 7 : création et gestion du formulaire d’évaluation ;
  • Flamingo : enregistrement des réponses envoyées via le formulaire ;
  • WP-Cron : planification des rapports hebdomadaires et mensuels — fonctionnalité native de WordPress ;
  • wp_mail() : envoi des rapports par e-mail — fonction native de WordPress ;
  • PHP : récupération des données, calcul des périodes et génération du fichier CSV.

Le besoin

Les évaluations sont recueillies à travers un formulaire Contact Form 7. Chaque réponse est ensuite conservée dans WordPress grâce à Flamingo.

Plutôt que d’exporter manuellement ces données, deux rapports automatiques étaient nécessaires :

  • un rapport hebdomadaire, couvrant du lundi à 00:00 au dimanche à 23:59 ;
  • un rapport mensuel, couvrant l’intégralité du mois précédent.

Le rapport doit être généré au format CSV et envoyé automatiquement par e-mail.

L’un des points importants du développement consiste donc à distinguer le moment où la tâche est exécutée de la période de données contenue dans le rapport.

WP-Cron : le planificateur intégré à WordPress

WordPress dispose de son propre mécanisme de tâches programmées : WP-Cron.

Son fonctionnement est comparable à celui d’une tâche cron classique sur un serveur, avec une différence importante : par défaut, WP-Cron est déclenché lorsqu’une visite arrive sur le site.

On commence donc par enregistrer l’événement nécessaire :

if ( ! wp_next_scheduled( 'custom_eval_weekly_report' ) ) {
    wp_schedule_event(
        $timestamp,
        'weekly',
        'custom_eval_weekly_report'
    );
}

Le hook créé peut ensuite être associé à une fonction :

add_action(
    'custom_eval_weekly_report',
    'custom_eval_send_weekly_report'
);

À chaque déclenchement de l’événement, WordPress exécute alors automatiquement la fonction correspondante.

Définir correctement la période du rapport hebdomadaire

C’est probablement le point qui demande le plus d’attention.


Le rapport hebdomadaire doit contenir toutes les évaluations enregistrées entre :

lundi 00:00:00 → dimanche 23:59:59


Si le cron s’exécute le lundi, il faut donc calculer la semaine précédente et non simplement retirer sept jours à l’heure d’exécution.


Une approche consiste à définir la fin de période au lundi à 00:00 :

$end = new DateTimeImmutable(
    'monday this week 00:00:00',
    wp_timezone()
);

Puis à calculer le début de la période :

$start = $end->modify( '-7 days' );

On obtient ainsi :

$start = lundi précédent 00:00:00
$end   = lundi courant 00:00:00

Lors de la récupération des données, on peut alors utiliser une condition de type :

$date >= $start && $date < $end

Cette méthode permet de travailler avec une période où le début est inclus et la fin est exclue.

Pourquoi ne pas utiliser dimanche 23:59:59 ?

On pourrait techniquement définir la période suivante :

lundi 00:00:00
→
dimanche 23:59:59

Mais il est généralement plus propre de travailler avec :

lundi 00:00:00
→
lundi suivant 00:00:00 exclu

Cette logique simplifie les comparaisons et limite les problèmes liés aux secondes, microsecondes ou formats de dates différents.

C’est une bonne pratique qui peut être réutilisée pour de nombreux systèmes de reporting.

Générer le rapport CSV

Une fois la période calculée, le script interroge les données enregistrées par Flamingo afin de récupérer uniquement les évaluations comprises dans cette plage.


Les données nécessaires sont ensuite écrites dans un fichier CSV.


$handle = fopen( $filepath, 'w' );

fputcsv(
    $handle,
    array(
        'Date',
        'Critère 1',
        'Critère 2',
        'Commentaire'
    ),
    ';'
);

foreach ( $evaluations as $evaluation ) {

    fputcsv(
        $handle,
        array(
            $evaluation['date'],
            $evaluation['critere_1'],
            $evaluation['critere_2'],
            $evaluation['commentaire']
        ),
        ';'
    );
}

fclose( $handle );

L’intérêt est également de pouvoir choisir précisément les informations qui apparaissent dans l’export.

Dans ce projet, certaines données personnelles comme le nom et l’adresse e-mail n’avaient pas besoin de figurer dans le rapport. Elles ont donc été exclues du CSV.

C’est à la fois plus lisible et préférable du point de vue de la minimisation des données.

Envoyer automatiquement le fichier par e-mail

WordPress fournit la fonction native wp_mail() pour envoyer des e-mails.

Le fichier CSV généré peut être ajouté comme pièce jointe :

wp_mail(
    $recipients,
    $subject,
    $message,
    $headers,
    array( $filepath )
);

L’objet du rapport hebdomadaire peut également être généré dynamiquement :

$subject = sprintf(
    'Rapport hebdomadaire des évaluations %s-%s',
    $start->format( 'd.m.Y' ),
    $end->modify( '-1 day' )->format( 'd.m.Y' )
);

On obtient par exemple :


Rapport hebdomadaire des évaluations 17.08.2026-23.08.2026


Le destinataire reçoit ainsi automatiquement le fichier CSV correspondant à la semaine complète précédente.

Ajouter un rapport mensuel

La même logique peut être réutilisée pour le reporting mensuel.

Cette fois, la période correspond au mois précédent :


$end = new DateTimeImmutable(
    'first day of this month 00:00:00',
    wp_timezone()
);

$start = $end->modify( '-1 month' );

On obtient :


1er jour du mois précédent 00:00
→
1er jour du mois courant 00:00 exclu

Par exemple, pour un cron exécuté le 1er août :


01.07.2026 00:00:00
→
01.08.2026 00:00:00 exclu

Le rapport contient donc naturellement toutes les évaluations du mois de juillet.

Attention au fuseau horaire

Un autre point important concerne les dates et heures.

Il est préférable d’utiliser le fuseau horaire configuré dans WordPress :

wp_timezone()

plutôt que de supposer que le serveur fonctionne dans le même fuseau horaire que le site.

Par exemple :


$now = new DateTimeImmutable(
    'now',
    wp_timezone()
);

Cela permet au script de suivre automatiquement le fuseau configuré dans Réglages → Général → Fuseau horaire.

Cela permet notamment de gérer correctement les changements entre heure d’hiver et heure d’été.

WP-Cron n’est pas un cron serveur

Il existe cependant une limite importante à connaître.

WP-Cron n’est pas un véritable planificateur système. WordPress vérifie les tâches à exécuter lorsqu’une requête arrive sur le site.

Si une tâche est prévue à 12:00 mais qu’aucun visiteur n’arrive avant 12:07, elle pourra donc être exécutée à 12:07.

Pour un rapport hebdomadaire, quelques minutes de décalage sont généralement sans conséquence.

Pour une exécution nécessitant une heure très précise, il est préférable de faire appeler wp-cron.php par un véritable cron configuré sur le serveur.

Séparer la récupération, l’export et la planification

Une bonne architecture consiste à ne pas placer toute la logique dans la fonction appelée par le cron.

On peut par exemple organiser le développement autour de plusieurs fonctions :


custom_eval_get_evaluations()
        ↓
custom_eval_generate_csv()
        ↓
custom_eval_generate_and_send()
        ↓
├── custom_eval_send_weekly_report()
└── custom_eval_send_monthly_report()

La récupération des données et la génération du CSV sont ainsi communes aux deux rapports.

Seuls la période, l’objet du message et le type de rapport changent.

Cette séparation facilite considérablement la maintenance et permet également de tester manuellement la génération d’un rapport sans attendre le prochain déclenchement du cron.

Tester avant d’automatiser

Une tâche cron est par définition peu visible : elle s’exécute en arrière-plan.


Avant de laisser WordPress gérer seul le processus, il est donc utile de :

  1. vérifier que les dates $start et $end correspondent exactement à la période souhaitée ;
  2. contrôler que les bonnes entrées Flamingo sont récupérées ;
  3. générer le CSV et vérifier son contenu ;
  4. tester l’envoi du mail et de sa pièce jointe ;
  5. vérifier que l’événement WP-Cron est correctement enregistré.

Cette étape est particulièrement importante lorsque certaines périodes semblent ne retourner aucune donnée : le problème peut venir du calcul des dates, du fuseau horaire ou de la manière dont Flamingo stocke la date des messages.

Une automatisation simple mais efficace

Au final, quelques fonctions PHP permettent de transformer une opération administrative récurrente en un processus totalement automatique :


Contact Form 7 → Flamingo → sélection de la période → génération CSV → envoi par e-mail


Le rapport hebdomadaire couvre automatiquement une semaine civile complète, tandis que le rapport mensuel reprend le mois civil précédent.

Au-delà du gain de temps, cette automatisation évite surtout les oublis et garantit que les rapports sont toujours construits selon les mêmes règles.

C’est aussi un bon exemple de ce que quelques lignes de PHP et les API natives de WordPress permettent d’automatiser sans ajouter une nouvelle extension pour chaque besoin.

No Comments

Post A Comment