Le Codex de WordPress décrit le filtre acf/prepare_field comme le point d’entrée permettant de modifier la configuration d’un champ juste avant son affichage dans l’éditeur, y compris pour le rendre en lecture seule ou le désactiver entièrement. C’est exactement l’outil nécessaire quand un devis signé électroniquement doit rester intouchable sur ses montants, tout en restant ouvert aux notes internes ajoutées après coup.
Le piège classique consiste à verrouiller l’intégralité du devis dès la signature, ce qui empêche ensuite le commercial d’ajouter une remarque sur un délai négocié par téléphone, ou le conducteur de travaux de noter une contrainte d’accès chantier découverte après validation. Le verrouillage doit donc s’appliquer champ par champ, pas au niveau de l’article entier.
Séparer les champs commerciaux des champs internes
Sur un type de contenu devis_btp, les champs se répartissent en deux groupes distincts dans la structure ACF : un groupe montant_ht, montant_ttc, conditions_paiement qui engage contractuellement l’entreprise une fois le devis signé, et un groupe note_interne, contrainte_chantier, rappel_planning destiné exclusivement à l’équipe.
Verrouiller uniquement les champs commerciaux
Le statut de signature est stocké dans un champ date_signature_electronique. Tant que ce champ est vide, tous les champs restent modifiables. Une fois rempli, seuls les champs commerciaux passent en lecture seule :

add_filter( 'acf/prepare_field', 'wpm_verrouiller_champs_commerciaux_devis' );
function wpm_verrouiller_champs_commerciaux_devis( $field ) {
global $post;
if ( ! $post || 'devis_btp' !== $post->post_type ) {
return $field;
}
$champs_commerciaux = array( 'montant_ht', 'montant_ttc', 'conditions_paiement' );
if ( ! in_array( $field['name'], $champs_commerciaux, true ) ) {
return $field;
}
$signe = get_field( 'date_signature_electronique', $post->ID );
if ( $signe ) {
$field['readonly'] = 1;
}
return $field;
}
Pourquoi readonly plutôt que disabled
La propriété readonly conserve la valeur du champ lors de la soumission du formulaire d’édition, contrairement à disabled qui empêche l’envoi de la valeur et provoquerait, sans précaution supplémentaire, un enregistrement vide du montant lors de la sauvegarde suivante. Ce détail, facile à manquer, évite une perte de données bien réelle sur un devis déjà signé.
Une double sécurité côté enregistrement
Le verrouillage visuel ne suffit pas : un utilisateur habitué aux outils de développement du navigateur pourrait retirer l’attribut en local. Une vérification côté serveur, au moment de l’enregistrement, referme la porte :
add_filter( 'acf/update_value/name=montant_ht', 'wpm_bloquer_modification_montant', 10, 3 );
function wpm_bloquer_modification_montant( $value, $post_id, $field ) {
$signe = get_field( 'date_signature_electronique', $post_id );
if ( $signe ) {
return get_field( 'montant_ht', $post_id );
}
return $value;
}
Ce filtre renvoie systématiquement l’ancienne valeur si le devis est signé, quel que soit ce que le formulaire tente d’enregistrer, ce qui neutralise toute tentative de contournement du verrouillage visuel.
Garder les champs internes ouverts
Comme la liste $champs_commerciaux ne mentionne jamais note_interne, contrainte_chantier ou rappel_planning, ces champs continuent d’accepter des modifications sans restriction après signature, exactement comme souhaité :
- Le conducteur de travaux peut ajouter une contrainte découverte après signature.
- Le commercial peut noter un rappel de planning sans toucher aux montants.
- Aucun rôle particulier n’est requis pour ces champs, seule la capacité d’édition standard du devis suffit.
Conseil maison : listez toujours explicitement les champs à verrouiller plutôt que ceux à laisser ouverts. Un nouveau champ ajouté plus tard au groupe commercial doit être verrouillé par défaut, pas l’inverse.
Ce que cette technique ne traite pas
Elle ne gère pas l’intégration de la signature électronique elle-même, ni la génération du PDF final envoyé au client. Elle part du principe qu’un champ de date de signature existe déjà, renseigné par le service qui traite la signature, qu’il s’agisse d’un module interne ou d’un prestataire externe.
En résumé
Un devis BTP signé n’a pas besoin d’être figé dans son ensemble : seuls les champs qui engagent contractuellement l’entreprise doivent devenir intouchables, tandis que le suivi opérationnel continue de vivre normalement. Cette granularité, obtenue avec deux filtres ACF et aucune extension supplémentaire, évite autant les erreurs de saisie que les frustrations d’une équipe qui aurait besoin d’ajouter une simple note.