Parfois, vous allez avoir besoin de modifier le comportement des champs ACF dans l’interface d’administration, comme par exemple agir sur les valeurs affichées. ACF rend cela possible grâce à la présence de nombreux hooks, et on va justement en découvrir 3 au travers de ce cours.
Sommaire du cours
Parfois, vous aurez besoin d’aller plus loin que les options proposées par les champs ACF. Heureusement, ACF propose de nombreux hooks pour nous aider.
Dans ce cours, nous allons aborder 3 cas parmi les plus courants. On va notamment :
- Injecter des valeurs dans une liste déroulante ;
- Filtrer les résultats d’un champ relationnel pour n’en afficher qu’une partie ;
- Modifier la valeur affichée dans les résultats d’un champ.
Il existe bien entendu des dizaines d’autres cas, mais avec ces bases, vous aurez compris le fonctionnement et vous serez en mesure de manipuler en profondeur le comportement des champs ACF dans l’interface d’administration.
Si vous voulez connaitre tous les hooks disponibles, rendez-vous dans la documentation d’ACF :
Documentation ACF : Les filtres
ACF propose de nombreux filtre pour modifier le comportement des champs par défaut.
Commençons tout de suite avec le premier cas.
Cas 1 : Injecter des valeurs dynamiques dans un select
Imaginons dans un premier temps que l’on veuille proposer des valeurs dans un champ Select. Jusque là, aucun problème, on sait faire.
Mais si demain un éditeur du site a besoin de modifier ces valeurs proposées, il devra impérativement aller dans les réglages du groupe de champs. Ce qui n’est pas idéal, surtout si c’est votre client qui s’y colle.
Mais grâce aux hooks ACF, on va pouvoir faire autrement.
Dans cet exemple, le champ select va permettre de choisir une compétence parmi une liste de compétences prédéterminées dans une page d’options, bien plus accessible que la configuration du champ ACF.
Préparation
Je commence avec une nouvelle page nommée Hooker les champs ACF, qui possède un groupe de champs du même nom, dans lequel j’ajoute un champ Select nommé skills
, me permettant de choisir une compétence.
Mais je ne vais pas indiquer les choix possibles de mon champ Select ici. C’est pour cela que je laisse le champ Choix vide.
Maintenant, dans ma page d’options, j’ajoute un champ Textarea nommé skills_list
. C’est grâce à ce champ, qu’on va pouvoir indiquer toutes les valeurs possibles du champ Compétences.
Parfait. Maintenant on va pouvoir aller saisir quelques compétences à partir de la page d’options ACF :
On va saisir une compétence par ligne. On découpera la chaine plus tard en PHP grâce aux retours à la ligne.
Le code PHP
Maintenant, notre objectif va être de récupérer ces valeurs afin de les afficher dans notre champ select « Compétences », et ce, peu importe dans quel(s) groupe(s) il se trouve.
Pour cela, on va utiliser le hook ACF acf/load_field
. Ce hook se lance pour tous les champs, du coup on va limiter seulement aux champs nommés skills
.
Une fois dans la fonction, on va récupérer une variable $field
, qui est un tableau. L’entrée qui va nous intéresser est $field['choices']
.
Grâce à ce code, on va définir les choix possibles de notre champ à partir des valeurs insérées dans la page options.
Résultat
Si tout s’est bien passé, lorsqu’on va dans la page contenant le champ Compétences, on devrait avoir une liste de choix qui correspond bien aux informations entrées dans la page d’options :
Aller plus loin
À partir de cet exemple, vous pourriez aller encore plus loin. Dans le hook, rien ne vous empêcherait de récupérer des valeurs à partir d’une WP Query, ou même carrément de sonder une API distante.
Cas 2 : filtrer les résultats d’un champ
Partons maintenant sur un tout autre cas. On sait que le champ relationnel permet de sélectionner des publications, et les afficher dans un certain ordre.
On sait également qu’on peut filtrer les résultats en limitant à certains types de publication.
Dans cet exemple, je vais chercher à sélectionner des publications du type jeux vidéo uniquement. Par contre, j’aimerais aller un peu plus loin : chaque jeu a une note sur 20, et j’aimerai n’afficher que les jeux ayant une note supérieure ou égale à 16/20.
On va justement pouvoir faire ça grâce à un autre hook d’ACF !
Préparation
Pour cet exemple, j’ai préparé un Custom Post Type nommé games
. Dans celui-ci, j’ai créé un groupe de champs me permettant d’ajouter une note à chacun de mes jeux, via un simple champ numérique appelé score
.
Je saisis donc quelques jeux, et je leur donne à chacun une note, inférieure ou supérieure à 16.
Je retourne dans le groupe de champs de la page Hooker les champs ACF, dans laquelle j’ajoute un champ relationnel qui va me permettre de récupérer ma sélection de jeux.
Je configure le champ de manière à ce qu’il ne m’affiche que des publications du CPT games
.
Le code PHP
Il est maintenant temps d’ajouter le filtre à notre champ. Pour cela, on va utiliser le hook ACF acf/fields/relationship/query/
qui intervient avant de faire la requête à la base de données, ce qui va nous permettre de modifier les paramètres de sa WP Query.
Ici, j’ai utilisé les paramètres de meta pour indiquer que je souhaite que la note (dont le champ a pour slug score
) soit supérieure ou égale à 16.
Résultat
Si tout s’est bien passé, vous devriez voir désormais apparaitre seulement les jeux avec une note supérieure à 16.
Aller plus loin
Dans le cours sur la WP Query, on a vu comment jouer avec des centaines de paramètres. Si vous avez besoin de filtrer à partir de plusieurs champs ACF, vous pourriez alors faire une meta query encore plus complète.
Vous pourriez également créer des filtres très complexes basés sur l’auteur, la date de publication… afin d’afficher exactement les résultats que vous voulez.
Vous pouvez faire la même chose sur le champ Objet publication, auquel cas le hook serait acf/fields/post_object/query/
.
Cas 3 : afficher une donnée dans les résultats d’un champ
Et enfin, pour terminer, je vous propose un dernier hook qui va nous permettre de modifier la valeur affichée dans le champ.
On va reprendre le même exemple que précédemment afin d’ajouter la note à la suite du nom du jeu. Après tout ce serait super pratique de connaitre cette note lorsqu’on va faire notre sélection.
Le code PHP
Cette fois, c’est le hook acf/fields/relationship/result/
qui va nous être utile, car on veut intervenir seulement une fois les résultats obtenus.
Le hook nous renvoie pas mal d’informations, dont le texte qui sera affiché, la publication correspondante, les données sur le champ, et la publication dans laquel ce dernier se trouve.
Résultat
En rechargeant la page, on devrait voir les notes affichées à la suite des noms des jeux :
Plutôt pratique non ? Cette technique va vous permettre d’ajouter des données précieuses dans les résultats de vos champs ACF.
Grâce à ces hooks, vous pouvez aller encore plus loin avec les champs ACF, et manipuler les données qu’ils affichent.
On en a vu 3, mais il en existe bien sûr beaucoup d’autres, que je vous invite à découvrir dans la documentation officielle. Ils fonctionnent tous sur le même principe, donc vous devriez pouvoir les appréhender facilement.
Vous n’avez donc virtuellement plus aucune limite à ce que vous pouvez faire avec ACF et ses champs.
Maxim Hohengarte
Le 19 février 2024
Et si je veux cibler plus précisément un champ liste nommé « ma_liste » dans un groupe nommé « mon_groupe », je peux le faire directement dans le nom du filter ?
Maxime BJ
Le 19 février 2024
C’est dans le nom du hook justement, par exemple : acf/load_field/name=ma_liste. A ce niveau ACF ne fait pas de distinction sur les groupes. Il ne cherche que par le nom d’un champ. Si tu utilises ma_liste dans plusieurs groupes, toutes les listes seront alors impliquées.