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 );
}

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énario | Résultat attendu |
|---|---|
| Visiteur non connecté | Prix de base sans remise |
| Compte revendeur | Remise de 15 % appliquée |
| Grand compte avec tarif négocié | Tarif spécifique prioritaire sur la grille |
| Compte sans grille attribuée | Prix 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.