Autres tutoriels sur le sujet
- Soumettre des contenus WordPress sur mesure avec Gravity Forms et ACF
- WordPress :: Créer un widget Text Rotator avec ACF Pro et ACF Widgets
- WordPress :: Créer un widget Slick Slider avec ACF Pro et ACF Widgets
- WordPress :: Créer un widget avec ACF Pro et ACF Widgets
- WordPress :: Utiliser le champ Image d’ACF dans vos thèmes
- WordPress :: Comment forcer l’activation d’Advanced Custom Fields (ACF)
- ACF Pro :: Ajouter des pages d’options WordPress
- Créer une date internationalisable avec ACF
- WordPress :: Utiliser les cases à cocher d’Avanced Custom Fields (ACF)
- WordPress :: Créer des articles relatifs avec Advanced Custom Fields (ACF)
- WordPress :: Utilisation basique d’Advanced Custom Fields (ACF)
Dans ce tutoriel, nous verrons comme ne plus être aussi dépendant du plugin Advanced Custom Fields
Pourquoi ACF est devenu incontournable?
ACF, ou Advanced Custom Fields, est un plugin très utilisé dans la communauté WordPress. En résumé, il ajoute une interface ingénieuse et des options nombreuses pour gérer une fonction native de WordPress: les Custom Fields ou Champs personnalisés en français. Par défaut, la solution apportée dans le back-office devient vite très difficile à gérer.
Tout ce contenu, associé aux articles ou aux pages, est stocké dans la table post_meta
. Pour afficher ces données, ACF utilise de nouvelles fonctions, plus courtes à écrire, qui permettent d’afficher dans certains contextes des contenus flexibles (Flexible Content) pas exemple . Et c’est là que les soucis commencent.
Dans mon exemple, avec ACF, j’ajoute un simple champ texte, juste sous le titre. Je l’appelle Sous-titre et pour publier un article, je le rends obligatoire.
Sur le site, cela donnera dans les archives le résultat de la capture qui suit.
Les dépendances d’ACF
Ce sont toutes ces nouvelles fonctions créées par ACF (the_field
, get_field
, …) pour afficher les Custom Fields qui causeront des fatal error
dans le PHP au moment où vous, ou votre client, désactivez le plugin ACF. C’est lui qui déclare les fonctions. Si celui-ci n’est pas actif, ça casse et le résultat, selon votre configuration, donnera un message d’erreur ou un:e page blanche.
Dans mon thème qui repose sur le Framework Genesis, pour afficher mon sous-titre, j’utilise un simple Hook. Il placera la valeur du champ personnalisé sous le titre principal avec ce code:
add_action( 'genesis_entry_content', 'genesis_do_post_title', 9 );
add_action( 'genesis_entry_content', 'gn_archive_subtitle', 9);
Pour ceux qui connaissent Genesis, vous remarquerez qu’au passage, j’ai eu besoin de changer la place du titre et d’ajouter ce sous-titre juste après. Rassurez-vous, ce n’est pas essentiel dans le tutoriel.
La fonction normale d’ACF pour afficher le contenu sera dans mon cas::
// Function to display Subtitle
function gn_archive_subtitle() {
if ( get_field('gn_sous_titre') ) {
echo "<h3 class='entry-subtitle'>" . get_field('gn_sous_titre') . "</h3>";
}
}
Je commence par un conditionnel if ( get_field('gn_sous_titre') )
pour voir sir le champ est rempli et donc s’il existe. Si oui, j’affiche avececho
mon HTML et avec la fonction ACF get_field()
mon champ personnalisé gn_sous_titre
.
Pour ceux qui ne seraient pas sur Genesis, il suffira d’utiliser un code similaire à ce qui suit, dans votre modèle, sous la zone du titre. Pour le reste, la logique est la même.
if ( get_field('gn_sous_titre') ) {
echo "<h3 class='entry-subtitle'>" . get_field('gn_sous_titre') . "</h3>";
}
Jusque là, tout marche très bien juste au moment où, pour une raison ou une autre, le plugin est désactivé. Et là, j’aurai ce type de résultat:
Supprimer les dépendances à ACF
Au final, l’objectif de ce tutoriel est de garder le meilleur d’ACF, l’interface du front-office sans être dépendant des fonctions qu’il génère. J’utiliserai alors, pour afficher le sous-titre, les fonctions proposées par WordPress, tout en gardant la même clef utilisée par mon champ personnalisé, ici gn_sous_titre
. Cette clef a été générée au moment de la création de mon champ dans ACF.
Cela donnera:
// Function to display Subtitle
function gn_archive_subtitle() {
$gn_subtitle = esc_html( get_post_meta( get_the_ID(), 'gn_sous_titre', true) );
if ( $gn_subtitle ) {
echo "<h3 class='entry-subtitle'>{$gn_subtitle}</h3>";
}
}
- je stocke dans la variable
$gn_subtitle
les valeurs obtenues avec la fonction WordPressget_post_meta
- au passage, en j’application une sanatization (ou nettoyage) des valeurs.
- mon conditionnel
if ( $gn_subtitle )
vérifie si cette valeur existe - j’affiche directement les champs personnalisés stockés avec la variable
$gn_subtitle
Et voilà, avec ou sans plugin, tous les champs personnalisés enregistrés grâce à ACF continueront de fonctionner.
Pour les champs Repeater et les champs Flexible Content, je vous donnerai des solutions du même ordre dans un prochain tutoriel.
Quelques liens
- Remove frontend dependency from ACF – Bill Erickson. Très bon tutoriel de Bill Erickson qui m’a beaucoup inspiré.
- Function Reference/get post meta « WordPress Codex. Fonction complète pour obtenir le résultat des champs personnalisés
- fr:Fonction get post meta « WordPress Codex
- Data Validation « WordPress Codex. Pour les sanatization des données. Fonction WordPress pour sécuriser les données affichées.
- ACF { get_field(). Fonction
get_field
sur le site ACF - WordPress :: Utilisation basique d’Advanced Custom Fields (ACF). Tutoriel personnel
- WordPress :: utiliser les cases à cocher d’Avanced Custom Fields (ACF). Tutoriel personnel
26 réponses
C’est pas plus simple de vérifier si the_field ou get_field existent et des les recoder ?
Oui à la rigueur mais comment fais-tu pour les repeater et les flexible?
Et tu ajoutes une autre fonction…
Un tuto 🙂 ?
Article intéressant. Personnellement, je n’utilise pas ACF : je préfère utiliser un petit framework comme https://github.com/WebDevStudios/Custom-Metaboxes-and-Fields-for-WordPress, qui convient parfaitement dans la plupart des cas et qui ne nécessite pas l’appel à des fonctions spécifiques.
Merci. J’ai testé la version 2. C’est super mais je vais beaucoup plus vite et j’ai beaucoup plus d’options avec ACF.
T’as déjà eu un client qui désactive ACF ?
Non par contre, parfois tu dois désactiver tous les plugins pour chercher un bug. Et tant que possible, j’essaye de ne pas trop être trop lié à une extension.
Exact pour la recherche de bug.
Excellent article, qui met l’accent, au delà de l’exemple ACF, sur cette bonne pratique qui consiste à faire un site le moins dépendant possible de ses plugins pour son bon fonctionnement.
On attend avec impatience la suite sur les champs repeater et flexibe content!
Merci. Je compte intégrer des repeater et des flexible sur @veryfrenchtrip en suivant le même principe. Ce sera la base de mon article
[…] Grégoire explique comment on peut se détacher de l’extension ACF. […]
En terme d’architecture logicielle, limiter la dépendance à un outil tiers est une bonne idée mais si c’est pour en contrepartie, bypasser l’api fournie et attaquer directement la structure de données là le gain est bien inférieur à ce qu’on perd en terme de d’archi propre (imaginons un plugin tiers qui apporte des optimisations de cache à ses fonctions, imaginons que la prochaine version d’ACF change de structure de données et utilise sa propre table )
Je suis d’accord avec toi. Sauf que dans ce cas précis, ACF sauvegarde des post_meta dans la table du même nom. Du coup, on prend peu de risque.
Hello,
Je ne connais pas bien ACF car j’utilise le plugin Piklist pour gérer mes metaboxes et champs personnalisés.
Le but de mon message n’est pas de dire que l’un est meilleur que l’autre mais pour info Piklist récupère les données avec les fonctions WordPress (get_post_meta() et get_options() …) donc ce problème ne se pose pas.
Hello Gilles
Merci, je ne connaissais pas Piklist. Je l’ai ajouté à ma liste
Pour ceux que ça intéresse, je fais un atelier sur Piklist au WPTech de Nantes le 30 novembre 2014.
Oups dommage, je ne pourrai pas y être.
Ne veux-tu pas proposer qqchose sur le sujet au wcparis 2015?
Bonjour,
Joli tutoriel, intéressant. Vous n’auriez pas envie d’en faire un sur « comment passer une variable existante dans $_GET dans un écran acf_form pour la retrouver dans l’article en cours de création » ?
Non je plaisant bien entendu.
Mais vos tutoriels ont l’air intéressants. Je vais suivre.
Cordialement,
Bonjour Grégoire,
J’ai testé get_post_meta sur un champ de type éditeur mais la fonction ne garde pas la structure du contenu. Si j’ai trois paragraphes dans mon champ, je me retrouve avec un paragraphe alors que get_field garde la structure. Y-a-t-il une astuce ?
Merci
Bonjour Claire
Je n’ai pas encore testé avec tous les champs, dont le champs éditeur. Il faudrait voir comment ACF stocke dans la base.
Le premier qui trouve partage l’information 🙂
Claire, essaye la fonction décrite dans le tutoriel, voir le codex pour plus d’info.
OK je vais faire encore des tests et je vais scruter la base pour essayer de comprendre et je te dis. Merci.
Ce que j’ai vu dans le tutoriel (voir commentaire précédent) devrait suffire.
Voilà un code qui fonctionne :
J’utilise la fonction apply_filters avec le tag the_content :
$gn_subtitle = apply_filters('the_content', get_post_meta( get_the_ID(), 'gn_sous_titre', true));
echo $gn_subtitle;
et les balises html sont conservées.
Merci Claire pour ce partage. Et
echo get_post_meta($post->ID, "my_field", true);?>
ne fonctionnait pas?Non, si je n’applique pas la fonction apply_filters, je n’ai plus les balises html générées, suite à la structuration de mon contenu dans le champ ACF de type éditeur. Peut-être que cela vient de la fonction get_post_meta qui doit faire une transformation ?
Je vais essayer de tester avec les autres types de champs acf pour vérifier. Ou mettre le nez dans le code de la fonction pour comprendre !
Merci pour toutes ces informations Claire. Je vais aussi tester de mon côté.