{"id":233998,"date":"2023-02-26T17:16:00","date_gmt":"2023-02-26T14:16:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233998"},"modified":"2022-11-11T13:43:44","modified_gmt":"2022-11-11T10:43:44","slug":"crea-contenuto-a-livello-di-codice-dalle-voci-di-gravity-forms","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/crea-contenuto-a-livello-di-codice-dalle-voci-di-gravity-forms\/","title":{"rendered":"Crea contenuto a livello di codice dalle voci di Gravity Forms"},"content":{"rendered":"\n<p>Questo post ti guider\u00e0 su come creare qualsiasi tipo di contenuto (utenti, post o qualcos&#8217;altro personalizzato) in base alle voci in un modulo Gravity Forms. Aggiungeremo un&#8217;area nella schermata dei dettagli della voce in admin per creare contenuti in base alle informazioni inviate.<\/p>\n<h2>Cosa faremo<\/h2>\n<p>Creeremo una nuova metabox nella schermata dei dettagli di immissione di Gravity Form. In questo metabox aggiungeremo un pulsante. L&#8217;idea \u00e8 che l&#8217;utente finale possa rivedere la voce e se approva i dettagli della voce, pu\u00f2 premere il pulsante per avviare la creazione del contenuto.<\/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=\"Crea contenuto a livello di codice dalle voci di Gravity Forms\" ><\/a><\/p>\n<p>Il nostro codice verr\u00e0 attivato facendo clic su questo pulsante, eseguire l&#8217;azione necessaria e, facoltativamente, presenteremo un messaggio del risultato all&#8217;utente finale. Aggiungeremo anche (facoltativamente) metadati alla voce in modo da poter verificare facilmente se il contenuto \u00e8 stato creato prima o meno da questa voce.<\/p>\n<p>Manterr\u00f2 il codice abbastanza semplice e generale in modo che tu possa facilmente sostituirlo e modificarlo per adattarlo alle esigenze del tuo progetto. Nell&#8217;esempio seguente presumo che vogliamo creare programmaticamente un utente. Ma cosa fare con i dettagli dell&#8217;ingresso dipende interamente da te; puoi creare un post, aggiornare qualche altro contenuto o inviare un&#8217;e-mail personalizzata se lo desideri.<\/p>\n<h2>Identificazione dei campi<\/h2>\n<p>La prima considerazione che dobbiamo fare \u00e8 come identificare i campi. In altre parole, dobbiamo sapere quale campo \u00e8 cosa. Tieni presente che i valori di una voce in Gravity Forms sono riferiti ai relativi ID campo modulo. E anche con l&#8217;accesso alle informazioni di ogni campo del modulo, abbiamo bisogno di un modo sicuro per sapere quali campi sono quali informazioni. Un modulo potrebbe essere costituito da quattro input di testo: dobbiamo sapere quale dei quattro input di testo \u00e8 per il nome.<\/p>\n<p>Hai alcune alternative qui. \u00c8 possibile codificare gli ID campo (ad es. determinare che l&#8217;ID campo 2 \u00e8 il cognome), ma questo \u00e8 molto soggetto a errori e non \u00e8 raccomandato. Un modo semplice consiste nell&#8217;usare uno degli input di informazioni sui campi esistenti in Gravity Forms, ad esempio il nome della classe CSS. Ma tieni presente che l&#8217;utente finale pu\u00f2 fornire pi\u00f9 nomi di classe per ottenere lo stile desiderato e il tuo codice pu\u00f2 facilmente interrompersi se non stai analizzando correttamente questa stringa. Il modo che consiglio vivamente \u00e8 di aggiungere i tuoi input personalizzati ai campi:<\/p>\n<p>Se desideri un metodo solido per identificare i campi per il tuo codice, dai un&#8217;occhiata a come nel post sopra. Ma per semplificare in questo post, user\u00f2 la classe CSS e presumo che l&#8217;utente non inserisca nient&#8217;altro che i valori di cui abbiamo bisogno in quest&#8217;area.<\/p>\n<h2>Configurazione del modulo<\/h2>\n<p>Il primo passo \u00e8 naturalmente impostare il modulo con i campi e i tipi di campo necessari. E quindi inserisci gli identificatori di campo nelle posizioni corrette. Ad esempio ho questo modulo:<\/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=\"Crea contenuto a livello di codice dalle voci di Gravity Forms\" ><\/a><\/p>\n<p>E per ogni campo che voglio includere, fornisco una classe CSS personalizzata che posso scegliere come target nel mio codice. Ad esempio per il nome;<\/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=\"Crea contenuto a livello di codice dalle voci di Gravity Forms\" ><\/a><\/p>\n<p>Passiamo ora al codice e a come creare una funzionalit\u00e0 che converta gli invii in contenuto personalizzato.<\/p>\n<h2>Aggiunta di una metabox nei dettagli della voce<\/h2>\n<p>Il primo passaggio consiste nell&#8217;aggiungere una sorta di trigger di azione per creare il nostro contenuto personalizzato. Un luogo naturale \u00e8 nella schermata dei dettagli di immissione. Ci\u00f2 consente all&#8217;utente finale di rivedere i valori inviati e quindi decidere se creare o meno contenuto da essi. Gravity Forms consente agli sviluppatori di creare facilmente metabox personalizzati in queste schermate.<\/p>\n<p>Per creare una metabox personalizzata per inserire i dettagli possiamo utilizzare il filtro <code>gform_entry_detail_meta_boxes<\/code>. \u00c8 un filtro che restituisce un array di tutti i metabox da mostrare nei dettagli della voce. Aggiungiamo semplicemente un nuovo elemento dell&#8217;array per creare un nuovo metabox e definiamo una funzione di callback per renderizzare il suo contenuto. Impostiamo un bel titolo descrittivo in &#8216; <code>title<\/code>&#8216; e definiamo la sua posizione in modo da apparire nel &#8216; <code>side<\/code>&#8216;.<\/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>E poi dobbiamo definire la funzione di callback: <code>awp_gf_create_user_metabox_render()<\/code>nel nostro codice. Questa funzione \u00e8 responsabile del rendering del contenuto del metabox. Come parametro di questa funzione otteniamo un array di argomenti, in cui possiamo recuperare il form e l&#8217;oggetto entry;<\/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>Tutto ci\u00f2 che dobbiamo fare in questa funzione \u00e8 creare un po&#8217; di HTML e farne eco.<\/p>\n<p>Per quanto riguarda l&#8217;aggiunta di un pulsante per attivare un&#8217;azione, seguiremo lo stesso metodo di Gravity Forms stesso. C&#8217;\u00e8 un elemento del modulo che avvolge l&#8217;intera schermata dei dettagli della voce e tutto ci\u00f2 che dobbiamo fare \u00e8 aggiungere un evento onclick su un pulsante di invio che cambier\u00e0 la <code>action<\/code>propriet\u00e0 &#8216; &#8216;. Definiamo il nostro nome di azione personalizzato, in modo da sapere quando \u00e8 stato attivato e non \u00e8 in conflitto con le azioni di Gravity Forms.<\/p>\n<p>Chiamiamo la nostra azione personalizzata &quot; <code>awp_gf_create_user<\/code>&quot; e rendiamo un pulsante di invio con un evento onclick in questo modo:<\/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>Con il codice sopra otterremo una nuova metabox sul lato nella schermata dei dettagli di immissione, simile a questa:<\/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=\"Crea contenuto a livello di codice dalle voci di Gravity Forms\" ><\/a><\/p>\n<p>In questo momento non succede nulla quando si fa clic sul pulsante. Questo \u00e8 solo perch\u00e9 non abbiamo ancora scritto alcun codice per ascoltarlo.<\/p>\n<h2>Estrarre valori dalla voce<\/h2>\n<p>Come accennato in precedenza, tutti i valori inviati nell&#8217;array di voci sono identificati dai rispettivi ID di campo.<\/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=\"Crea contenuto a livello di codice dalle voci di Gravity Forms\" ><\/a><\/p>\n<p>Nell&#8217;immagine sopra il campo ID 1 \u00e8 per il nome, ID 2 \u00e8 il cognome e cos\u00ec via. Ma aspetta: cosa sta succedendo con 5.1, 5.3 e cos\u00ec via? In Gravity Forms otteniamo &quot;sub-ID&quot; per campi speciali che accettano pi\u00f9 valori. Ho aggiunto un campo indirizzo al mio modulo che \u00e8 un campo, ma pi\u00f9 input. Ogni input all&#8217;interno di questo campo ottiene i propri ID, aggiunti all&#8217;ID principale e un punto. Se non utilizzi nessuno di questi campi a input multipli, fantastico! Il codice diventa davvero semplice. Ma ho incluso questo campo speciale in modo da poter vedere come accedervi.<\/p>\n<p>In questo momento il nostro problema \u00e8 che il codice non sa a cosa servono i campi ID 1, 2 o 3. Tali informazioni si trovano nell&#8217;array del modulo, pi\u00f9 specificamente <code>$form['fields']<\/code>nell&#8217;elemento. Questo elemento contiene tutti i campi del modulo e abbiamo pieno accesso a ciascun oggetto campo. \u00c8 qui che possiamo trovare il nostro metodo di identificazione prescelto; nel mio esempio <code>cssClass<\/code>.<\/p>\n<p>Possiamo semplicemente scorrere questi campi e cercare gli identificatori che vogliamo estrarre. Metter\u00f2 tutti i miei identificatori in un array e possiamo semplicemente controllare se un campo nel ciclo \u00e8 uno di questi.<\/p>\n<p>Ma prima dobbiamo sapere che il pulsante \u00e8 stato cliccato. Questo \u00e8 abbastanza semplice; possiamo semplicemente verificare se la nostra azione personalizzata risiede <code>$_POST<\/code>nell&#8217;array. Ma poich\u00e9 stiamo lavorando con Gravity Forms possiamo usare <code>[rgpost](https:\/\/docs.gravityforms.com\/rgpost\/)()<\/code>. La funzione Gravity Forms <code>rgpost()<\/code>restituisce semplicemente il valore di una richiesta POST. Controllo <code>rgpost('awp_gf_create_user')<\/code>ed <code>$_POST['awp_gf_create_user']<\/code>\u00e8 esattamente lo stesso. Ma useremo la funzione di 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>Alla riga <code>#8<\/code>definiamo un array con tutti gli identificatori personalizzati che desideriamo cercare. Questi sono tutti i valori che ho inserito come classe CSS nel mio modulo. Quindi, nel ciclo per ogni campo, controlliamo se il campo \u00e8 uno di questi identificatori. Nel mio esempio sto usando la classe CSS per identificare i campi ma consiglio di usare input personalizzati. Anche questo codice non funzioner\u00e0 se sono state fornite pi\u00f9 classi CSS.<\/p>\n<p>Quindi alla riga <code>#12<\/code>aggiungiamo un nuovo elemento alla nostra matrice di valori finali con l&#8217;identificatore come chiave. Quindi utilizziamo l&#8217;ID del campo e facciamo riferimento all&#8217;array di voci. Alla fine di questo ciclo <code>$values<\/code>dovrebbe essere riempito con tutti i valori inviati che sono rilevanti. Tutti i campi lasciati vuoti o non inclusi nell&#8217;array identificatore verranno esclusi.<\/p>\n<p>Se hai aggiunto un campo di input multiplo speciale, dovrai aggiungere del codice extra per fare riferimento correttamente ai sub ID. So che <code>awp_address<\/code>\u00e8 un tipo di campo Indirizzo. I tipi di campo indirizzo in Gravity Forms seguono uno schema fisso di ID secondari e ho abilitato solo tre dei possibili input (l&#8217;indirizzo stradale 1 ha l&#8217;ID secondario 1, il codice postale ha l&#8217;ID secondario 3 e la citt\u00e0 ha l&#8217;ID secondario 5). Per gestire questo tipo di campi, dobbiamo fare qualcosa del genere:<\/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>Alla riga <code>#4<\/code>concateno tutti i valori in modo che la stringa finale sia un formato di indirizzo standardizzato a una riga (&quot;, &quot;).<\/p>\n<p>Ora abbiamo tutti i valori necessari ordinatamente ordinati per chiavi identificatore nell&#8217;array <code>$values<\/code>. Quello che fai con questo dipende interamente da te e dalle esigenze del tuo progetto. Ma includer\u00f2 un esempio di creazione di un utente in WordPress.<\/p>\n<h2>Creazione di un nuovo utente dall&#8217;invio della voce<\/h2>\n<p>Per mantenere pulito il mio codice, chiamer\u00f2 una funzione separata responsabile della creazione di un nuovo utente. Tutto ci\u00f2 di cui ho bisogno \u00e8 passare l&#8217;array dei valori. Voglio che questa funzione restituisca una sorta di indicazione del risultato di questa azione. In questo modo posso creare un messaggio indipendentemente dal fatto che l&#8217;utente sia stato creato correttamente o se esiste gi\u00e0 un utente con l&#8217;e-mail fornita.<\/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>Quindi definiamo semplicemente la <code>awp_gf_create_user()<\/code>funzione. Includer\u00f2 un semplice esempio di creazione di un utente a livello di codice in WordPress. Questo \u00e8 semplicemente inteso come un esempio per mostrare come utilizzare i valori estratti.<\/p>\n<p>Per prima cosa controlliamo se esiste un utente con l&#8217;e-mail fornita con <code>[get_user_by](https:\/\/developer.wordpress.org\/reference\/functions\/get_user_by\/)()<\/code>. In caso contrario, utilizziamo <code>[wp_insert_user](https:\/\/developer.wordpress.org\/reference\/functions\/wp_insert_user\/)()<\/code>per aggiungere un utente. Ho anche incluso un esempio di memorizzazione di meta utente personalizzati (il nostro campo dell&#8217;indirizzo). Infine il nostro metodo dovrebbe restituire il risultato della creazione dell&#8217;utente. Se l&#8217;utente esisteva gi\u00e0, restituiamo -1. In caso contrario, restituiamo l&#8217;ID utente.<\/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>Nel nostro rendering di metabox ora possiamo aggiungere condizionalmente un messaggio all&#8217;utente finale in base al risultato di questo. Questo \u00e8 un semplice esempio; se il valore restituito era -1 esiste gi\u00e0 un utente con l&#8217;e-mail fornita. E se il valore restituito era maggiore di 0, sappiamo che ha creato correttamente un utente. Quindi richiediamo un messaggio che dice che la creazione dell&#8217;utente \u00e8 andata a buon fine.<\/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>Evitare contenuti duplicati<\/h2>\n<p>Il semplice esempio sopra disabiliter\u00e0 ereditariamente la creazione di pi\u00f9 utenti dalla stessa voce perch\u00e9 verifica se esiste gi\u00e0 un utente con l&#8217;indirizzo e-mail fornito. Ma in altri casi potresti non avere questa opportunit\u00e0. Quindi un&#8217;altra strategia per evitare che gli utenti finali creino contenuti duplicati dalla stessa voce \u00e8 l&#8217;aggiunta di meta voci personalizzate. In altre parole; se l&#8217;azione ha avuto successo, aggiungiamo un meta personalizzato a quella voce. E poi controlliamo semplicemente se quel meta personalizzato esiste prima di iniziare l&#8217;azione.<\/p>\n<p>Gravity Forms offre metodi per aggiungere meta personalizzati alle voci; <code>[gform_add_meta](https:\/\/docs.gravityforms.com\/gform_add_meta\/)()<\/code>oltre a recuperare i valori: <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>Alla riga <code>#4<\/code>recuperiamo il nostro meta di immissione personalizzato. Se esisteva (non vuoto), impostiamo un messaggio che informa l&#8217;utente finale che ha gi\u00e0 tentato di creare contenuto da questa voce in precedenza. Se il meta personalizzato non esiste, continuiamo a creare i nostri contenuti. Quando il contenuto \u00e8 stato creato correttamente, \u00e8 necessario aggiungere il meta personalizzato alla voce (riga <code>#10<\/code>).<\/p>\n<h2>Conclusione e codice finale<\/h2>\n<p>In questo post ho cercato di fornire un esempio di come creare contenuti da una voce in Gravity Forms. Gli esempi di codice hanno lo scopo di darti un&#8217;idea su come personalizzarlo e modificarlo per adattarlo alle esigenze del tuo progetto. Consiglio vivamente di espandere questa funzionalit\u00e0 per gestire meglio i messaggi di errore. Potresti anche voler aggiungere questo metabox solo per uno o pi\u00f9 moduli specifici. Ma questa dovrebbe essere una buona base su cui costruire.<\/p>\n<p>Ed ecco il codice finale:<\/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\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Questo post ti guider\u00e0 su come creare qualsiasi tipo di contenuto (utenti, post o qualcos&#8217;altro personalizzato) in base alle voci in un modulo 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":[918,896,896,918,1110,814,814,844,844,865,865],"tags":[1168],"class_list":["post-233998","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-n-a","category-plugin-2","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233998"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233998\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/151471"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}