Le WordPress d'aujourd'hui, décodé pour les développeurs

E-commerce

Vente à emporter sous WooCommerce : créneaux horaires et zones limitées

Un restaurant veut limiter la commande en ligne à des créneaux réalistes et une zone de retrait précise. La configuration tient en quelques hooks.

Par WordPress Développement • 11 mai 2021 • 4 min de lecture • Aucun commentaire
Vente à emporter sous WooCommerce : créneaux horaires et zones limitées

Combien de plats un restaurant peut-il réellement préparer entre 12h15 et 12h30 sans faire attendre tout le monde vingt minutes de plus que prévu ? C’est la première question à poser avant d’écrire la moindre ligne de code pour un système de vente à emporter sous WooCommerce, bien avant de penser interface.

WooCommerce ne propose rien de natif pour gérer des créneaux de retrait limités en nombre de commandes : le panier accepte des commandes en continu, sans notion de capacité horaire. Deux composants sont à construire : un sélecteur de créneau avec compteur de remplissage, et une zone de retrait restreinte par code postal, plus stricte qu’une simple zone de livraison classique.

Construire le sélecteur de créneaux avec compteur

La liste des créneaux disponibles se génère dynamiquement, en excluant les créneaux passés et ceux déjà saturés. Un champ personnalisé _creneau_retrait sur chaque commande permet de compter les réservations par créneau :

function get_creneaux_disponibles(string $date, int $capacite_max = 12): array
{
    $creneaux = [];
    foreach (range(11, 20) as $heure) {
        foreach (['00', '15', '30', '45'] as $minute) {
            $creneau = sprintf('%s %02d:%s', $date, $heure, $minute);
            $reservations = compter_commandes_par_creneau($creneau);
            if ($reservations < $capacite_max) {
                $creneaux[] = $creneau;
            }
        }
    }
    return $creneaux;
}

Le champ de sélection s’ajoute côté tunnel de commande via woocommerce_after_order_notes, avec une validation côté serveur dans woocommerce_checkout_process pour refuser une commande sur un créneau devenu complet entre le chargement de la page et la validation finale — un cas fréquent aux heures de forte affluence.

Restreindre la zone de retrait par code postal

Une zone de retrait n’a pas besoin d’être une zone de livraison au sens WooCommerce du terme : il s’agit plutôt d’un filtre d’éligibilité à la commande en ligne elle-même, pas d’un calcul de frais de port. Le plus simple consiste à bloquer l’accès au tunnel de commande si le code postal saisi ne figure pas dans une liste blanche :

add_action('woocommerce_checkout_process', function () {
    $codes_postaux_autorises = ['75001', '75002', '75003', '75004'];
    $code_postal = sanitize_text_field($_POST['billing_postcode'] ?? '');

    if (!in_array($code_postal, $codes_postaux_autorises, true)) {
        wc_add_notice(
            'La commande à emporter n\'est pas disponible pour cette zone.',
            'error'
        );
    }
});
L'essentiel à retenir : Bloquer les créneaux déjà pleins grâce à un compteur de commandes ; Restreindre la zone de retrait par code postal ; Prévenir la surcharge de la cuisine aux heures de pointe

Prévenir la surcharge de la cuisine aux heures de pointe

  • Afficher en temps réel le taux de remplissage d’un créneau plutôt qu’un simple statut disponible ou complet, pour inciter naturellement vers les créneaux calmes
  • Prévoir une capacité réduite sur les créneaux de midi (12h00-13h30) par rapport au reste de la journée, la cuisine n’ayant pas la même capacité de production sur toute la plage horaire
  • Envoyer un récapitulatif de commandes par créneau à la cuisine dix minutes avant le début de chaque créneau, via un e-mail automatisé ou une impression de ticket

Gérer les annulations tardives

Une commande annulée cinq minutes avant son créneau ne doit pas rouvrir automatiquement une place si la cuisine a déjà lancé la préparation. Un délai de grâce, généralement quinze à vingt minutes avant le créneau, empêche l’annulation en ligne au-delà duquel seul un appel téléphonique au restaurant permet de gérer le cas, ce qui évite les allers-retours de stock côté cuisine.

Adapter la capacité selon le jour de la semaine

Une capacité fixe de douze commandes par créneau, quel que soit le jour, ignore une réalité simple : un vendredi midi ne ressemble en rien à un mardi soir en termes d’affluence en cuisine, et l’équipe elle-même peut varier selon le planning du personnel. Externaliser ce seuil dans une option configurable par jour de la semaine, plutôt que de le figer en dur dans le code, permet au gérant du restaurant d’ajuster lui-même la capacité sans intervention technique à chaque changement de planning :

function get_capacite_par_jour(string $jour): int
{
    $capacites = get_option('capacites_creneaux_par_jour', [
        'lundi' => 10, 'mardi' => 10, 'mercredi' => 10,
        'jeudi' => 12, 'vendredi' => 15, 'samedi' => 18, 'dimanche' => 8,
    ]);
    return $capacites[$jour] ?? 12;
}

En résumé

Un système de vente à emporter fiable sous WooCommerce repose sur deux verrous simples mais stricts : un compteur de créneau vérifié côté serveur au moment de la validation, et une liste blanche de codes postaux plutôt qu’un calcul de zone classique. Ces deux éléments suffisent à éviter qu’une cuisine ne se retrouve submergée par des commandes qu’elle ne peut pas honorer dans les temps.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi