{"id":234260,"date":"2023-02-23T17:22:00","date_gmt":"2023-02-23T14:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234260"},"modified":"2022-11-12T02:37:24","modified_gmt":"2022-11-11T23:37:24","slug":"reference-complete-pour-lajout-de-groupes-de-champs-personnalises-avances-et-de-champs-par-code","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/reference-complete-pour-lajout-de-groupes-de-champs-personnalises-avances-et-de-champs-par-code\/","title":{"rendered":"R\u00e9f\u00e9rence compl\u00e8te pour l&rsquo;ajout de groupes de champs personnalis\u00e9s avanc\u00e9s et de champs par code"},"content":{"rendered":"\n<p>Le plugin <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) prend enti\u00e8rement en charge la configuration des champs et des groupes par code PHP dans votre th\u00e8me ou plugin. L&rsquo;avantage de cela est que tous vos champs seront disponibles quelle que soit l&rsquo;instance WordPress sur laquelle vous travaillez (par exemple, si vous devez basculer entre le serveur local, le serveur de test et le serveur en direct). Vous pouvez configurer tous les champs dans l&rsquo;administrateur d&rsquo;ACF et utiliser l&rsquo;outil d&rsquo;exportation pour l&rsquo;exporter vers PHP.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151957-61e4d1b8bd642.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151957-61e4d1b8bd642.png\" alt=\"R\u00e9f\u00e9rence compl\u00e8te pour l&#039;ajout de groupes de champs personnalis\u00e9s avanc\u00e9s et de champs par code\" ><\/a><\/p>\n<p>Cependant, si vous le faites fr\u00e9quemment, vous remarquerez peut-\u00eatre que l&rsquo;exportation PHP d&rsquo;ACF contient beaucoup de code, ce qui rend vos fichiers PHP inutilement longs. Dans certains cas, il est pr\u00e9f\u00e9rable d&rsquo;\u00e9crire le code vous-m\u00eame, avec le strict minimum n\u00e9cessaire, pour un code plus propre dans votre th\u00e8me ou plugin. Ce guide vise \u00e0 vous fournir une r\u00e9f\u00e9rence compl\u00e8te sur la fa\u00e7on d&rsquo;\u00e9crire manuellement l&rsquo;ajout de champs et de groupes ACF en PHP. Veuillez noter qu&rsquo;il n&rsquo;entrera pas dans les d\u00e9tails de chaque type de champ car il suppose que vous \u00eates d\u00e9j\u00e0 familiaris\u00e9 avec les diff\u00e9rents champs possibles dans ACF.<\/p>\n<h2>Mais d&rsquo;abord; quelques pr\u00e9cautions<\/h2>\n<p>Pour maintenir de bonnes normes de code et vous assurer que votre site WordPress ne plantera pas, vous devez toujours v\u00e9rifier si les fonctions ou les classes que votre code utilise existent r\u00e9ellement. Surtout quand il s&rsquo;agit de plugins qui peuvent \u00eatre facilement d\u00e9sactiv\u00e9s ou m\u00eame pas install\u00e9s sur un site, vous devez toujours envelopper votre code sp\u00e9cifique au plugin dans un test if qui v\u00e9rifie si les fonctions que vous utilisez existent, avant de les utiliser.<\/p>\n<p>Quant \u00e0 ACF, vous pouvez le faire en v\u00e9rifiant si la classe <code>'acf'<\/code>existe ou si la fonction d&rsquo;ajout de champs et de groupes, <code>'acf_add_local_field_group'<\/code>, existe. Enveloppez l&rsquo;un ou l&rsquo;autre de ceux autour du code ci-dessous.<\/p>\n<pre><code>if (function_exists('acf_add_local_field_group')) {\n    \/\/ Your ACF specific code here\n}\n\/\/ OR:\nif (class_exists('acf')) {\n    \/\/ Your ACF specific code here\n}<\/code><\/pre>\n<h2>Code squelette<\/h2>\n<p>Pour ajouter des bo\u00eetes m\u00e9ta (groupes) et des champs, nous utilisons le crochet nomm\u00e9 <code>acf\/init<\/code>. A l&rsquo;int\u00e9rieur de la fonction, nous appelons la fonction <code>acf_add_local_field_group()<\/code>avec un tableau comme param\u00e8tre. \u00c0 l&rsquo;int\u00e9rieur de ce tableau se trouve la configuration compl\u00e8te du groupe et de tous ses champs. Les plus importantes sont les cl\u00e9s de tableau <code>'fields'<\/code>et <code>'location'<\/code>. Pour la cl\u00e9 de tableau, <code>'fields'<\/code>vous fournissez le tableau pour tous les champs, et pour la cl\u00e9 <code>'location'<\/code>, vous fournissez les param\u00e8tres de l&rsquo;endroit o\u00f9 la m\u00e9tabox doit appara\u00eetre. Cet article d\u00e9taillera les options possibles que vous avez pour chacun de ces \u00e9l\u00e9ments ci-dessous.<\/p>\n<p>C&rsquo;est le strict minimum pour ajouter un groupe, mis \u00e0 part les champs et l&#8217;emplacement\u00a0:<\/p>\n<pre><code>add_action('acf\/init', function() {\n    acf_add_local_field_group([\n        'key' =&gt; 'group_my_fields',\n        'title' =&gt; __('My fields', 'txtdomain'),\n        'label_placement' =&gt; 'top',\n        'menu_order' =&gt; 0,\n        'style' =&gt; 'default',\n        'position' =&gt; 'normal',\n        'fields' =&gt; [],\n        'location' =&gt; [],\n    ]);\n});<\/code><\/pre>\n<p>Chaque groupe a besoin d&rsquo;une cl\u00e9 unique, mais le nom lui-m\u00eame n&rsquo;a pas beaucoup d&rsquo;importance (pour nous). Si vous ajoutez d&rsquo;autres groupes, n&rsquo;oubliez pas de modifier le <code>'key'<\/code>champ. Le titre de la m\u00e9tabox peut \u00eatre d\u00e9fini dans l&rsquo;\u00e9l\u00e9ment cl\u00e9 du tableau, vous l&rsquo;avez devin\u00e9, <code>'title'<\/code>. Si vous ajoutez plusieurs m\u00e9taboxes au m\u00eame emplacement (par exemple en post-\u00e9dition), vous pouvez contr\u00f4ler laquelle vient en premier en fournissant des num\u00e9ros diff\u00e9rents dans <code>'menu_order'<\/code>.<\/p>\n<p>Vous pouvez contr\u00f4ler la conception de la m\u00e9tabox en fournissant soit <code>default<\/code>eller <code>seamless<\/code>dans <code>'style'<\/code>. Cependant, avec le nouvel \u00e9diteur Gutenberg, cela a beaucoup moins d&rsquo;importance. Il en va de m\u00eame pour la cl\u00e9 <code>'position'<\/code>o\u00f9, autrefois, vous pouviez positionner la m\u00e9tabox sous le contenu du message (<code>'normal'<\/code>), sur le c\u00f4t\u00e9 (<code>'side'<\/code>) ou juste apr\u00e8s le titre du message (<code>'acf_after_title'<\/code>).<\/p>\n<p>Tr\u00e8s bien! Plongeons-nous dans les deux \u00e9l\u00e9ments les plus int\u00e9ressants du tableau\u00a0; en commen\u00e7ant par l&#8217;emplacement &#8211; qui d\u00e9finit o\u00f9 la m\u00e9tabox appara\u00eet.<\/p>\n<h2>Emplacement<\/h2>\n<p>Tout d\u00e9pend de ce que vous mettez dans la cl\u00e9 <code>'location'<\/code>. Mais avant d&rsquo;examiner les options possibles, nous devons comprendre sa structure de tableau.<\/p>\n<p><code>'location'<\/code>accepte un tableau avec un tableau d&rsquo;\u00e9l\u00e9ments dans un tableau\u00a0! Tenir bon. Oui, car il est possible de fournir et de combiner la logique ET et OU \u00e0 l&#8217;emplacement (par exemple &quot;afficher dans la publication mais pas si le type de publication est &lsquo;livre&rsquo;&quot;, ou &quot;afficher dans l&rsquo;\u00e9cran d&rsquo;\u00e9dition de l&rsquo;utilisateur et \u00e9galement cr\u00e9er un nouvel \u00e9cran utilisateur mais pour les deux cas pas si le r\u00f4le actuel est auteur&quot;). La fa\u00e7on dont vous signifiez s&rsquo;il s&rsquo;agit d&rsquo;un ET ou d&rsquo;un OU consiste \u00e0 structurer les tableaux. C&rsquo;est beaucoup plus facile \u00e0 montrer qu&rsquo;\u00e0 expliquer avec des mots\u00a0:<\/p>\n<p>Voici comment vous combinez deux \u00e9l\u00e9ments de localisation avec la logique ET (les deux doivent \u00eatre vrais) :<\/p>\n<pre><code>'location' =&gt; [\n    [\n        [\n            \/\/ location 1\n        ],\n        [\n            \/\/ location 2\n        ]\n    ]\n]<\/code><\/pre>\n<p>Et c&rsquo;est pour combiner des emplacements avec la logique OU (un seul doit \u00eatre vrai):<\/p>\n<pre><code>'location' =&gt; [\n    [\n        [\n            \/\/ location 1\n        ]\n    ],\n    [\n        [\n            \/\/ location 2\n        ]\n    ]\n]<\/code><\/pre>\n<p>Regarde la diff\u00e9rence?<\/p>\n<p>OK, passons \u00e0 autre chose. Chaque option d&#8217;emplacement se compose d&rsquo;un tableau de trois \u00e9l\u00e9ments\u00a0; <code>'param'<\/code>c&rsquo;est l\u00e0 que nous ajoutons tous les diff\u00e9rents emplacements, <code>'operator'<\/code>, et <code>'value'<\/code>. L&rsquo;op\u00e9rateur est de savoir comment comparer la valeur, et il peut \u00eatre <code>'=='<\/code>\u00e9gal ou <code>'!='<\/code>non \u00e9gal \u00e0.<\/p>\n<p>Passons en revue les options possibles une par une.<\/p>\n<h3>Localisation par type de poste<\/h3>\n<pre><code>[\n    'param' =&gt; 'post_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'post'\n]<\/code><\/pre>\n<p>D\u00e9finissez le type de publication souhait\u00e9 dans <code>'value'<\/code>. Gardez \u00e0 l&rsquo;esprit que vous ne pouvez pas fournir un tableau de plusieurs types de publication, vous devez combiner plusieurs de ces tableaux dans une configuration ET.<\/p>\n<h3>Localisation par statut de poste<\/h3>\n<pre><code>[\n    'param' =&gt; 'post_status',\n    'operator' =&gt; '==',\n    'value' =&gt; 'publish'\n]<\/code><\/pre>\n<p>D\u00e9finissez le statut de publication souhait\u00e9 sur <code>'value'<\/code>. Encore une fois, gardez \u00e0 l&rsquo;esprit que vous ne pouvez pas fournir un tableau de plusieurs statuts de publication, vous devrez fournir chaque valeur souhait\u00e9e dans une configuration AND ou OR.<\/p>\n<h3>Emplacement par mod\u00e8le de page<\/h3>\n<pre><code>[\n    'param' =&gt; 'page_template',\n    'operator' =&gt; '==',\n    'value' =&gt; 'template-name.php'\n]<\/code><\/pre>\n<p>Cela ne s&rsquo;affiche que si la page s\u00e9lectionn\u00e9e (ou le type de publication personnalis\u00e9 avec prise en charge du mod\u00e8le de page) a choisi le nom de mod\u00e8le de page fourni.<\/p>\n<h3>Emplacement par terme de taxonomie attribu\u00e9<\/h3>\n<pre><code>\/\/ Post category only\n[\n    'param' =&gt; 'post_category',\n    'operator' =&gt; '==',\n    'value' =&gt; 'category:some-category-slug'\n]\n\/\/ Any taxonomy\n[\n    'param' =&gt; 'post_taxonomy',\n    'operator' =&gt; '==',\n    'value' =&gt; 'my_custom_taxonomy:some-category-slug'  \/\/ &lt;taxonomy name&gt;:&lt;term slug&gt;\n]<\/code><\/pre>\n<p>Cet emplacement est utilis\u00e9 lorsqu&rsquo;un message est associ\u00e9 \u00e0 un terme sp\u00e9cifique. Vous devrez fournir le nom de la taxonomie, deux-points et le slug du terme comme valeur.<\/p>\n<h3>Emplacement par type de page<\/h3>\n<p>ACF regroupe les propri\u00e9t\u00e9s sp\u00e9ciales des pages en \u00abtype de page \u00bb. Il s&rsquo;agit principalement de savoir si la page actuelle est ou non une page parent ou enfant, mais aussi de cibler des pages d\u00e9finies comme page d&rsquo;accueil WordPress ou page de blog.<\/p>\n<pre><code>\/\/ Front page\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'front_page'\n]\n\/\/ Posts page\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'posts_page'\n]\n\/\/ Top level page only\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'top_level'\n]\n\/\/ Top level page that has children\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'parent'\n]\n\/\/ Children level pages\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'children'\n]<\/code><\/pre>\n<h3>Emplacement\u00a0: taxonomie<\/h3>\n<p>Emplacement \u00e0 utiliser lors de la modification ou de l&rsquo;ajout d&rsquo;un terme dans une taxonomie.<\/p>\n<pre><code>[\n    'param' =&gt; 'taxonomy',\n    'operator' =&gt; '==',\n    'value' =&gt; 'category'  \/\/ Or 'all' for all taxonomies\n]<\/code><\/pre>\n<p>Indiquez le nom de la taxonomie sous la forme <code>'value'<\/code>. Gardez \u00e0 l&rsquo;esprit que vous ne pouvez pas fournir un tableau de plusieurs taxonomies, mais vous pouvez fournir <code>'all'<\/code>pour cibler toutes les taxonomies.<\/p>\n<h3>Emplacement\u00a0: utilisateur<\/h3>\n<p>Cet emplacement permet d&rsquo;ajouter ou de modifier un profil d&rsquo;utilisateur.<\/p>\n<pre><code>[\n    'param' =&gt; 'user_form',\n    'operator' =&gt; '==',\n    'value' =&gt; 'all'  \/\/ 'edit' || 'register'\n]<\/code><\/pre>\n<p>Indiquez <code>'edit<\/code>&lsquo; pour cibler uniquement l&rsquo;\u00e9cran de modification des utilisateurs existants, <code>'register'<\/code>pour cibler uniquement le formulaire lors de l&rsquo;enregistrement d&rsquo;un nouvel utilisateur, ou &lsquo; <code>all'<\/code>pour les deux \u00e9l\u00e9ments ci-dessus.<\/p>\n<h3>Emplacement\u00a0: \u00e9l\u00e9ment de menu<\/h3>\n<p>Depuis ACF 5.6, vous pouvez \u00e9galement ajouter des groupes de champs aux \u00e9l\u00e9ments de menu.<\/p>\n<pre><code>[\n    'param' =&gt; 'nav_menu_item',\n    'operator' =&gt; '==',\n    'value' =&gt; 'all'\n]<\/code><\/pre>\n<p>Vous pouvez configurer <code>value<\/code>pour <code>all<\/code>appliquer le groupe \u00e0 tous les \u00e9l\u00e9ments de menu, ou vous pouvez sp\u00e9cifier des menus soit par emplacement (emplacements enregistr\u00e9s dans votre th\u00e8me) soit par ID de menu. Pour l&rsquo;utilisation de l&#8217;emplacement <code>'location\/&lt;name&gt;'<\/code>&#8211; ainsi, pour un emplacement nomm\u00e9 &lsquo; <code>primary<\/code>&lsquo;, vous pouvez d\u00e9finir la valeur sur <code>'location\/primary'<\/code>pour appliquer votre groupe \u00e0 un menu attribu\u00e9 \u00e0 cet emplacement uniquement. Si vous souhaitez cibler un ID de menu sp\u00e9cifique, d\u00e9finissez la valeur sur une cha\u00eene de cet ID.<\/p>\n<h3>Emplacement: Widget<\/h3>\n<p>ACF vous fournit m\u00eame un emplacement dans les param\u00e8tres du widget sans modifier le code du widget principal.<\/p>\n<pre><code>[\n    'param' =&gt; 'widget',\n    'operator' =&gt; '==',\n    'value' =&gt; 'tag_cloud'  \/\/ or 'all' for all widgets\n]<\/code><\/pre>\n<p>Vous pouvez cibler tous les widgets avec <code>'all'<\/code>as <code>'value'<\/code>ou cibler un widget sp\u00e9cifique. Vous aurez besoin de conna\u00eetre \u00abl&rsquo;ID interne\u00bb du widget avec lequel ils sont enregistr\u00e9s.<\/p>\n<h3>Emplacement\u00a0: page Options ACF (Pro uniquement)<\/h3>\n<p>Avec ACF Pro, vous pouvez utiliser ACF pour configurer des pages d&rsquo;administration personnalis\u00e9es.<\/p>\n<pre><code>[\n    'param' =&gt; 'options_page',\n    'operator' =&gt; '==',\n    'value' =&gt; 'acf-options-myoptionspage'\n]<\/code><\/pre>\n<p>Indiquez le nom que vous avez d\u00e9fini <code>acf_add_options_page<\/code>dans <code>menu_slug<\/code>as <code>'value'<\/code>.<\/p>\n<h3>Emplacement\u00a0: bloc (Pro 5.8+ uniquement)<\/h3>\n<p>ACF Pro (5.8+) a une fonctionnalit\u00e9 pour ajouter des blocs Gutenberg avec des champs d&rsquo;ACF et contr\u00f4ler sa sortie avec PHP. Assez astucieux pour ceux qui n&rsquo;ont pas encore plong\u00e9 dans l&rsquo;ajout de blocs Gutenberg personnalis\u00e9s et du Javascript requis.<\/p>\n<pre><code>[\n    'param' =&gt; 'block',\n    'operator' =&gt; '==',\n    'value' =&gt; 'acf\/cta'  \/\/ or 'all' for all ACF blocks\n]<\/code><\/pre>\n<hr \/>\n<h2>Des champs<\/h2>\n<p>Nous entrons maintenant dans la partie la plus int\u00e9ressante; les champs eux-m\u00eames. ACF propose une (vraiment) large gamme de types de champs, et je le r\u00e9p\u00e8te\u00a0; ce guide ne vous montre pas ce qu&rsquo;est chaque champ et comment ils fonctionnent ou ressemblent.<\/p>\n<p>Dans le tableau de base que vous fournissez <code>'fields'<\/code>, <code>acf_add_local_field_group()<\/code>vous fournissez un tableau o\u00f9 chaque champ est son propre tableau.<\/p>\n<p>Le minimum absolu requis pour chaque champ est le suivant\u00a0: un unique <code>'key'<\/code>qui peut \u00eatre tout ce que vous voulez et vous n&rsquo;aurez probablement jamais besoin de vous y r\u00e9f\u00e9rer. Vous avez \u00e9galement besoin <code>'name'<\/code>de la cl\u00e9 m\u00e9ta (post, user, term) dans laquelle la valeur du champ est enregistr\u00e9e &#8211; et c&rsquo;est celle \u00e0 laquelle vous vous r\u00e9f\u00e9rerez lors de l&rsquo;obtention de la valeur des champs. Vous devez fournir un <code>'label'<\/code>et enfin le crucial <code>'type'<\/code>qui d\u00e9finit le type de champ que nous traitons. Le reste des champs d\u00e9pend de, <code>'type'<\/code>comme nous le verrons lorsque nous passerons en revue chaque type de champ ci-dessous.<\/p>\n<p>Il s&rsquo;agit du code squelette pour ajouter un champ.<\/p>\n<pre><code>'fields' = [\n    [\n        'key' =&gt; 'field_my_field',\n        'label' =&gt; __('My field', 'txtdomain'),\n        'name' =&gt; 'my_field',\n        'type' =&gt; 'text',\n    ]\n]<\/code><\/pre>\n<p>Gardez \u00e0 l&rsquo;esprit que vous aurez besoin de ce qui pr\u00e9c\u00e8de pour chaque champ, mais pour ne pas r\u00e9p\u00e9ter le m\u00eame code, chaque type de champ ci-dessous n&rsquo;inclura <code>'type'<\/code>que tous les autres \u00e9l\u00e9ments n\u00e9cessaires pour ce type de champ.<\/p>\n<h3>Champ: Saisie de texte<\/h3>\n<p>Le champ le plus simple de tous. Tout ce dont nous avons vraiment besoin est :<\/p>\n<pre><code>[\n    'type' =&gt; 'text',\n]<\/code><\/pre>\n<p>Mais pour personnaliser davantage votre saisie de texte, vous pouvez \u00e9galement fournir l&rsquo;un des \u00e9l\u00e9ments suivants\u00a0:<\/p>\n<pre><code>[\n    'default_value' =&gt; 'Default value',\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Champ: Saisie num\u00e9rique<\/h3>\n<pre><code>[\n    'type' =&gt; 'number',\n    'min' =&gt; 0,\n    'max' =&gt; 100,\n    'step' =&gt; 1,\n    'default_value' =&gt; 'Default value',\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Champ\u00a0: zone de texte<\/h3>\n<pre><code>[\n    'type' =&gt; 'textarea',\n    'rows' =&gt; 5,\n    'new_lines' =&gt; 'wpautop',  \/\/ 'br' || ''\n    'default_value' =&gt; 'Default value',\n]<\/code><\/pre>\n<h3>Champ\u00a0: Curseur de plage<\/h3>\n<pre><code>[\n    'type' =&gt; 'range',\n    'min' =&gt; 0,\n    'max' =&gt; 100,\n    'step' =&gt; 1,\n    'default_value' =&gt; 50,\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Champ\u00a0: Mot de passe<\/h3>\n<p>Identique \u00e0 la saisie de texte, sauf que tout ce que vous y tapez sera couvert de * comme vous vous en doutez dans un champ de mot de passe.<\/p>\n<pre><code>[\n    'type' =&gt; 'password',\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Champ\u00a0: Image<\/h3>\n<p>S\u00e9lection d&rsquo;une seule image.<\/p>\n<pre><code>[\n    'type' =&gt; 'image',\n    'return_format' =&gt; 'array',  \/\/ 'id' || 'url'\n    'preview_size' =&gt; 'thumbnail',\n]<\/code><\/pre>\n<h3>Champ\u00a0: Fichier<\/h3>\n<p>Similaire \u00e0 l&rsquo;image ci-dessus, sauf qu&rsquo;elle ne pr\u00e9visualise pas le fichier.<\/p>\n<pre><code>[\n    'type' =&gt; 'file',\n    'return_format' =&gt; 'array',  \/\/ 'id' || 'url'\n]<\/code><\/pre>\n<p>Vous pouvez \u00e9galement le fournir <code>'mime_types' =&gt; '',<\/code>et le d\u00e9finir, par exemple, <code>'pdf,docx'<\/code>pour autoriser uniquement les fichiers PDF et DOCX.<\/p>\n<h3>Champ\u00a0: \u00c9diteur WYSIWYG<\/h3>\n<p>WYSIWYG est un \u00e9diteur \u00abWhat You See Is What You Get\u00bb \u2013 celui que nous connaissions avant l&rsquo;arriv\u00e9e de Gutenberg (TinyMCE).<\/p>\n<pre><code>[\n    'type' =&gt; 'wysiwyg',\n    'tabs' =&gt; 'all',  \/\/ 'visual' || 'text'\n    'toolbar' =&gt; 'full',  \/\/ 'basic'\n    'media_upload' =&gt; 1,\n    'delay' =&gt; 0,\n]<\/code><\/pre>\n<p>Le param\u00e8tre <code>'media_upload'<\/code>et <code>'delay'<\/code>peut \u00eatre 1 (vrai) ou 0 (faux).<\/p>\n<h3>Champ: S\u00e9lectionnez<\/h3>\n<pre><code>[\n    'type' =&gt; 'select',\n    'allow_null' =&gt; 1,\n    'multiple' =&gt; 0,\n    'ui' =&gt; 1,\n    'return_format' =&gt; 'value',  \/\/ 'array' || 'label'\n    'choices' =&gt; [\n        'red' =&gt; __('Red color', 'txtdomain'),\n        'blue' =&gt; __('Blue color', 'txtdomain')\n    ],\n    'default_value' =&gt; 'red',\n]<\/code><\/pre>\n<h3>Champ: Case \u00e0 cocher<\/h3>\n<pre><code>[\n    'type' =&gt; 'checkbox',\n    'layout' =&gt; 'horizontal',  \/\/ 'vertical'\n    'toggle' =&gt; 0,\n    'return_format' =&gt; 'value',  \/\/ 'array' || 'label'\n    'choices' =&gt; [\n        'red' =&gt; __('Red color', 'txtdomain'),\n        'blue' =&gt; __('Blue color', 'txtdomain')\n    ],\n    'default_value' =&gt; ['red'],\n    'allow_custom' =&gt; 1,\n    'save_custom' =&gt; 0,\n]<\/code><\/pre>\n<p>Notez qu&rsquo;il <code>'default_value'<\/code>peut s&rsquo;agir d&rsquo;un tableau de choix multiples.<\/p>\n<h3>Champ: bouton radio<\/h3>\n<pre><code>[\n    'type' =&gt; 'radio',\n    'layout' =&gt; 'horizontal',  \/\/ 'vertical'\n    'allow_null' =&gt; 0,\n    'return_format' =&gt; 'value',  \/\/ 'array' || 'label'\n    'choices' =&gt; [\n        'red' =&gt; __('Red color', 'txtdomain'),\n        'blue' =&gt; __('Blue color', 'txtdomain')\n    ],\n    'default_value' =&gt; 'red',\n    'other_choice' =&gt; 1,\n    'save_other_choice' =&gt; 0,\n]<\/code><\/pre>\n<p>Le r\u00e9glage <code>'other_choice'<\/code>sur true ajoute un bouton radio suppl\u00e9mentaire intitul\u00e9 &quot;Autre&quot; avec une entr\u00e9e de texte o\u00f9 l&rsquo;utilisateur peut taper quelque chose.<\/p>\n<h3>Champ: vrai\/faux (bascule)<\/h3>\n<pre><code>[\n    'type' =&gt; 'true_false',\n    'message' =&gt; __('Text after toggler', 'txtdomain'),\n    'default_value' =&gt; 1,\n    'ui' =&gt; 1,\n    'ui_on_text' =&gt; __('Yes', 'txtdomain'),\n    'ui_off_text' =&gt; __('No', 'txtdomain'),\n]<\/code><\/pre>\n<p>Le <code>'ui_on_text'<\/code>et <code>'ui_off_text'<\/code>n&rsquo;est valide que si <code>'ui'<\/code>vaut 1, car ils d\u00e9finissent ce qui doit appara\u00eetre sur le basculeur sp\u00e9cial de l&rsquo;interface utilisateur.<\/p>\n<h3>Champ: Lien<\/h3>\n<p>Vous donne un bouton pour entrer un lien, soit en tapant, soit en choisissant parmi le contenu de votre site WordPress (devrait \u00eatre familier avec l&rsquo;ajout d&rsquo;un lien dans l&rsquo;\u00e9diteur WordPress normal).<\/p>\n<pre><code>[\n    'type' =&gt; 'link',\n    'return_format' =&gt; 'url',  \/\/ 'array'\n]<\/code><\/pre>\n<h3>Champ\u00a0: Publier un objet<\/h3>\n<p>Donne une bo\u00eete de s\u00e9lection o\u00f9 vous pouvez choisir parmi le contenu WordPress. La s\u00e9lection vous permet de rechercher en tapant et tout le contenu est divis\u00e9 par type de publication. Vous pouvez autoriser la s\u00e9lection de plusieurs publications ou d&rsquo;une seule.<\/p>\n<pre><code>[\n    'type' =&gt; 'post_object',\n    'allow_null' =&gt; 1,\n    'multiple' =&gt; 0,\n    'return_format' =&gt; 'object',  \/\/ 'id'\n    'post_type' =&gt; '',  \/\/ or array of post types e.g. ['post', 'page']\n    'taxonomy' =&gt; '',  \/\/ or array of terms e.g. ['category:term-slug']\n]<\/code><\/pre>\n<h3>Champ\u00a0: Relation<\/h3>\n<pre><code>[\n    'type' =&gt; 'relationship',\n    'return_format' =&gt; 'object',  \/\/ 'id'\n    'post_type' =&gt; '',  \/\/ or array of post types e.g. ['post', 'page']\n    'taxonomy' =&gt; '',  \/\/ or array of terms e.g. ['category:term-slug']\n    'elements' =&gt; ['featured_image'],  \/\/ or ''\n    'filters' =&gt; ['search', 'post_type', 'taxonomy'],\n]<\/code><\/pre>\n<h3>Champ\u00a0: choisir des termes dans une taxonomie<\/h3>\n<p>Le s\u00e9lecteur de termes de taxonomie a quatre &quot;modes&quot; ou types diff\u00e9rents o\u00f9 deux d&rsquo;entre eux permettent des choix multiples.<\/p>\n<pre><code>[\n    'type' =&gt; 'taxonomy',\n    'return_format' =&gt; 'object',  \/\/ 'id'\n    'taxonomy' =&gt; 'category',\n    'field_type' =&gt; 'select',  \/\/ 'checkbox' || 'radio' || 'multi_select'\n    'add_term' =&gt; 0,\n    'save_terms' =&gt; 0,\n]<\/code><\/pre>\n<h3>Champ\u00a0: s\u00e9lectionnez l&rsquo;utilisateur<\/h3>\n<pre><code>[\n    'type' =&gt; 'user',\n    'return_format' =&gt; 'array',  \/\/ 'object' || 'id\n    'role' =&gt; '',  \/\/ or array of roles, e.g. ['author']\n    'allow_null' =&gt; 1,\n    'multiple' =&gt; 0,\n]<\/code><\/pre>\n<h3>Champ: Google Maps<\/h3>\n<pre><code>[\n    'type' =&gt; 'google_map',\n    'center_lat' =&gt; '59.917',\n    'center_lng' =&gt; '10.727',\n    'zoom' =&gt; 14,\n    'height' =&gt; 350,\n]<\/code><\/pre>\n<p>Gardez \u00e0 l&rsquo;esprit que vous devez fournir une cl\u00e9 d&rsquo;API GoogleMaps valide \u00e0 ACF pour que ce champ fonctionne, comme ceci\u00a0:<\/p>\n<pre><code>add_filter('acf\/fields\/google_map\/api', function($api) {\n    $api['key'] = 'YOURAPIKEY';\n    return $api;\n});<\/code><\/pre>\n<h3>Champ\u00a0: S\u00e9lecteur de date<\/h3>\n<pre><code>[\n    'type' =&gt; 'date_picker',\n    'display_format' =&gt; 'd\/m\/Y',\n    'return_format' =&gt; 'Y-m-d',\n    'first_day' =&gt; 1,\n]<\/code><\/pre>\n<h3>Champ\u00a0: S\u00e9lecteur de date et d&rsquo;heure<\/h3>\n<pre><code>[\n    'type' =&gt; 'date_time_picker',\n    'display_format' =&gt; 'd\/m\/Y H:i:s',\n    'return_format' =&gt; 'Y-m-d H:i:s',\n    'first_day' =&gt; 1,\n]<\/code><\/pre>\n<h3>Champ\u00a0: S\u00e9lecteur de temps<\/h3>\n<pre><code>[\n    'type' =&gt; 'time_picker',\n    'display_format' =&gt; 'H:i',\n    'return_format' =&gt; H:i',\n]<\/code><\/pre>\n<h3>Champ: S\u00e9lecteur de couleurs<\/h3>\n<pre><code>[\n    'type' =&gt; 'color_picker',\n    'default_value' =&gt; '',  \/\/ or any hex code, e.g. '#FFFFFF'\n]<\/code><\/pre>\n<h3>Champ: Galerie (ACF Pro uniquement)<\/h3>\n<pre><code>[\n    'type' =&gt; 'gallery',\n    'return_format' =&gt; 'array',  \/\/ 'id' || 'url'\n    'preview_size' =&gt; 'thumbnail',\n    'insert' =&gt; 'append',  \/\/ 'prepend'\n]<\/code><\/pre>\n<h3>Types de champs sp\u00e9ciaux<\/h3>\n<p>ACF propose \u00e9galement certains types de champs qui n&rsquo;enregistrent pas de valeur en soi, mais ils sont davantage destin\u00e9s \u00e0 des fins organisationnelles. Pour tous ceux-ci, d\u00e9finissez <code>'name'<\/code>une cha\u00eene vide.<\/p>\n<h4>Message HTML<\/h4>\n<p>Si vous avez simplement besoin d&rsquo;imprimer du code HTML sans enregistrer de valeur, vous pouvez utiliser type <code>'message'<\/code>.<\/p>\n<pre><code>[\n    'type' =&gt; 'message',\n    'message' =&gt; '&lt;p&gt;Your HTML here&lt;\/p&gt;',\n    'new_lines' =&gt; 'wpautop',\n    'esc_html' =&gt; 0,\n]<\/code><\/pre>\n<h4>R\u00e9p\u00e9teur (ACF Pro uniquement)<\/h4>\n<p>Un r\u00e9p\u00e9teur contient un tableau de champs qui peuvent \u00eatre r\u00e9p\u00e9t\u00e9s.<\/p>\n<pre><code>[\n    'type' =&gt; 'repeater',\n    'layout' =&gt; 'table',  \/\/ 'block' || 'row'\n    'button_label' =&gt; __('Add new', 'txtdomain'),\n    'sub_fields' =&gt; [],\n]<\/code><\/pre>\n<p>L&rsquo;\u00e9l\u00e9ment <code>sub_fields<\/code>attend un tableau de champs, tout comme vous avez configur\u00e9 les champs ci-dessus.<\/p>\n<h2>Conclusion<\/h2>\n<p>Il ne s&rsquo;agit en aucun cas d&rsquo;un guide exhaustif, car ACF propose un large \u00e9ventail d&rsquo;options et de personnalisations. Mais il devrait couvrir les options les plus utilis\u00e9es et les cas d&rsquo;utilisation personnalis\u00e9s. Personnellement, je me r\u00e9f\u00e8re assez souvent \u00e0 cela chaque fois que j&rsquo;ajoute des champs ACF pour les clients. Et m\u00eame pour les options les plus \u00e9tranges, ce guide est suffisant pour que je n&rsquo;aie pas besoin de gonfler mes fichiers PHP avec le code d&rsquo;exportation d&rsquo;ACF. J&rsquo;esp\u00e8re que cela vous a \u00e9t\u00e9 utile aussi !<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Une r\u00e9f\u00e9rence compl\u00e8te sur la fa\u00e7on de bien configurer les champs et les groupes de champs personnalis\u00e9s avanc\u00e9s par code PHP au lieu de coller du code gonfl\u00e9 \u00e0 partir de l&rsquo;outil d&rsquo;exportation PHP ACF.<\/p>\n","protected":false},"author":1,"featured_media":224889,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,717,717,1110,811,811,841,841,862,862],"tags":[1167],"class_list":["post-234260","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-n-a","category-plugins-2","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234260"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234260\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224889"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}