Une parcelle vendue en indivision ne se comporte pas comme un produit ordinaire : chaque part achetée réduit un stock commun, mais deux acheteurs ne doivent jamais recevoir la même part, et un même acheteur ne doit pas pouvoir dépasser un plafond de parts fixé à l’avance selon son profil. C’est le problème posé à une coopérative agricole qui doit organiser la vente de parts d’une parcelle en indivision entre ses membres.
Le problème : un stock global mais un plafond individuel variable
WooCommerce gère nativement un stock global par produit, décrémenté à chaque achat, ce qui convient parfaitement pour représenter le nombre total de parts disponibles sur la parcelle. Ce que WooCommerce ne gère pas nativement, en revanche, c’est un plafond d’achat différent selon le profil de l’acheteur : un exploitant agricole en activité peut être autorisé à acquérir jusqu’à quatre parts, tandis qu’un simple sociétaire non-exploitant est plafonné à une seule part, pour préserver l’équilibre de l’indivision entre profils.
Le réglage natif Limiter les achats à X par commande, disponible dans l’onglet Inventaire de la fiche produit, applique un plafond unique à tout le monde, sans distinction de profil. Il faut donc le compléter par une logique personnalisée.
Le correctif : un filtre sur la quantité maximale selon le rôle de l’acheteur
La solution repose sur un filtre WooCommerce qui ajuste la quantité maximale ajoutable au panier en fonction d’une métadonnée utilisateur enregistrée sur le profil de chaque sociétaire, par exemple profil_exploitant stockée lors de l’inscription à la coopérative :
add_filter( 'woocommerce_quantity_input_args', function( $args, $produit ) {
if ( 1234 !== $produit->get_id() ) {
return $args;
}
$utilisateur_id = get_current_user_id();
$est_exploitant = get_user_meta( $utilisateur_id, 'profil_exploitant', true );
$args['max_value'] = $est_exploitant ? 4 : 1;
return $args;
}, 10, 2 );

Ce filtre agit sur l’affichage du sélecteur de quantité, mais ne suffit pas à lui seul : un acheteur pourrait contourner le champ de quantité en modifiant directement la requête envoyée au panier. Il faut donc dupliquer la même vérification côté validation, sur le hook woocommerce_add_to_cart_validation, qui peut bloquer réellement l’ajout :
add_filter( 'woocommerce_add_to_cart_validation', function( $passe, $produit_id, $quantite ) {
if ( 1234 !== $produit_id ) {
return $passe;
}
$est_exploitant = get_user_meta( get_current_user_id(), 'profil_exploitant', true );
$plafond = $est_exploitant ? 4 : 1;
if ( $quantite > $plafond ) {
wc_add_notice( 'Le nombre de parts demandé dépasse le plafond autorisé pour votre profil.', 'error' );
return false;
}
return $passe;
}, 10, 3 );
Variante : cumuler les parts déjà achetées lors de commandes précédentes
Le filtre ci-dessus ne vérifie que la quantité de la commande en cours. Si un sociétaire peut passer plusieurs commandes séparées, il faut cumuler les parts déjà acquises via l’historique de ses commandes pour appliquer le plafond sur le total, et non commande par commande. Une requête sur les commandes payées de l’utilisateur, filtrée sur la ligne de produit correspondant à la parcelle, permet ce cumul avant d’appliquer la même vérification.
Variante : libérer manuellement le stock en cas d’erreur de saisie
Un point de vigilance mérite d’être signalé : le stock WooCommerce ne se libère jamais automatiquement si une commande a été validée par erreur puis annulée sans passer par le statut « Remboursée » avec restitution explicite du stock. Sur un produit à quantité aussi limitée qu’une part d’indivision, chaque annulation doit être traitée manuellement par un administrateur, en vérifiant que la case Restaurer le stock est bien cochée lors de l’annulation, faute de quoi une part resterait indisponible à la vente sans avoir été réellement acquise par personne.
En résumé
Vendre des parts d’indivision sous WooCommerce fonctionne avec le système de stock natif pour la contrainte globale, mais nécessite un filtre personnalisé, dupliqué côté affichage et côté validation, pour appliquer un plafond différent selon le profil de l’acheteur. La vraie difficulté ne réside pas dans le code lui-même, plutôt court, mais dans la rigueur de suivi manuel qu’impose un produit aussi sensible qu’une part de foncier en indivision.