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

Extensions

Catalogue B2B : des prix dégressifs qui dépendent du compte client connecté

Un fabricant industriel a besoin d'afficher un tarif différent selon le compte professionnel authentifié, sans dupliquer les fiches produit par grille tarifaire.

Par WordPress Développement • 9 août 2022 • 4 min de lecture • Aucun commentaire
Catalogue B2B : des prix dégressifs qui dépendent du compte client connecté

Trois grilles tarifaires pour un même catalogue de deux cents produits : c’est le point de départ d’un projet pour un fabricant industriel qui vend directement à des revendeurs, des installateurs et des grands comptes, chacun avec des conditions négociées différentes, sans vouloir dupliquer chaque fiche produit par grille.

La bonne architecture consiste à séparer le prix de base, stocké une seule fois par produit, du calcul du tarif final, effectué dynamiquement en fonction du compte connecté au moment de l’affichage.

Étape 1 : attribuer une grille tarifaire à chaque compte

update_user_meta( $user_id, 'grille_tarifaire', 'revendeur' );

Un simple champ de métadonnée utilisateur, renseigné manuellement par l’équipe commerciale ou via un formulaire dédié dans l’écran de profil, suffit à représenter à quelle catégorie tarifaire appartient chaque compte professionnel.

Étape 2 : définir les taux de remise par grille

function wpm_taux_remise_par_grille() {
    return array(
        'revendeur'      => 0.15,
        'installateur'   => 0.10,
        'grand_compte'   => 0.22,
    );
}

Étape 3 : calculer le prix affiché via un filtre unique

add_filter( 'wpm_prix_affiche', 'wpm_appliquer_remise_compte', 10, 2 );

function wpm_appliquer_remise_compte( $prix_base, $produit_id ) {
    if ( ! is_user_logged_in() ) {
        return $prix_base;
    }

    $user_id = get_current_user_id();
    $grille  = get_user_meta( $user_id, 'grille_tarifaire', true );
    $taux    = wpm_taux_remise_par_grille();

    if ( empty( $grille ) || ! isset( $taux[ $grille ] ) ) {
        return $prix_base;
    }

    return round( $prix_base * ( 1 - $taux[ $grille ] ), 2 );
}
L'essentiel à retenir : Une grille tarifaire par rôle plutôt que par produit dupliqué ; Le prix affiché se calcule au moment du rendu, jamais stocké en dur ; user_meta stocke la grille attribuée à chaque compte

Ce filtre unique s’applique partout où un prix doit être affiché – fiche produit, liste de catalogue, récapitulatif de commande – sans dupliquer la logique de calcul à chaque endroit. Le prix de base reste inchangé en base de données ; seule sa présentation varie selon le compte connecté.

Utilisation du filtre dans un template

$prix_base   = (float) get_post_meta( $produit_id, 'prix_ht', true );
$prix_affiche = apply_filters( 'wpm_prix_affiche', $prix_base, $produit_id );

echo esc_html( number_format( $prix_affiche, 2, ',', ' ' ) ) . ' € HT';

Gérer les remises négociées produit par produit

Certains grands comptes négocient un tarif spécifique sur un produit précis, en plus ou à la place du taux de leur grille générale. Une métadonnée dédiée, propre à la combinaison utilisateur et produit, permet de gérer cette exception sans complexifier le filtre principal :

add_filter( 'wpm_prix_affiche', 'wpm_appliquer_remise_specifique', 20, 2 );

function wpm_appliquer_remise_specifique( $prix, $produit_id ) {
    $user_id       = get_current_user_id();
    $prix_specifique = get_user_meta( $user_id, 'prix_special_' . $produit_id, true );

    if ( '' !== $prix_specifique ) {
        return (float) $prix_specifique;
    }

    return $prix;
}

La priorité 20, supérieure à celle du premier filtre, garantit que cette exception s’applique après le calcul de la remise générale, en l’écrasant si un tarif spécifique existe pour ce couple compte/produit.

Ce qu’il faut vérifier avant de livrer

ScénarioRésultat attendu
Visiteur non connectéPrix de base sans remise
Compte revendeurRemise de 15 % appliquée
Grand compte avec tarif négociéTarif spécifique prioritaire sur la grille
Compte sans grille attribuéePrix de base par défaut

Sur ce type de projet, l’erreur à éviter est de stocker le prix remisé directement en base : le jour où une grille tarifaire change, il faudrait recalculer et mettre à jour chaque produit une par une plutôt que de simplement ajuster un taux central.

En résumé

Un catalogue B2B avec tarification différenciée par compte n’exige aucune duplication de fiche produit : un filtre central, alimenté par une grille attribuée à chaque utilisateur et complété au besoin par des exceptions produit par produit, couvre l’essentiel des demandes rencontrées sur ce type de projet industriel. Cette organisation garde par ailleurs un avantage précieux pour la suite du projet : ajouter une quatrième grille tarifaire, ou faire évoluer un taux existant, se limite à modifier un seul tableau central, sans jamais retoucher les fiches produit ni redéployer une quelconque migration de données en base.

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