{"id":233994,"date":"2023-02-26T17:13:00","date_gmt":"2023-02-26T14:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233994"},"modified":"2022-11-11T13:40:30","modified_gmt":"2022-11-11T10:40:30","slug":"criar-conteudo-programaticamente-a-partir-de-entradas-de-formularios-de-gravidade","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/criar-conteudo-programaticamente-a-partir-de-entradas-de-formularios-de-gravidade\/","title":{"rendered":"Criar conte\u00fado programaticamente a partir de entradas de formul\u00e1rios de gravidade"},"content":{"rendered":"\n<p>Este post ir\u00e1 gui\u00e1-lo em como criar qualquer tipo de conte\u00fado (usu\u00e1rios, posts ou qualquer outra coisa personalizada) com base em entradas em um formul\u00e1rio Gravity Forms. Adicionaremos uma \u00e1rea na tela de detalhes da entrada no admin para criar conte\u00fado com base nas informa\u00e7\u00f5es enviadas.<\/p>\n<h2>O que vamos fazer<\/h2>\n<p>Criaremos uma nova metabox na tela de detalhes de entrada do Gravity Form. Nesta metabox adicionaremos um bot\u00e3o. A ideia \u00e9 que o usu\u00e1rio final possa revisar a entrada e, se aprovar os detalhes da entrada, pode pressionar o bot\u00e3o para acionar a cria\u00e7\u00e3o de conte\u00fado.<\/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=\"Criar conte\u00fado programaticamente a partir de entradas de formul\u00e1rios de gravidade\" ><\/a><\/p>\n<p>Nosso c\u00f3digo ser\u00e1 acionado ao clicar neste bot\u00e3o, realizar a a\u00e7\u00e3o necess\u00e1ria e, opcionalmente, apresentaremos uma mensagem do resultado ao usu\u00e1rio final. Tamb\u00e9m adicionaremos (opcionalmente) metadados \u00e0 entrada para que possamos verificar facilmente se o conte\u00fado foi criado a partir dessa entrada antes ou n\u00e3o.<\/p>\n<p>Manterei o c\u00f3digo bastante simples e geral para que voc\u00ea possa substitu\u00ed-lo e ajust\u00e1-lo facilmente para atender \u00e0s necessidades do seu projeto. No exemplo abaixo, assumirei que queremos criar programaticamente um usu\u00e1rio. Mas o que voc\u00ea faz com os detalhes da entrada depende inteiramente de voc\u00ea; voc\u00ea pode criar uma postagem, atualizar algum outro conte\u00fado ou enviar um e-mail personalizado, se desejar.<\/p>\n<h2>Identificando os campos<\/h2>\n<p>A primeira considera\u00e7\u00e3o que temos que fazer \u00e9 como identificar os campos. Em outras palavras, precisamos saber qual campo \u00e9 o qu\u00ea. Tenha em mente que os valores de uma entrada no Gravity Forms s\u00e3o referidos aos seus IDs de campo de formul\u00e1rio. E mesmo com acesso \u00e0s informa\u00e7\u00f5es de cada campo do formul\u00e1rio \u2013 precisamos de uma maneira infal\u00edvel de saber quais campos s\u00e3o quais informa\u00e7\u00f5es. Um formul\u00e1rio pode consistir em quatro entradas de texto \u2013 precisamos saber quais das quatro entradas de texto s\u00e3o para o primeiro nome.<\/p>\n<p>Voc\u00ea tem algumas alternativas aqui. Voc\u00ea pode codificar os IDs de campo (por exemplo, determinar que o ID de campo 2 \u00e9 o sobrenome), mas isso \u00e9 muito propenso a erros e n\u00e3o \u00e9 recomendado. Uma maneira simples \u00e9 usar uma das entradas de informa\u00e7\u00f5es de campo existentes no Gravity Forms, por exemplo, o nome da classe CSS. Mas lembre-se de que o usu\u00e1rio final pode fornecer v\u00e1rios nomes de classe para obter o estilo que deseja, e seu c\u00f3digo pode quebrar facilmente se voc\u00ea n\u00e3o estiver analisando corretamente essa string. A maneira que eu definitivamente recomendo \u00e9 adicionar suas pr\u00f3prias entradas personalizadas aos campos:<\/p>\n<p>Se voc\u00ea deseja um m\u00e9todo s\u00f3lido para identificar campos para o seu c\u00f3digo, confira como no post acima. Mas para simplificar neste post, vou usar a classe CSS e assumir que o usu\u00e1rio n\u00e3o insere nada al\u00e9m dos valores que precisamos nesta \u00e1rea.<\/p>\n<h2>Configurando o formul\u00e1rio<\/h2>\n<p>O primeiro passo \u00e9 naturalmente configurar o formul\u00e1rio com os campos e tipos de campo que voc\u00ea precisa. E ent\u00e3o voc\u00ea insere os identificadores de campo em seus lugares corretos. Como exemplo tenho este formul\u00e1rio:<\/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=\"Criar conte\u00fado programaticamente a partir de entradas de formul\u00e1rios de gravidade\" ><\/a><\/p>\n<p>E para cada campo que desejo incluir, forne\u00e7o uma classe CSS personalizada que posso direcionar no meu c\u00f3digo. Por exemplo, para primeiro 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=\"Criar conte\u00fado programaticamente a partir de entradas de formul\u00e1rios de gravidade\" ><\/a><\/p>\n<p>Agora vamos passar para o c\u00f3digo e como criar uma funcionalidade que converte envios em conte\u00fado personalizado.<\/p>\n<h2>Adicionando uma metabox nos detalhes da entrada<\/h2>\n<p>O primeiro passo \u00e9 adicionar algum tipo de gatilho de a\u00e7\u00e3o para criar nosso conte\u00fado personalizado. Um lugar natural est\u00e1 na tela de detalhes da entrada. Isso permite que o usu\u00e1rio final revise os valores enviados e, em seguida, decida se deseja ou n\u00e3o criar conte\u00fado a partir dele. O Gravity Forms permite que os desenvolvedores criem facilmente metaboxes personalizadas nessas telas.<\/p>\n<p>Para criar uma metabox personalizada para os detalhes da entrada, podemos usar o filtro <code>gform_entry_detail_meta_boxes<\/code>. \u00c9 um filtro que retorna uma matriz de todas as metaboxes para mostrar nos detalhes da entrada. Simplesmente adicionamos um novo elemento de array para criar uma nova metabox e definimos uma fun\u00e7\u00e3o de retorno de chamada para renderizar seu conte\u00fado. Colocamos um bom t\u00edtulo descritivo em &#8216; <code>title<\/code>&#8216; e definimos sua posi\u00e7\u00e3o para aparecer no &#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 ent\u00e3o precisamos definir a fun\u00e7\u00e3o callback: <code>awp_gf_create_user_metabox_render()<\/code>em nosso c\u00f3digo. Esta fun\u00e7\u00e3o \u00e9 respons\u00e1vel por renderizar o conte\u00fado da metabox. Como par\u00e2metro para esta fun\u00e7\u00e3o obtemos um array de argumentos, no qual podemos buscar o formul\u00e1rio e o objeto de entrada;<\/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>Tudo o que precisamos fazer nesta fun\u00e7\u00e3o \u00e9 construir um pouco de HTML e eco\u00e1-lo.<\/p>\n<p>Quanto a adicionar um bot\u00e3o para acionar uma a\u00e7\u00e3o, seguiremos o mesmo m\u00e9todo que o pr\u00f3prio Gravity Forms faz. H\u00e1 um elemento de formul\u00e1rio envolvendo toda a tela de detalhes da entrada, e tudo o que precisamos fazer \u00e9 adicionar um evento onclick em um bot\u00e3o de envio que alterar\u00e1 a <code>action<\/code>propriedade &#8216; &#8216;. Definimos nosso pr\u00f3prio nome de a\u00e7\u00e3o personalizado, para que saibamos quando ele foi acionado \u2013 e n\u00e3o entre em conflito com as a\u00e7\u00f5es do Gravity Forms.<\/p>\n<p>Vamos chamar nossa a\u00e7\u00e3o personalizada &#8216; <code>awp_gf_create_user<\/code>&#8216; e renderizar um bot\u00e3o de envio com um evento onclick assim:<\/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>Com o c\u00f3digo acima, obteremos uma nova metabox na lateral da tela de detalhes da entrada, assim:<\/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=\"Criar conte\u00fado programaticamente a partir de entradas de formul\u00e1rios de gravidade\" ><\/a><\/p>\n<p>Agora nada acontece ao clicar no bot\u00e3o. Isso \u00e9 porque ainda n\u00e3o escrevemos nenhum c\u00f3digo para ouvi-lo.<\/p>\n<h2>Extraindo valores da entrada<\/h2>\n<p>Conforme mencionado anteriormente, todos os valores enviados na matriz de entrada s\u00e3o identificados por seus IDs de 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=\"Criar conte\u00fado programaticamente a partir de entradas de formul\u00e1rios de gravidade\" ><\/a><\/p>\n<p>Na imagem acima o campo ID 1 \u00e9 para nome, ID 2 \u00e9 sobrenome e assim por diante. Mas espere \u2013 o que est\u00e1 acontecendo com 5.1, 5.3 e assim por diante? No Gravity Forms, obtemos &quot;sub-IDs&quot; para campos especiais que aceitam v\u00e1rios valores. Adicionei um campo de endere\u00e7o ao meu formul\u00e1rio que \u00e9 um campo, mas v\u00e1rias entradas. Cada entrada nesse campo recebe seus pr\u00f3prios IDs, anexados ao ID principal e um ponto final. Se voc\u00ea n\u00e3o usa nenhum desses campos de m\u00faltiplas entradas, \u00f3timo! O c\u00f3digo fica bem simples. Mas inclu\u00ed este campo especial para que possamos ver como acess\u00e1-lo.<\/p>\n<p>No momento, nosso problema \u00e9 que o c\u00f3digo n\u00e3o sabe para que serve o ID de campo 1, 2 ou 3. Essa informa\u00e7\u00e3o est\u00e1 no array de formul\u00e1rio, mais especificamente no <code>$form['fields']<\/code>elemento. Este elemento cont\u00e9m todos os campos do formul\u00e1rio e temos acesso total a cada objeto de campo. \u00c9 aqui que podemos encontrar o m\u00e9todo de identifica\u00e7\u00e3o escolhido; no meu exemplo <code>cssClass<\/code>.<\/p>\n<p>Podemos simplesmente percorrer esses campos e procurar os identificadores que queremos extrair. Vou colocar todos os meus identificadores em um array e podemos simplesmente verificar se um campo no loop \u00e9 um desses.<\/p>\n<p>Mas primeiro precisamos saber que o bot\u00e3o foi clicado. Isso \u00e9 bem simples; podemos simplesmente verificar se nossa a\u00e7\u00e3o personalizada reside no <code>$_POST<\/code>array. Mas como estamos trabalhando com Gravity Forms podemos usar <code>[rgpost](https:\/\/docs.gravityforms.com\/rgpost\/)()<\/code>. A fun\u00e7\u00e3o Gravity Forms <code>rgpost()<\/code>simplesmente retorna o valor de uma solicita\u00e7\u00e3o POST. Verificando <code>rgpost('awp_gf_create_user')<\/code>e <code>$_POST['awp_gf_create_user']<\/code>\u00e9 exatamente o mesmo. Mas vamos usar a fun\u00e7\u00e3o 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>Na linha <code>#8<\/code>definimos um array com todos os identificadores personalizados que desejamos pesquisar. Estes s\u00e3o todos os valores que eu inseri como classe CSS no meu formul\u00e1rio. Ent\u00e3o, no loop de cada campo, verificamos se o campo \u00e9 um desses identificadores. No meu exemplo estou usando a classe CSS para identificar campos, mas recomendo usar entradas personalizadas. Este c\u00f3digo tamb\u00e9m n\u00e3o funcionar\u00e1 se v\u00e1rias classes CSS forem fornecidas.<\/p>\n<p>Ent\u00e3o, na linha <code>#12<\/code>, adicionamos um novo elemento ao nosso array de valores finais com o identificador como chave. Em seguida, usamos o ID do campo e referenciamos a matriz de entrada. No final deste loop <code>$values<\/code>deve ser preenchido com quaisquer valores enviados que sejam relevantes. Quaisquer campos que foram deixados em branco ou n\u00e3o inclu\u00eddos no array identificador ser\u00e3o exclu\u00eddos.<\/p>\n<p>Se voc\u00ea adicionou um campo de entrada m\u00faltiplo especial, precisar\u00e1 adicionar algum c\u00f3digo extra para referenciar adequadamente os sub-IDs. Eu sei que <code>awp_address<\/code>\u00e9 um tipo de campo de endere\u00e7o. Os tipos de campo de endere\u00e7o no Gravity Forms seguem um padr\u00e3o fixo de sub IDs e eu habilitei apenas tr\u00eas das entradas poss\u00edveis (endere\u00e7o 1 tem sub ID 1, c\u00f3digo postal tem sub ID 3 e Cidade tem sub ID 5). Para lidar com esses tipos de campos, precisamos fazer algo assim:<\/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>Na linha <code>#4<\/code>eu concateno todos os valores para que a string final seja um formato padronizado de endere\u00e7o de uma linha (&#8220;, &#8220;).<\/p>\n<p>Agora temos todos os valores necess\u00e1rios bem ordenados por chaves identificadoras no array <code>$values<\/code>. O que voc\u00ea faz com isso depende inteiramente de voc\u00ea e das necessidades do seu projeto. Mas vou incluir um exemplo de cria\u00e7\u00e3o de um usu\u00e1rio no WordPress.<\/p>\n<h2>Criando um novo usu\u00e1rio a partir do envio da entrada<\/h2>\n<p>Para manter meu c\u00f3digo limpo, chamarei uma fun\u00e7\u00e3o separada respons\u00e1vel por criar um novo usu\u00e1rio. Tudo que eu preciso \u00e9 passar o array de valores. Eu quero que esta fun\u00e7\u00e3o retorne algum tipo de indica\u00e7\u00e3o do resultado desta a\u00e7\u00e3o. Desta forma posso criar uma mensagem se o usu\u00e1rio foi ou n\u00e3o criado com sucesso ou se j\u00e1 existe um usu\u00e1rio com o email fornecido.<\/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>Ent\u00e3o simplesmente definimos a <code>awp_gf_create_user()<\/code>fun\u00e7\u00e3o. Vou incluir um exemplo simples de cria\u00e7\u00e3o de um usu\u00e1rio programaticamente no WordPress. Isso \u00e9 simplesmente um exemplo para mostrar como usar os valores extra\u00eddos.<\/p>\n<p>Primeiro, verificamos se existe um usu\u00e1rio com o e-mail fornecido com <code>[get_user_by](https:\/\/developer.wordpress.org\/reference\/functions\/get_user_by\/)()<\/code>. Caso contr\u00e1rio, usamos <code>[wp_insert_user](https:\/\/developer.wordpress.org\/reference\/functions\/wp_insert_user\/)()<\/code>para adicionar um usu\u00e1rio. Tamb\u00e9m inclu\u00ed um exemplo de armazenamento de meta de usu\u00e1rio personalizado (nosso campo de endere\u00e7o). Finalmente nosso m\u00e9todo deve retornar o resultado da cria\u00e7\u00e3o do usu\u00e1rio. Se o usu\u00e1rio j\u00e1 existia, retornamos -1. Caso contr\u00e1rio, retornamos o ID do usu\u00e1rio.<\/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 volta \u00e0 nossa metabox render, agora podemos adicionar condicionalmente uma mensagem ao usu\u00e1rio final com base no resultado disso. Este \u00e9 um exemplo simples; se o valor retornado for -1, j\u00e1 existe um usu\u00e1rio com o email fornecido. E se o valor retornado for maior que 0, sabemos que criou um usu\u00e1rio com sucesso. Assim, solicitamos uma mensagem informando que a cria\u00e7\u00e3o do usu\u00e1rio foi bem-sucedida.<\/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>Evitando conte\u00fado duplicado<\/h2>\n<p>O exemplo simples acima desabilitar\u00e1 por heran\u00e7a a cria\u00e7\u00e3o de v\u00e1rios usu\u00e1rios da mesma entrada porque verifica se j\u00e1 existe um usu\u00e1rio com o endere\u00e7o de e-mail fornecido. Mas em outros casos voc\u00ea pode n\u00e3o ter essa oportunidade. Portanto, outra estrat\u00e9gia para evitar que os usu\u00e1rios finais criem conte\u00fado duplicado da mesma entrada \u00e9 adicionar meta de entrada personalizada. Em outras palavras; se a a\u00e7\u00e3o foi bem-sucedida, adicionamos uma meta personalizada a essa entrada. E ent\u00e3o simplesmente verificamos se essa meta personalizada existe antes de iniciar a a\u00e7\u00e3o.<\/p>\n<p>O Gravity Forms oferece m\u00e9todos para adicionar meta personalizado \u00e0s entradas; <code>[gform_add_meta](https:\/\/docs.gravityforms.com\/gform_add_meta\/)()<\/code>bem como buscar valores: <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>Na linha <code>#4<\/code>, buscamos nossa meta de entrada personalizada. Se existisse (n\u00e3o vazio), definimos uma mensagem informando ao usu\u00e1rio final que ele j\u00e1 tentou criar conte\u00fado a partir dessa entrada antes. Se a meta personalizada n\u00e3o existia, continuamos criando nosso conte\u00fado. Quando o conte\u00fado foi criado com sucesso, precisamos adicionar a meta personalizada \u00e0 entrada (linha <code>#10<\/code>).<\/p>\n<h2>Conclus\u00e3o e c\u00f3digo final<\/h2>\n<p>Neste post tentei dar um exemplo de como criar conte\u00fado a partir de uma entrada no Gravity Forms. Os exemplos de c\u00f3digo destinam-se a dar uma ideia de como personaliz\u00e1-lo e alter\u00e1-lo para atender \u00e0s necessidades do seu projeto. Definitivamente, recomendo expandir essa funcionalidade para lidar melhor com as mensagens de erro. Voc\u00ea tamb\u00e9m pode querer apenas adicionar esta metabox para um formul\u00e1rio espec\u00edfico. Mas esta deve ser uma boa base para construir.<\/p>\n<p>E aqui est\u00e1 o c\u00f3digo final:<\/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 de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este post ir\u00e1 gui\u00e1-lo em como criar qualquer tipo de conte\u00fado (usu\u00e1rios, posts ou qualquer outra coisa personalizada) com base em entradas em um formul\u00e1rio 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":[898,898,920,1110,920,816,816,846,846,867,867],"tags":[1170],"class_list":["post-233994","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-outro","category-n-a","category-plug-ins","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233994"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233994\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/151471"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}