Sept pièces saisies une à une, une calculette ouverte dans un autre onglet, et pourtant le total affiché sur la fiche ne correspond jamais tout à fait à ce qui figure sur le plan. C’est le lot de toute agence qui laisse ses agents renseigner la surface totale à la main, pièce par pièce.
La correction la plus simple ne consiste pas à ajouter une nouvelle case à cocher de vérification, mais à supprimer purement et simplement la saisie manuelle du total. Si chaque pièce est déjà renseignée dans un champ répétable, la somme peut être calculée par WordPress lui-même, à chaque enregistrement de la fiche.
La structure de champs de départ
Une annonce type comporte un groupe répétable « pièces », avec pour chaque ligne un intitulé (« séjour », « chambre 1 »…) et une surface en mètres carrés. Le champ « surface habitable totale », lui, existait jusque-là comme un simple champ numérique libre, rempli à la main par l’agent.
La bascule consiste à transformer ce champ en une valeur lecture seule, recalculée automatiquement à partir des lignes du tableau répétable, sans jamais laisser l’humain reprendre la main dessus.
Le recalcul au moment de l’enregistrement

Le hook acf/save_post se déclenche après l’enregistrement des champs personnalisés d’ACF, ce qui permet de lire les valeurs fraîchement saisies dans le tableau répétable et de mettre à jour le champ total juste après.
add_action( 'acf/save_post', function( $post_id ) {
if ( get_post_type( $post_id ) !== 'annonce_immo' ) {
return;
}
$pieces = get_field( 'pieces', $post_id );
$total = 0;
if ( is_array( $pieces ) ) {
foreach ( $pieces as $piece ) {
$total += (float) $piece['surface_m2'];
}
}
update_field( 'surface_habitable_totale', $total, $post_id );
}, 20 );
La priorité 20 garantit que le tableau répétable a déjà été enregistré au moment où le calcul s’exécute, condition indispensable pour lire des valeurs à jour et non celles de la version précédente de la fiche.
Rendre le champ visiblement calculé
Un champ en lecture seule qui ressemble à un champ éditable trompe l’agent, qui finit par cliquer dedans et se demander pourquoi rien ne se passe. Il vaut mieux ajouter un message explicite dans les instructions du champ ACF, du type « valeur calculée automatiquement à partir des pièces ci-dessus », et désactiver la saisie via l’attribut readonly proposé nativement par ACF.
- Champ numérique en lecture seule, jamais masqué
- Instruction visible rappelant l’origine du calcul
- Recalcul déclenché uniquement à l’enregistrement, jamais en temps réel côté navigateur
Gérer les surfaces non comptabilisées
Toutes les pièces ne comptent pas dans la surface habitable : un garage, une cave ou un balcon doivent en être exclus, alors qu’une véranda chauffée peut, elle, être incluse selon les critères retenus par l’agence. La solution la plus propre consiste à ajouter, sur chaque ligne du répétable, une case à cocher « compter dans la surface habitable », lue dans la boucle de calcul.
foreach ( $pieces as $piece ) {
if ( ! empty( $piece['compter_surface_habitable'] ) ) {
$total += (float) $piece['surface_m2'];
}
}
Afficher le détail sur la fiche publique
Le total calculé gagne à être accompagné, côté front, du détail pièce par pièce qui a servi à l’obtenir. Cela rassure le visiteur et évite les questions sur la méthode de calcul retenue, un point régulièrement soulevé lors des visites.
Un champ calculé qu’on ne peut pas vérifier reste suspect aux yeux du visiteur. Toujours afficher le détail qui a permis d’obtenir le total.
Vérifier la cohérence avec le nombre de pièces annoncé
Une agence qui annonce « quatre pièces » sur une fiche dont le tableau répétable n’en contient que trois expose une incohérence immédiatement visible pour un visiteur attentif. Un second calcul, comparant le nombre de lignes du tableau répétable au champ « nombre de pièces » saisi séparément, permet d’afficher une alerte discrète dans l’administration lorsque les deux valeurs ne concordent pas.
$nombre_pieces_declare = (int) get_field( 'nombre_pieces', $post_id );
$nombre_pieces_reel = is_array( $pieces ) ? count( $pieces ) : 0;
if ( $nombre_pieces_declare !== $nombre_pieces_reel ) {
// Afficher une notice d'incohérence à l'agent avant publication.
}
Ce contrôle secondaire n’empêche pas la publication, contrairement à un champ obligatoire absent : il se contente d’attirer l’attention de l’agent sur une saisie probablement incomplète, à charge pour lui de corriger avant de mettre l’annonce en ligne.
Pour aller plus loin
Ce calcul reste volontairement simple et ne remplace en rien la validation légale d’un diagnostic de surface, qui répond à des règles de mesure distinctes. Il permet surtout d’éliminer une source d’erreur humaine récurrente sur un point que les visiteurs vérifient en premier lieu.