Un champ ACF n’a pas de notion de « rôle autorisé » native au-delà du réglage grossier proposé dans l’interface de configuration du groupe de champs, limité à quelques conditions simples. Pour un site éditorial où les rédacteurs ne devaient voir ni modifier un champ « note interne SEO » réservé aux administrateurs, cette limite s’est révélée insuffisante : le réglage natif d’ACF ne permettait pas de cibler une capacité personnalisée, seulement un rôle nommé, ce qui posait problème dès qu’un utilisateur cumulait plusieurs rôles ou capacités.
La solution est passée par le filtre acf/prepare_field, qui s’exécute juste avant l’affichage de chaque champ dans l’éditeur, et permet de le masquer complètement ou de le rendre en lecture seule selon une logique de capacités, plus robuste qu’une simple comparaison de nom de rôle.
Pourquoi éviter de comparer le nom du rôle
Comparer directement current_user_can( 'administrator' ) ou tester le rôle via wp_get_current_user()->roles fonctionne, mais lie la logique d’affichage à un nom de rôle précis. Si l’équipe crée plus tard un rôle « rédacteur senior » qui doit aussi voir ce champ, il faut alors modifier le code à chaque nouvel intitulé de rôle. Passer par une capacité personnalisée, assignée aux rôles concernés, découple la logique d’affichage de la liste des rôles existants.
- Une capacité
voir_notes_seo, ajoutée aux rôles administrateur et rédacteur senior - Le champ ACF vérifie cette capacité, jamais le nom du rôle directement
- Ajouter la capacité à un nouveau rôle ne nécessite aucune modification du code du champ
Masquer le champ avec acf/prepare_field

add_filter( 'acf/prepare_field/name=note_interne_seo', function( $field ) {
if ( ! current_user_can( 'voir_notes_seo' ) ) {
return false;
}
return $field;
} );
Retourner false depuis ce filtre retire complètement le champ de l’éditeur pour les utilisateurs qui n’ont pas la capacité requise — il n’apparaît même pas en lecture seule, il disparaît purement et simplement de l’interface. C’est le comportement voulu ici : les rédacteurs n’ont pas besoin de savoir que ce champ existe.
Variante : lecture seule plutôt que masqué
Pour d’autres champs, masquer complètement n’est pas souhaitable — un rédacteur doit voir la valeur d’un champ « statut de validation juridique » sans pouvoir la modifier lui-même. La même fonction de filtre peut alors désactiver le champ plutôt que le retirer :
add_filter( 'acf/prepare_field/name=statut_validation_juridique', function( $field ) {
if ( ! current_user_can( 'modifier_statut_juridique' ) ) {
$field['readonly'] = 1;
$field['instructions'] = 'Champ modifiable uniquement par le service juridique.';
}
return $field;
} );
Le cas des groupes de champs entiers
Quand c’est un groupe complet de champs qui doit être masqué plutôt qu’un champ isolé, le filtre équivalent au niveau du groupe est acf/prepare_field_group, appliqué de la même façon sur la capacité de l’utilisateur connecté plutôt que sur son rôle nommé. Le principe reste identique, seule la granularité change.
Ce que cette approche ne fait pas
Ce filtrage agit uniquement sur l’affichage dans l’éditeur d’administration. Il ne protège pas la donnée elle-même contre une modification directe via l’API REST ou une requête update_field() exécutée par un autre code du site : un contrôle de capacité doit être ajouté séparément à tout point d’entrée qui permettrait de modifier ce champ en dehors de l’éditeur visuel.
Tester le rendu pour chaque rôle concerné
Avant de considérer ce filtrage comme terminé, un test simple mais souvent négligé : se connecter successivement avec un compte de test pour chaque rôle concerné (rédacteur, rédacteur senior, administrateur) et vérifier concrètement ce qui s’affiche dans l’éditeur. Une capacité mal orthographiée dans le code du filtre, ou oubliée sur un rôle, ne se voit pas à la lecture du code — seul un test avec le bon compte le révèle vraiment.
En résumé
Le filtre acf/prepare_field, combiné à une capacité personnalisée plutôt qu’à un nom de rôle, permet d’adapter finement l’affichage des champs ACF sans dépendre d’une extension supplémentaire ni figer la logique sur l’organisation des rôles du moment.