# Une disponibilité de matériel agricole affichée en thème, mise à jour par cron

> Rafraîchir périodiquement un indicateur de disponibilité de matériel en location via une tâche planifiée, dans un template de thème classique pour une coopérative agricole.

- Auteur : Clément Hadrot
- Publié le : 2024-10-12
- Mis à jour le : 2024-10-12
- Catégorie : Thèmes
- URL : https://wpmoderne.dev.wordpress-developpement.fr/themes/disponibilite-materiel-agricole-theme-cron/

## L’essentiel

- Tâche planifiée toutes les heures via wp_schedule_event
- Statut de disponibilité stocké en métadonnée, jamais recalculé à l'affichage
- Tâche testable manuellement via WP-CLI avant mise en production

Une coopérative agricole loue une trentaine de machines à ses adhérents — tracteurs, épandeurs, presses à balles — et voulait afficher sur son site un statut simple pour chacune : disponible, réservée, ou en maintenance. La donnée source existait déjà dans un tableur partagé utilisé par les techniciens sur le terrain, mais rien ne la reliait automatiquement au site public.

Plutôt que de recalculer ce statut à chaque affichage de page (ce qui aurait imposé une lecture répétée du tableur ou de sa source), le choix s'est porté sur une tâche planifiée qui synchronise les statuts toutes les heures, avec un résultat stocké en métadonnée et simplement lu au moment de l'affichage.

## L'arborescence retenue pour ce dispositif

```
theme-cooperative/
├── functions.php
├── inc/
│   ├── class-synchronisation-materiel.php
│   └── class-cpt-materiel.php
├── template-parts/
│   └── fiche-materiel.php
└── single-materiel.php
```

Le type de contenu `materiel` porte une métadonnée `statut_disponibilite`, avec trois valeurs possibles : `disponible`, `reserve` et `maintenance`. Cette métadonnée n'est jamais modifiée directement par un utilisateur dans l'administration : elle est entièrement pilotée par la tâche planifiée.

> L'essentiel à retenir : Tâche planifiée toutes les heures via wp_schedule_event ; Statut de disponibilité stocké en métadonnée, jamais recalculé à l'affichage ; Tâche testable manuellement via WP-CLI avant mise en production

## Déclarer la tâche planifiée avec wp_schedule_event

La tâche est enregistrée à l'activation du thème, avec une fréquence horaire personnalisée ajoutée au tableau des intervalles disponibles, WordPress ne proposant nativement que les fréquences horaire, deux fois par jour et quotidienne par défaut — l'intervalle horaire suffisait donc ici sans ajout personnalisé.

```
add_action( 'after_switch_theme', function () {
    if ( ! wp_next_scheduled( 'synchroniser_disponibilite_materiel' ) ) {
        wp_schedule_event( time(), 'hourly', 'synchroniser_disponibilite_materiel' );
    }
} );

add_action( 'synchroniser_disponibilite_materiel', 'executer_synchronisation_materiel' );

function executer_synchronisation_materiel() {
    $donnees_source = recuperer_donnees_tableur_partage();

    foreach ( $donnees_source as $identifiant => $statut ) {
        $article_id = recuperer_article_materiel_par_identifiant( $identifiant );

        if ( $article_id ) {
            update_post_meta( $article_id, 'statut_disponibilite', sanitize_key( $statut ) );
        }
    }
}
```

## Ne jamais recalculer le statut au moment de l'affichage

Le template de fiche matériel se contente de lire la métadonnée déjà synchronisée, sans jamais appeler la source de données externe directement. Cette séparation garantit un temps de réponse constant pour le visiteur, indépendant de la disponibilité ou de la lenteur éventuelle de la source de données du tableur partagé.

```
$statut = get_post_meta( get_the_ID(), 'statut_disponibilite', true );

$libelles = array(
    'disponible'  => 'Disponible',
    'reserve'     => 'Réservée',
    'maintenance' => 'En maintenance',
);

echo esc_html( $libelles[ $statut ] ?? 'Statut inconnu' );
```

## Vérifier la tâche avant la mise en production

Attendre une heure complète pour vérifier qu'une tâche planifiée fonctionne correctement n'est pas réaliste en phase de test. La commande WP-CLI `wp cron event run` permet de déclencher la tâche immédiatement, sans attendre son horaire théorique.

```
wp cron event run synchroniser_disponibilite_materiel
wp cron event list --fields=hook,next_run_relative | grep materiel
```

## La limite connue de wp-cron sur ce projet

Le mécanisme de tâches planifiées de WordPress ne se déclenche qu'à l'occasion d'une visite sur le site, ce qui pouvait retarder la synchronisation sur les périodes de très faible trafic nocturne. Pour ce site à trafic modeste mais régulier en journée, ce délai occasionnel restait acceptable ; sur un projet à trafic plus irrégulier, j'aurais recommandé de désactiver le déclenchement par visite au profit d'une tâche cron système classique appelant `wp-cron.php` à intervalle fixe.

- Déclenchement par défaut lié au trafic du site, avec un risque de retard sur les périodes creuses.
- Alternative recommandée pour un trafic irrégulier : désactivation via la constante `DISABLE_WP_CRON` et appel externe planifié.
- Choix conservé ici : déclenchement par défaut, jugé suffisant au regard du trafic observé sur ce site.

> Une donnée qui change rarement mais dont l'affichage doit rester rapide se prête toujours mieux à une synchronisation planifiée qu'à un recalcul en temps réel : le visiteur ne perd jamais de temps à attendre une source externe potentiellement lente ou indisponible.

## En résumé

Ce dispositif de synchronisation horaire, entièrement porté par le mécanisme de tâches planifiées natif de WordPress, a permis à la coopérative d'afficher un statut de disponibilité fiable sans exposer directement son tableur de gestion interne au site public, et sans imposer de temps de chargement supplémentaire à ses visiteurs à chaque consultation d'une fiche matériel.
