{"id":234277,"date":"2023-02-26T17:27:00","date_gmt":"2023-02-26T14:27:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234277"},"modified":"2022-11-12T03:22:15","modified_gmt":"2022-11-12T00:22:15","slug":"creer-du-contenu-par-programme-a-partir-des-entrees-de-gravity-forms","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/creer-du-contenu-par-programme-a-partir-des-entrees-de-gravity-forms\/","title":{"rendered":"Cr\u00e9er du contenu par programme \u00e0 partir des entr\u00e9es de Gravity Forms"},"content":{"rendered":"\n<p>Cet article vous guidera dans la cr\u00e9ation de tout type de contenu (utilisateurs, publications ou autre chose personnalis\u00e9e) bas\u00e9 sur les entr\u00e9es d&rsquo;un formulaire Gravity Forms. Nous ajouterons une zone dans l&rsquo;\u00e9cran des d\u00e9tails de l&rsquo;entr\u00e9e dans l&rsquo;administration pour cr\u00e9er du contenu bas\u00e9 sur les informations soumises.<\/p>\n<h2>Ce que nous ferons<\/h2>\n<p>Nous allons cr\u00e9er une nouvelle m\u00e9tabox dans l&rsquo;\u00e9cran des d\u00e9tails d&rsquo;entr\u00e9e de Gravity Form. Dans cette m\u00e9tabox, nous ajouterons un bouton. L&rsquo;id\u00e9e est que l&rsquo;utilisateur final peut revoir l&rsquo;entr\u00e9e et s&rsquo;il approuve les d\u00e9tails de l&rsquo;entr\u00e9e, il peut appuyer sur le bouton pour d\u00e9clencher la cr\u00e9ation de contenu.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cba9a24f2.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-151470-61e4cba9a24f2.png\" alt=\"Cr\u00e9er du contenu par programme \u00e0 partir des entr\u00e9es de Gravity Forms\" ><\/a><\/p>\n<p>Notre code sera d\u00e9clench\u00e9 en cliquant sur ce bouton, effectuera l&rsquo;action n\u00e9cessaire, et nous pr\u00e9senterons \u00e9ventuellement un message du r\u00e9sultat \u00e0 l&rsquo;utilisateur final. Nous ajouterons \u00e9galement (\u00e9ventuellement) des m\u00e9tadonn\u00e9es \u00e0 l&rsquo;entr\u00e9e afin de pouvoir v\u00e9rifier facilement si du contenu a d\u00e9j\u00e0 \u00e9t\u00e9 cr\u00e9\u00e9 \u00e0 partir de cette entr\u00e9e ou non.<\/p>\n<p>Je garderai le code assez simple et g\u00e9n\u00e9ral afin que vous puissiez facilement le remplacer et le modifier pour l&rsquo;adapter aux besoins de votre projet. Dans l&rsquo;exemple ci-dessous, je suppose que nous voulons cr\u00e9er un utilisateur par programme. Mais ce que vous faites avec les d\u00e9tails de l&rsquo;entr\u00e9e d\u00e9pend enti\u00e8rement de vous\u00a0; vous pouvez cr\u00e9er un message, mettre \u00e0 jour d&rsquo;autres contenus ou envoyer un e-mail personnalis\u00e9 si vous le souhaitez.<\/p>\n<h2>Identifier les champs<\/h2>\n<p>La premi\u00e8re consid\u00e9ration que nous devons faire est de savoir comment identifier les champs. En d&rsquo;autres termes, nous devons savoir quel champ est quoi. Gardez \u00e0 l&rsquo;esprit que les valeurs d&rsquo;une entr\u00e9e dans Gravity Forms font r\u00e9f\u00e9rence \u00e0 leurs ID de champ de formulaire. Et m\u00eame avec un acc\u00e8s aux informations de chaque champ de formulaire, nous avons besoin d&rsquo;un moyen infaillible pour savoir quels champs contiennent quelles informations. Un formulaire peut \u00eatre compos\u00e9 de quatre entr\u00e9es de texte &#8211; nous devons savoir lesquelles des quatre entr\u00e9es de texte correspondent au pr\u00e9nom.<\/p>\n<p>Vous avez quelques alternatives ici. Vous pouvez coder en dur les ID de champ (par exemple d\u00e9terminer que l&rsquo;ID de champ 2 est le nom de famille), mais cela est tr\u00e8s sujet aux erreurs et n&rsquo;est pas recommand\u00e9. Un moyen simple consiste \u00e0 utiliser l&rsquo;une des entr\u00e9es d&rsquo;informations de champ existantes dans Gravity Forms, par exemple le nom de la classe CSS. Mais gardez \u00e0 l&rsquo;esprit que l&rsquo;utilisateur final peut fournir plusieurs noms de classe afin d&rsquo;obtenir le style qu&rsquo;il souhaite, et votre code peut facilement se casser si vous n&rsquo;analysez pas correctement cette cha\u00eene. La m\u00e9thode que je recommande vivement consiste \u00e0 ajouter vos propres entr\u00e9es personnalis\u00e9es aux champs\u00a0:<\/p>\n<p>Si vous voulez une m\u00e9thode solide pour identifier les champs de votre code, v\u00e9rifiez certainement comment dans le post ci-dessus. Mais pour rester simple dans cet article, j&rsquo;utiliserai la classe CSS et supposerai que l&rsquo;utilisateur n&rsquo;entre rien d&rsquo;autre que les valeurs dont nous avons besoin dans ce domaine.<\/p>\n<h2>Mise en place du formulaire<\/h2>\n<p>La premi\u00e8re \u00e9tape consiste naturellement \u00e0 configurer le formulaire avec les champs et les types de champs dont vous avez besoin. Et puis vous ins\u00e9rez les identificateurs de champ aux bons endroits. A titre d&rsquo;exemple j&rsquo;ai ce formulaire :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbaa8ac83.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-151470-61e4cbaa8ac83.png\" alt=\"Cr\u00e9er du contenu par programme \u00e0 partir des entr\u00e9es de Gravity Forms\" ><\/a><\/p>\n<p>Et pour chaque champ que je souhaite inclure, je fournis une classe CSS personnalis\u00e9e que je peux cibler dans mon code. Par exemple pour le pr\u00e9nom ;<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbab8f543.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-151470-61e4cbab8f543.png\" alt=\"Cr\u00e9er du contenu par programme \u00e0 partir des entr\u00e9es de Gravity Forms\" ><\/a><\/p>\n<p>Passons maintenant au code et \u00e0 la cr\u00e9ation d&rsquo;une fonctionnalit\u00e9 qui convertit les soumissions en contenu personnalis\u00e9.<\/p>\n<h2>Ajout d&rsquo;une m\u00e9tabox dans les d\u00e9tails de l&rsquo;entr\u00e9e<\/h2>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 ajouter une sorte de d\u00e9clencheur d&rsquo;action pour cr\u00e9er notre contenu personnalis\u00e9. Un lieu naturel se trouve dans l&rsquo;\u00e9cran des d\u00e9tails de l&rsquo;entr\u00e9e. Cela permet \u00e0 l&rsquo;utilisateur final d&rsquo;examiner les valeurs soumises, puis de d\u00e9cider de cr\u00e9er ou non du contenu \u00e0 partir de celles-ci. Gravity Forms permet aux d\u00e9veloppeurs de cr\u00e9er facilement des m\u00e9taboxes personnalis\u00e9es dans ces \u00e9crans.<\/p>\n<p>Pour cr\u00e9er une m\u00e9tabox personnalis\u00e9e pour les d\u00e9tails d&rsquo;entr\u00e9e, nous pouvons utiliser le filtre <code>gform_entry_detail_meta_boxes<\/code>. C&rsquo;est un filtre qui renvoie un tableau de toutes les m\u00e9taboxes \u00e0 afficher dans les d\u00e9tails de l&rsquo;entr\u00e9e. Nous ajoutons simplement un nouvel \u00e9l\u00e9ment de tableau afin de cr\u00e9er une nouvelle m\u00e9tabox, et d\u00e9finissons une fonction de rappel pour restituer son contenu. Nous d\u00e9finissons un joli titre descriptif dans &lsquo; <code>title<\/code>&lsquo; et d\u00e9finissons sa position pour qu&rsquo;elle apparaisse dans le &lsquo; <code>side<\/code>&lsquo;.<\/p>\n<pre><code>add_filter('gform_entry_detail_meta_boxes', function($meta_boxes, $entry, $form) {\n    $meta_boxes['awp-create-user-metabox'] = [\n        'title' =&gt; __('Create user from entry', 'awp'),\n        'callback' =&gt; 'awp_gf_create_user_metabox_render',\n        'context' =&gt; 'side'\n    ];\n    return $meta_boxes;\n}, 10, 3);<\/code><\/pre>\n<p>Et puis nous devons d\u00e9finir la fonction de rappel: <code>awp_gf_create_user_metabox_render()<\/code>dans notre code. Cette fonction est responsable du rendu du contenu de la metabox. En tant que param\u00e8tre de cette fonction, nous obtenons un tableau d&rsquo;arguments, dans lequel nous pouvons r\u00e9cup\u00e9rer le formulaire et l&rsquo;objet d&rsquo;entr\u00e9e\u00a0;<\/p>\n<pre><code>function awp_gf_create_user_metabox_render($args) {\n    $form = $args['form'];  \/\/ Form array. Here we find all the fields in $form['fields']\n    $entry = $args['entry'];  \/\/ Entry array. Here we find all values in this current submission\n    $render = '';\n    echo $render;\n}<\/code><\/pre>\n<p>Tout ce que nous avons \u00e0 faire dans cette fonction est de cr\u00e9er du code HTML et de lui faire \u00e9cho.<\/p>\n<p>Quant \u00e0 l&rsquo;ajout d&rsquo;un bouton pour d\u00e9clencher une action, nous suivrons la m\u00eame m\u00e9thode que Gravity Forms lui-m\u00eame. Il y a un \u00e9l\u00e9ment de formulaire qui enveloppe tout l&rsquo;\u00e9cran des d\u00e9tails de l&rsquo;entr\u00e9e, et tout ce que nous avons \u00e0 faire est d&rsquo;ajouter un \u00e9v\u00e9nement onclick sur un bouton d&rsquo;envoi qui changera la <code>action<\/code>propri\u00e9t\u00e9 &lsquo; &lsquo;. Nous d\u00e9finissons notre propre nom d&rsquo;action personnalis\u00e9, afin que nous sachions quand il a \u00e9t\u00e9 d\u00e9clench\u00e9 &#8211; et qu&rsquo;il n&rsquo;entre pas en conflit avec les actions de Gravity Forms.<\/p>\n<p>Appelons notre action personnalis\u00e9e &lsquo; <code>awp_gf_create_user<\/code>&lsquo; et rendons un bouton d&rsquo;envoi avec un \u00e9v\u00e9nement onclick comme ceci\u00a0:<\/p>\n<pre><code>function awp_gf_create_user_metabox_render($args) {\n    $form = $args['form'];  \/\/ Form array. Here we find all the fields in $form['fields']\n    $entry = $args['entry'];  \/\/ Entry array. Here we find all values in this current submission\n    $render = '';\n    $action = 'awp_gf_create_user';\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n        __('Create user', 'awp'), \n        $action\n    );\n    echo $render;\n}<\/code><\/pre>\n<p>Avec le code ci-dessus, nous aurons une nouvelle m\u00e9tabox sur le c\u00f4t\u00e9 de l&rsquo;\u00e9cran des d\u00e9tails de l&rsquo;entr\u00e9e, ressemblant \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cba9a24f2.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-151470-61e4cba9a24f2.png\" alt=\"Cr\u00e9er du contenu par programme \u00e0 partir des entr\u00e9es de Gravity Forms\" ><\/a><\/p>\n<p>Pour l&rsquo;instant, rien ne se passe lorsque vous cliquez sur le bouton. C&rsquo;est simplement parce que nous n&rsquo;avons pas encore \u00e9crit de code pour l&rsquo;\u00e9couter.<\/p>\n<h2>Extraction des valeurs de l&rsquo;entr\u00e9e<\/h2>\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, toutes les valeurs soumises dans le tableau d&rsquo;entr\u00e9e sont identifi\u00e9es par leurs ID de champ.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151470-61e4cbad6bcf2.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-151470-61e4cbad6bcf2.png\" alt=\"Cr\u00e9er du contenu par programme \u00e0 partir des entr\u00e9es de Gravity Forms\" ><\/a><\/p>\n<p>Dans l&rsquo;image ci-dessus, le champ ID 1 est pour le pr\u00e9nom, ID 2 est le nom de famille et ainsi de suite. Mais attendez &#8211; que se passe-t-il avec 5.1, 5.3 et ainsi de suite? Dans Gravity Forms, nous obtenons des &quot;sous-ID&quot; pour un champ sp\u00e9cial qui accepte plusieurs valeurs. J&rsquo;ai ajout\u00e9 un champ d&rsquo;adresse \u00e0 mon formulaire qui est un champ, mais plusieurs entr\u00e9es. Chaque entr\u00e9e dans ce champ obtient ses propres ID, ajout\u00e9s \u00e0 l&rsquo;ID principal et un point. Si vous n&rsquo;utilisez aucun de ces champs \u00e0 entr\u00e9es multiples, tant mieux\u00a0! Le code devient tr\u00e8s simple. Mais j&rsquo;ai inclus ce champ sp\u00e9cial afin que nous puissions voir comment y acc\u00e9der.<\/p>\n<p>\u00c0 l&rsquo;heure actuelle, notre probl\u00e8me est que le code ne sait pas \u00e0 quoi correspondent les champs ID 1, 2 ou 3. Cette information se trouve dans le tableau de formulaire, plus pr\u00e9cis\u00e9ment l&rsquo; <code>$form['fields']<\/code>\u00e9l\u00e9ment. Cet \u00e9l\u00e9ment contient tous les champs du formulaire et nous avons un acc\u00e8s complet \u00e0 chaque objet de champ. C&rsquo;est ici que nous pouvons trouver notre m\u00e9thode d&rsquo;identification choisie; dans mon exemple <code>cssClass<\/code>.<\/p>\n<p>Nous pouvons simplement parcourir ces champs et rechercher les identifiants que nous voulons extraire. Je vais mettre tous mes identifiants dans un tableau et nous pouvons simplement v\u00e9rifier si un champ de la boucle en fait partie.<\/p>\n<p>Mais nous devons d&rsquo;abord savoir que le bouton a \u00e9t\u00e9 cliqu\u00e9. C&rsquo;est assez simple; nous pouvons simplement v\u00e9rifier si notre action personnalis\u00e9e r\u00e9side dans le <code>$_POST<\/code>tableau. Mais parce que nous travaillons avec Gravity Forms, nous pouvons utiliser <code>[rgpost](https:\/\/docs.gravityforms.com\/rgpost\/)()<\/code>. La fonction Gravity Forms <code>rgpost()<\/code>renvoie simplement la valeur d&rsquo;une requ\u00eate POST. V\u00e9rification <code>rgpost('awp_gf_create_user')<\/code>et <code>$_POST['awp_gf_create_user']<\/code>est exactement le m\u00eame. Mais nous utiliserons la fonction de Gravity Forms.<\/p>\n<pre><code>    ...\n    $render = '';\n    $action = 'awp_gf_create_user';\n\u00a0\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        $values = [];\n        \/\/ All identificators\n        $css_classes = ['awp_first_name', 'awp_last_name', 'awp_email', 'awp_address'];\n        foreach ($form['fields'] as $field) {\n            if (in_array($field-&gt;cssClass, $css_classes)) {\n                $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n            }\n        }\n    }\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n    ...<\/code><\/pre>\n<p>\u00c0 la ligne, <code>#8<\/code>nous d\u00e9finissons un tableau avec tous les identifiants personnalis\u00e9s que nous souhaitons rechercher. Ce sont toutes les valeurs que j&rsquo;ai entr\u00e9es comme classe CSS dans mon formulaire. Ensuite, dans la boucle pour chaque champ, nous v\u00e9rifions si le champ est l&rsquo;un de ces identifiants. Dans mon exemple, j&rsquo;utilise la classe CSS pour identifier les champs, mais je recommande d&rsquo;utiliser des entr\u00e9es personnalis\u00e9es. Ce code ne fonctionnera pas non plus si plusieurs classes CSS ont \u00e9t\u00e9 donn\u00e9es.<\/p>\n<p>Ensuite, \u00e0 la ligne, <code>#12<\/code>nous ajoutons un nouvel \u00e9l\u00e9ment \u00e0 notre tableau de valeurs final avec l&rsquo;identifiant comme cl\u00e9. Nous utilisons ensuite l&rsquo;ID du champ et r\u00e9f\u00e9ren\u00e7ons le tableau d&rsquo;entr\u00e9e. \u00c0 la fin de cette boucle <code>$values<\/code>, toutes les valeurs soumises pertinentes doivent \u00eatre remplies. Tous les champs laiss\u00e9s vides ou non inclus dans le tableau d&rsquo;identification seront exclus.<\/p>\n<p>Si vous avez ajout\u00e9 un champ de saisie multiple sp\u00e9cial, vous devrez ajouter du code suppl\u00e9mentaire pour r\u00e9f\u00e9rencer correctement les sous-ID. Je sais que <code>awp_address<\/code>c&rsquo;est un type de champ d&rsquo;adresse. Les types de champs d&rsquo;adresse dans Gravity Forms suivent un mod\u00e8le fixe de sous-ID, et je n&rsquo;ai activ\u00e9 que trois des entr\u00e9es possibles (l&rsquo;adresse de rue 1 a le sous-ID 1, le code postal a le sous-ID 3 et la ville a le sous-ID 5). Pour g\u00e9rer ce genre de champs, nous devons faire quelque chose comme ceci :<\/p>\n<pre><code>        ...\n        foreach ($form['fields'] as $field) {\n            if (in_array($field-&gt;cssClass, $css_classes)) {\n                if ($field-&gt;cssClass == 'awp_address') {\n                    $address = $entry[$field-&gt;id.'.1']. ', '. $entry[$field-&gt;id.'.5']. ' '. $entry[$field-&gt;id.'.3'];\n                    $values[$field-&gt;cssClass] = $address;\n                } else {\n                    $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n                }\n            }\n        }\n        ...<\/code><\/pre>\n<p>\u00c0 la ligne, <code>#4<\/code>je concat\u00e8ne toutes les valeurs afin que la cha\u00eene finale soit un format d&rsquo;adresse normalis\u00e9 sur une ligne (&quot;,&quot;).<\/p>\n<p>Nous avons maintenant toutes les valeurs n\u00e9cessaires bien tri\u00e9es par cl\u00e9s d&rsquo;identification dans le tableau <code>$values<\/code>. Ce que vous en faites d\u00e9pend enti\u00e8rement de vous et des besoins de votre projet. Mais je vais inclure un exemple de cr\u00e9ation d&rsquo;un utilisateur dans WordPress.<\/p>\n<h2>Cr\u00e9ation d&rsquo;un nouvel utilisateur \u00e0 partir de la soumission d&rsquo;une entr\u00e9e<\/h2>\n<p>Pour garder mon code propre, j&rsquo;appellerai une fonction distincte qui est responsable de la cr\u00e9ation d&rsquo;un nouvel utilisateur. Tout ce dont j&rsquo;ai besoin est de passer le tableau de valeurs. Je veux que cette fonction renvoie une sorte d&rsquo;indication du r\u00e9sultat de cette action. De cette fa\u00e7on, je peux cr\u00e9er un message indiquant si l&rsquo;utilisateur a \u00e9t\u00e9 cr\u00e9\u00e9 avec succ\u00e8s ou si un utilisateur avec l&rsquo;e-mail fourni existe d\u00e9j\u00e0.<\/p>\n<pre><code>        ...\n        foreach ($form['fields'] as $field) {\n            if (in_array($field-&gt;cssClass, $css_classes)) {\n                $address = $entry[$field-&gt;id.'.1']. ', '. $entry[$field-&gt;id.'.5']. ' '. $entry[$field-&gt;id.'.3'];\n                    $values[$field-&gt;cssClass] = $address;\n                } else {\n                    $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n                }\n            }\n        }\n        $result = awp_gf_create_user($values);\n    }\n    ...<\/code><\/pre>\n<p>Ensuite, nous d\u00e9finissons simplement la <code>awp_gf_create_user()<\/code>fonction. J&rsquo;inclurai un exemple simple de cr\u00e9ation d&rsquo;un utilisateur par programmation dans WordPress. Il s&rsquo;agit simplement d&rsquo;un exemple pour montrer comment utiliser les valeurs extraites.<\/p>\n<p>Nous v\u00e9rifions d&rsquo;abord si un utilisateur avec l&rsquo;e-mail donn\u00e9 existe avec <code>[get_user_by](https:\/\/developer.wordpress.org\/reference\/functions\/get_user_by\/)()<\/code>. Sinon, nous utilisons <code>[wp_insert_user](https:\/\/developer.wordpress.org\/reference\/functions\/wp_insert_user\/)()<\/code>pour ajouter un utilisateur. J&rsquo;ai \u00e9galement inclus un exemple de stockage de m\u00e9ta utilisateur personnalis\u00e9 (notre champ d&rsquo;adresse). Enfin, notre m\u00e9thode devrait renvoyer le r\u00e9sultat de la cr\u00e9ation de l&rsquo;utilisateur. Si l&rsquo;utilisateur existait d\u00e9j\u00e0, nous renvoyons -1. Sinon, nous renvoyons l&rsquo;ID utilisateur.<\/p>\n<pre><code>function awp_gf_create_user($values) {\n    \/\/ Check if user exists\n    $exists = get_user_by('email', $values['awp_email']);\n    if ($exists) {\n        return -1;\n    }\n\u00a0\n    \/\/ Create user\n    $random_password = wp_generate_password(12, false);\n    $user_id = wp_insert_user([\n        'user_email' =&gt; $values['awp_email'],\n        'user_login' =&gt; $values['awp_email'],\n        'user_pass' =&gt; $random_password,\n        'first_name' =&gt; $values['awp_first_name'],\n        'last_name' =&gt; $values['awp_last_name'],\n        'role' =&gt; 'author'\n    ]);\n    \/\/ Optional: custom user meta\n    if ($user_id) {\n        update_user_meta($user_id, 'address', $values['awp_address']);\n    }\n\u00a0\n    \/\/ Return user ID (or WP_Error) back to metabox render function so we can display an appropriate message\n    return $user_id;\n}<\/code><\/pre>\n<p>De retour dans notre rendu de m\u00e9tabox, nous pouvons maintenant ajouter conditionnellement un message \u00e0 l&rsquo;utilisateur final en fonction du r\u00e9sultat. Ceci est un exemple simple; si la valeur renvoy\u00e9e \u00e9tait -1, un utilisateur avec l&rsquo;e-mail fourni existe d\u00e9j\u00e0. Et si la valeur renvoy\u00e9e \u00e9tait sup\u00e9rieure \u00e0 0, nous savons qu&rsquo;elle a cr\u00e9\u00e9 un utilisateur avec succ\u00e8s. Ainsi, nous affichons un message indiquant que la cr\u00e9ation de l&rsquo;utilisateur a r\u00e9ussi.<\/p>\n<pre><code>    ...\n    $message = '';\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        ...\n        $result = awp_gf_create_user($values);\n        if ($result &gt; 0) {\n            $message = __('User successfully created!', 'awp');\n        } else if ($result == -1) {\n            $message = __('An user by that email already exists!', 'awp');\n        }\n    }\n\u00a0\n    if (!empty($message)) {\n        $render .= '&lt;p&gt;'. $message. '&lt;\/p&gt;';\n    }\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n    ...<\/code><\/pre>\n<h2>\u00c9viter le contenu dupliqu\u00e9<\/h2>\n<p>L&rsquo;exemple simple ci-dessus d\u00e9sactivera par h\u00e9ritage la cr\u00e9ation de plusieurs utilisateurs \u00e0 partir de la m\u00eame entr\u00e9e car il v\u00e9rifie si oui ou non un utilisateur avec l&rsquo;adresse e-mail fournie existe d\u00e9j\u00e0. Mais dans d&rsquo;autres cas, vous pourriez ne pas avoir cette opportunit\u00e9. Ainsi, une autre strat\u00e9gie pour \u00e9viter que les utilisateurs finaux ne cr\u00e9ent du contenu en double \u00e0 partir de la m\u00eame entr\u00e9e consiste \u00e0 ajouter une m\u00e9ta d&rsquo;entr\u00e9e personnalis\u00e9e. Autrement dit; si l&rsquo;action a r\u00e9ussi, nous ajoutons une m\u00e9ta personnalis\u00e9e \u00e0 cette entr\u00e9e. Et puis nous v\u00e9rifions simplement si cette m\u00e9ta personnalis\u00e9e existe avant de commencer l&rsquo;action.<\/p>\n<p>Gravity Forms propose des m\u00e9thodes pour ajouter des m\u00e9ta personnalis\u00e9es aux entr\u00e9es ; <code>[gform_add_meta](https:\/\/docs.gravityforms.com\/gform_add_meta\/)()<\/code>ainsi que la r\u00e9cup\u00e9ration des valeurs\u00a0: <code>[gform_get_meta](https:\/\/docs.gravityforms.com\/gform_get_meta\/)()<\/code>.<\/p>\n<pre><code>    ...\n    $message = '';\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        $already_created = gform_get_meta($entry['id'], 'awp_created_user');\n        if ($already_created) {\n            $message = __('You have already created an user from this entry!', 'awp');\n        } else {\n            ...\n            $result = awp_gf_create_user($values);\n            if ($result &gt; 0) {\n                gform_add_meta($entry['id'], 'awp_created_user', $user_id, $form['id']);\n                $message = __('User successfully created!', 'awp');\n            } else if ($result == -1) {\n                $message = __('An user by that email already exists!', 'awp');\n            }\n        }\n    }\n    ...<\/code><\/pre>\n<p>\u00c0 la ligne, <code>#4<\/code>nous r\u00e9cup\u00e9rons notre m\u00e9ta d&rsquo;entr\u00e9e personnalis\u00e9e. S&rsquo;il existait (non vide), nous d\u00e9finissons un message informant l&rsquo;utilisateur final qu&rsquo;il a d\u00e9j\u00e0 essay\u00e9 de cr\u00e9er du contenu \u00e0 partir de cette entr\u00e9e auparavant. Si la m\u00e9ta personnalis\u00e9e n&rsquo;existait pas, nous continuons alors \u00e0 cr\u00e9er notre contenu. Lorsque le contenu a \u00e9t\u00e9 cr\u00e9\u00e9 avec succ\u00e8s, nous devons ajouter la m\u00e9ta personnalis\u00e9e \u00e0 l&rsquo;entr\u00e9e (ligne <code>#10<\/code>).<\/p>\n<h2>Conclusion et code final<\/h2>\n<p>Dans cet article, j&rsquo;ai essay\u00e9 de donner un exemple de la fa\u00e7on de cr\u00e9er du contenu \u00e0 partir d&rsquo;une entr\u00e9e dans Gravity Forms. Les exemples de code sont destin\u00e9s \u00e0 vous donner une id\u00e9e de la fa\u00e7on de le personnaliser et de le modifier pour l&rsquo;adapter aux besoins de votre projet. Je recommande vivement d&rsquo;\u00e9tendre cette fonctionnalit\u00e9 pour mieux g\u00e9rer les messages d&rsquo;erreur. Vous pouvez \u00e9galement ajouter cette m\u00e9tabox uniquement pour un ou plusieurs formulaires sp\u00e9cifiques. Mais cela devrait \u00eatre une bonne base sur laquelle s&rsquo;appuyer.<\/p>\n<p>Et voici le code final\u00a0:<\/p>\n<pre><code>add_filter('gform_entry_detail_meta_boxes', function($meta_boxes, $entry, $form) {\n    $meta_boxes['awp-create-user-metabox'] = [\n        'title' =&gt; __('Create user from entry', 'awp'),\n        'callback' =&gt; 'awp_gf_create_user_metabox_render',\n        'context' =&gt; 'side'\n    ];\n    return $meta_boxes;\n}, 10, 3);\n\u00a0\nfunction awp_gf_create_user_metabox_render($args) {\n    $form = $args['form'];  \/\/ Form array. Here we find all the fields in $form['fields']\n    $entry = $args['entry'];  \/\/ Entry array. Here we find all values in this current submission\n    $render = '';\n    $action = 'awp_gf_create_user';\n\u00a0\n    $message = '';\n    if (rgpost('action') == $action) {  \/\/ Button was clicked\n        $already_created = gform_get_meta($entry['id'], 'awp_created_user');\n        if ($already_created) {\n            $message = __('You have already created an user from this entry!', 'awp');\n        } else {\n            $values = [];\n            \/\/ All identificators\n            $css_classes = ['awp_first_name', 'awp_last_name', 'awp_email', 'awp_address'];\n            foreach ($form['fields'] as $field) {\n                if (in_array($field-&gt;cssClass, $css_classes)) {\n                    if ($field-&gt;cssClass == 'awp_address') {\n                        $address = $entry[$field-&gt;id.'.1']. ', '. $entry[$field-&gt;id.'.5']. ' '. $entry[$field-&gt;id.'.3'];\n                        $values[$field-&gt;cssClass] = $address;\n                    } else {\n                        $values[$field-&gt;cssClass] = $entry[$field-&gt;id];\n                    }\n                }\n            }\n\u00a0\n            $result = awp_gf_create_user($values);\n\u00a0\n            if ($result &gt; 0) {\n                gform_add_meta($entry['id'], 'awp_created_user', $user_id, $form['id']);\n                $message = __('User successfully created!', 'awp');\n            } else if ($result == -1) {\n                $message = __('An user by that email already exists!', 'awp');\n            }\n        }\n    }\n\u00a0\n    if (!empty($message)) {\n        $render .= '&lt;p&gt;'. $message. '&lt;\/p&gt;';\n    }\n    $render .= sprintf('&lt;input type=\"submit\" value=\"%s\" class=\"button\" onclick=\"jQuery('#action').val('%s');\" \/&gt;', \n        __('Create user', 'awp'), \n        $action\n    );\n    echo $render;\n}\n\u00a0\nfunction awp_gf_create_user($values) {\n    \/\/ Check if user exists\n    $exists = get_user_by('email', $values['awp_email']);\n    if ($exists) {\n        return -1;\n    }\n    \/\/ Create user\n    $random_password = wp_generate_password(12, false);\n    $user_id = wp_insert_user([\n        'user_email' =&gt; $values['awp_email'],\n        'user_login' =&gt; $values['awp_email'],\n        'user_pass' =&gt; $random_password,\n        'first_name' =&gt; $values['awp_first_name'],\n        'last_name' =&gt; $values['awp_last_name'],\n        'role' =&gt; 'author'\n    ]);\n    \/\/ Optional: custom user meta\n    if ($user_id) {\n        update_user_meta($user_id, 'address', $values['awp_address']);\n    }\n    \/\/ Return user ID (or WP_Error) back to metabox render function so we can display an appropriate message\n    return $user_id;\n}<\/code><\/pre>\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>Cet article vous guidera dans la cr\u00e9ation de tout type de contenu (utilisateurs, publications ou autre chose personnalis\u00e9e) bas\u00e9 sur les entr\u00e9es d&rsquo;un formulaire Gravity Forms.<\/p>\n","protected":false},"author":1,"featured_media":151471,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,893,915,1110,811,811,841,841,862,862],"tags":[1167],"class_list":["post-234277","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","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\/234277","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=234277"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234277\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/151471"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}