Formation « Des champs administrables avec ACF »

Hooker les champs ACF pour modifier leurs valeurs

Lecture : 6 minutes • 2

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.

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 :

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.

Les paramètres de mon champ Compétences
La liste des choix est restée vide

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.

Les paramètres du champ compétences de la page d'options
Configuration du champ compétences de la page d’option

Parfait. Maintenant on va pouvoir aller saisir quelques compétences à partir de la page d’options ACF :

La page d'options, affichant le champ compétences
Le champ compétences dans la page d’options

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.

PHP
functions.php

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'].

PHP
functions.php

Grâce à ce code, on va définir les choix possibles de notre champ à partir des valeurs insérées dans la page options.

Conseil

N’hésitez pas à faire un petit var_dump() sur $field pour voir toutes les informations retournées par le champ.

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 :

Le champ select affiche bien les choix saisis dans la page d'options
Ce sont bien les informations que l’on a rentrées dans la page d’option

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.

Le type de publication Jeux avec le champ note
On retrouve un champ note dans le CPT Jeux

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.

La configuration du champ relationnel.
On limite au type de publication jeux vidéo

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.

PHP
functions.php

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.

Le champ relationnel affiche les jeux vidéos dont la note est supérieure à 16
Oups, désolé Cyberpunk, tu n’es pas affiché car ta note est trop basse

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.

Rappel

Les valeurs des champs ACF sont stockés dans les méta données d’une publication. C’est pour cela qu’on peut filtrer facilement les résultats d’une WP Query à partir de nos champs.

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.

PHP
functions.php

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.

À éviter

Le paramètre $post_id renvoie l’ID de la publication où est affichée le champ. Pour récupérer la note, on a besoin de l’ID du jeu, et c’est dans $post que vous la trouverez, d’où l’utilisation de $post->ID.

Résultat

En rechargeant la page, on devrait voir les notes affichées à la suite des noms des jeux :

On peut désormais apercevoir la note d'un jeu à la suite de son nom
On voit bien la note affichée à la suite du nom de chaque jeu

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.

2

Questions, réponses et commentaires

  1. 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 ?

    1. 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.

Laisser un commentaire