{"id":233932,"date":"2023-02-26T17:36:00","date_gmt":"2023-02-26T14:36:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233932"},"modified":"2022-11-11T13:14:44","modified_gmt":"2022-11-11T10:14:44","slug":"skapa-innehaall-fraan-gravity-forms-poster","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/skapa-innehaall-fraan-gravity-forms-poster\/","title":{"rendered":"Skapa inneh\u00e5ll fr\u00e5n Gravity Forms-poster"},"content":{"rendered":"\n<p>Det h\u00e4r inl\u00e4gget kommer att guida dig i hur du skapar n\u00e5gon form av inneh\u00e5ll (anv\u00e4ndare, inl\u00e4gg eller n\u00e5got annat anpassat) baserat p\u00e5 poster i ett Gravity Forms-formul\u00e4r. Vi kommer att l\u00e4gga till ett omr\u00e5de p\u00e5 sk\u00e4rmen f\u00f6r intr\u00e4desdetaljer i admin f\u00f6r att skapa inneh\u00e5ll baserat p\u00e5 den inl\u00e4mnade informationen.<\/p>\n<h2>Vad vi ska g\u00f6ra<\/h2>\n<p>Vi kommer att skapa en ny metabox i Gravity Forms sk\u00e4rm f\u00f6r intr\u00e4desdetaljer. I denna metabox l\u00e4gger vi till en knapp. Tanken \u00e4r att slutanv\u00e4ndaren kan granska inl\u00e4gget och om de godk\u00e4nner intr\u00e4desdetaljerna kan de trycka p\u00e5 knappen f\u00f6r att utl\u00f6sa inneh\u00e5llsskapandet.<\/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=\"Skapa inneh\u00e5ll fr\u00e5n Gravity Forms-poster\" ><\/a><\/p>\n<p>V\u00e5r kod kommer att triggas n\u00e4r du klickar p\u00e5 den h\u00e4r knappen, utf\u00f6r den n\u00f6dv\u00e4ndiga \u00e5tg\u00e4rden och vi kommer valfritt att presentera ett meddelande om resultatet f\u00f6r slutanv\u00e4ndaren. Vi kommer ocks\u00e5 (valfritt) att l\u00e4gga till metadata till posten s\u00e5 att vi enkelt kan kontrollera om inneh\u00e5ll har skapats fr\u00e5n denna post tidigare eller inte.<\/p>\n<p>Jag kommer att h\u00e5lla koden ganska enkel och generell s\u00e5 att du enkelt kan ers\u00e4tta och justera den f\u00f6r att passa ditt projekts behov. I exemplet nedan kommer jag att anta att vi vill skapa en anv\u00e4ndare programm\u00e4ssigt. Men vad du g\u00f6r med intr\u00e4desuppgifterna \u00e4r helt upp till dig; du kan skapa ett inl\u00e4gg, uppdatera annat inneh\u00e5ll eller skicka ett anpassat e-postmeddelande om du vill.<\/p>\n<h2>Identifiera f\u00e4lten<\/h2>\n<p>Det f\u00f6rsta vi m\u00e5ste t\u00e4nka p\u00e5 \u00e4r hur man identifierar f\u00e4lten. Med andra ord m\u00e5ste vi veta vilket f\u00e4lt som \u00e4r vad. T\u00e4nk p\u00e5 att en posts v\u00e4rden i Gravity Forms h\u00e4nvisas till deras formul\u00e4rf\u00e4lts-ID. Och \u00e4ven med tillg\u00e5ng till varje formul\u00e4rf\u00e4ltinformation \u2013 vi beh\u00f6ver ett s\u00e4kert s\u00e4tt att veta vilka f\u00e4lt som \u00e4r vilken information. Ett formul\u00e4r kan best\u00e5 av fyra textinmatningar \u2013 vi beh\u00f6ver veta vilken av de fyra textinmatningarna som \u00e4r f\u00f6r f\u00f6rnamnet.<\/p>\n<p>Du har n\u00e5gra alternativ h\u00e4r. Du kan h\u00e5rdkoda f\u00e4lt-ID:n (t.ex. best\u00e4mma att f\u00e4lt-ID 2 \u00e4r efternamn), men detta \u00e4r mycket ben\u00e4get att fel och rekommenderas inte. Ett enkelt s\u00e4tt \u00e4r att anv\u00e4nda en av de befintliga f\u00e4ltinformationsing\u00e5ngarna i Gravity Forms, till exempel CSS-klassnamn. Men kom ih\u00e5g att slutanv\u00e4ndaren kan tillhandah\u00e5lla flera klassnamn f\u00f6r att f\u00e5 den stil de vill ha, och din kod kan l\u00e4tt g\u00e5 s\u00f6nder om du inte analyserar den h\u00e4r str\u00e4ngen ordentligt. Det s\u00e4tt jag definitivt rekommenderar \u00e4r att l\u00e4gga till dina egna anpassade indata till f\u00e4lt:<\/p>\n<p>Om du vill ha en solid metod f\u00f6r att identifiera f\u00e4lt f\u00f6r din kod, kolla definitivt in hur i inl\u00e4gget ovan. Men f\u00f6r att h\u00e5lla det enkelt i det h\u00e4r inl\u00e4gget kommer jag att anv\u00e4nda CSS-klassen och anta att anv\u00e4ndaren inte anger n\u00e5got annat \u00e4n de v\u00e4rden vi beh\u00f6ver inom detta omr\u00e5de.<\/p>\n<h2>Skapar formul\u00e4ret<\/h2>\n<p>Det f\u00f6rsta steget \u00e4r naturligtvis att st\u00e4lla in formul\u00e4ret med de f\u00e4lt och f\u00e4lttyper du beh\u00f6ver. Och sedan s\u00e4tter du in f\u00e4ltidentifierarna p\u00e5 sina r\u00e4tta platser. Som ett exempel har jag det h\u00e4r formul\u00e4ret:<\/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=\"Skapa inneh\u00e5ll fr\u00e5n Gravity Forms-poster\" ><\/a><\/p>\n<p>Och f\u00f6r varje f\u00e4lt jag vill inkludera tillhandah\u00e5ller jag en anpassad CSS-klass som jag kan rikta in mig p\u00e5 i min kod. Till exempel f\u00f6r f\u00f6rnamn;<\/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=\"Skapa inneh\u00e5ll fr\u00e5n Gravity Forms-poster\" ><\/a><\/p>\n<p>L\u00e5t oss nu g\u00e5 vidare till kod och hur man skapar en funktionalitet som omvandlar inl\u00e4mningar till anpassat inneh\u00e5ll.<\/p>\n<h2>L\u00e4gga till en metabox i inmatningsdetaljer<\/h2>\n<p>Det f\u00f6rsta steget \u00e4r att l\u00e4gga till n\u00e5gon form av handlingstrigger f\u00f6r att skapa v\u00e5rt anpassade inneh\u00e5ll. En naturlig plats finns p\u00e5 sk\u00e4rmen f\u00f6r inmatningsdetaljer. Detta g\u00f6r att slutanv\u00e4ndaren kan granska de inl\u00e4mnade v\u00e4rdena och sedan best\u00e4mma om de ska skapa inneh\u00e5ll av dem eller inte. Gravity Forms l\u00e5ter utvecklare enkelt skapa anpassade metaboxar p\u00e5 dessa sk\u00e4rmar.<\/p>\n<p>F\u00f6r att skapa en anpassad metabox f\u00f6r inmatningsdetaljer kan vi anv\u00e4nda filtret <code>gform_entry_detail_meta_boxes<\/code>. Det \u00e4r ett filter som returnerar en array av alla metaboxar f\u00f6r att visas i inmatningsdetaljer. Vi l\u00e4gger helt enkelt till ett nytt arrayelement f\u00f6r att skapa en ny metabox och definierar en \u00e5teruppringningsfunktion f\u00f6r att \u00e5terge dess inneh\u00e5ll. Vi anger en trevlig beskrivande titel i &#8217; <code>title<\/code>&#8217; och definierar dess position s\u00e5 att den visas i &#8217; <code>side<\/code>&#8217;.<\/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>Och d\u00e5 m\u00e5ste vi definiera callback-funktionen: <code>awp_gf_create_user_metabox_render()<\/code>i v\u00e5r kod. Denna funktion \u00e4r ansvarig f\u00f6r att rendera inneh\u00e5llet i metaboxen. Som parameter till denna funktion f\u00e5r vi en array av argument, i vilka vi kan h\u00e4mta form- och inmatningsobjektet;<\/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>Allt vi beh\u00f6ver g\u00f6ra i den h\u00e4r funktionen \u00e4r att bygga upp lite HTML och upprepa det.<\/p>\n<p>N\u00e4r det g\u00e4ller att l\u00e4gga till en knapp f\u00f6r att utl\u00f6sa en \u00e5tg\u00e4rd kommer vi att f\u00f6lja samma metod som Gravity Forms sj\u00e4lv g\u00f6r det. Det finns ett formul\u00e4relement som omsluter hela sk\u00e4rmen f\u00f6r inmatningsdetaljer, och allt vi beh\u00f6ver g\u00f6ra \u00e4r att l\u00e4gga till en onclick-h\u00e4ndelse p\u00e5 en skicka-knapp som kommer att \u00e4ndra <code>action<\/code>egenskapen &#8217; &#8217;. Vi definierar v\u00e5rt eget anpassade \u00e5tg\u00e4rdsnamn, s\u00e5 att vi vet n\u00e4r det har utl\u00f6sts \u2013 och det kommer inte i konflikt med Gravity Forms handlingar.<\/p>\n<p>L\u00e5t oss kalla v\u00e5r anpassade \u00e5tg\u00e4rd &#8217; <code>awp_gf_create_user<\/code>&#8217; och \u00e5terge en skicka-knapp med en onclick-h\u00e4ndelse s\u00e5 h\u00e4r:<\/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>Med ovanst\u00e5ende kod kommer vi att f\u00e5 en ny metabox vid sidan av inmatningsinformationssk\u00e4rmen, som ser ut s\u00e5 h\u00e4r:<\/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=\"Skapa inneh\u00e5ll fr\u00e5n Gravity Forms-poster\" ><\/a><\/p>\n<p>Just nu h\u00e4nder ingenting n\u00e4r man klickar p\u00e5 knappen. Det \u00e4r bara f\u00f6r att vi inte har skrivit n\u00e5gon kod f\u00f6r att lyssna p\u00e5 den \u00e4n.<\/p>\n<h2>Extrahera v\u00e4rden fr\u00e5n posten<\/h2>\n<p>Som tidigare n\u00e4mnts identifieras alla inl\u00e4mnade v\u00e4rden i inmatningsmatrisen av deras f\u00e4lt-ID.<\/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=\"Skapa inneh\u00e5ll fr\u00e5n Gravity Forms-poster\" ><\/a><\/p>\n<p>I bilden ovan \u00e4r f\u00e4ltet ID 1 f\u00f6r f\u00f6rnamn, ID 2 \u00e4r efternamn och s\u00e5 vidare. Men h\u00e5ll ut \u2013 vad h\u00e4nder med 5.1, 5.3 och s\u00e5 vidare? I Gravity Forms f\u00e5r vi &quot;sub-ID&quot; f\u00f6r specialf\u00e4lt som accepterar flera v\u00e4rden. Jag har lagt till ett adressf\u00e4lt i mitt formul\u00e4r som \u00e4r ett f\u00e4lt, men flera inmatningar. Varje ing\u00e5ng inom detta f\u00e4lt f\u00e5r sina egna ID:n, l\u00e4ggs till huvud-ID:t och en punkt. Om du inte anv\u00e4nder n\u00e5got av dessa f\u00e4lt med flera inmatningar, bra! Koden blir v\u00e4ldigt enkel. Men jag har inkluderat det h\u00e4r specialf\u00e4ltet s\u00e5 att vi kan se hur man kommer \u00e5t det.<\/p>\n<p>Just nu \u00e4r v\u00e5rt problem att koden inte vet vad f\u00e4lt ID 1, 2 eller 3 \u00e4r till f\u00f6r. Den informationen ligger i formmatrisen, mer specifikt <code>$form['fields']<\/code>elementet. Detta element inneh\u00e5ller alla f\u00e4lt i formul\u00e4ret, och vi har full tillg\u00e5ng till varje f\u00e4ltobjekt. Det \u00e4r h\u00e4r vi kan hitta v\u00e5r valda identifieringsmetod; i mitt exempel <code>cssClass<\/code>.<\/p>\n<p>Vi kan helt enkelt g\u00e5 igenom dessa f\u00e4lt och leta efter de identifierare vi vill extrahera. Jag l\u00e4gger alla mina identifierare i en array och vi kan helt enkelt kontrollera om ett f\u00e4lt i slingan \u00e4r ett av dessa.<\/p>\n<p>Men f\u00f6rst m\u00e5ste vi veta att knappen klickades. Detta \u00e4r ganska enkelt; vi kan helt enkelt kontrollera om v\u00e5r anpassade \u00e5tg\u00e4rd finns i <code>$_POST<\/code>arrayen. Men eftersom vi arbetar med Gravity Forms kan vi anv\u00e4nda <code>[rgpost](https:\/\/docs.gravityforms.com\/rgpost\/)()<\/code>. Gravity Forms-funktionen <code>rgpost()<\/code>returnerar helt enkelt v\u00e4rdet av en POST-beg\u00e4ran. Kontrollerar <code>rgpost('awp_gf_create_user')<\/code>och <code>$_POST['awp_gf_create_user']<\/code>\u00e4r exakt samma. Men vi kommer att anv\u00e4nda Gravity Forms funktion.<\/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>P\u00e5 line <code>#8<\/code>definierar vi en array med alla anpassade identifierare vi vill s\u00f6ka efter. Det h\u00e4r \u00e4r alla v\u00e4rden som jag har angett som CSS-klass i mitt formul\u00e4r. Sedan, i loopen f\u00f6r varje f\u00e4lt, kontrollerar vi om f\u00e4ltet \u00e4r en av dessa identifierare. I mitt exempel anv\u00e4nder jag CSS-klassen f\u00f6r att identifiera f\u00e4lt men jag rekommenderar att du anv\u00e4nder anpassade indata. Denna kod kommer inte heller att fungera om flera CSS-klasser gavs.<\/p>\n<p>Sedan <code>#12<\/code>l\u00e4gger vi vid raden till ett nytt element till v\u00e5r slutliga v\u00e4rdematris med identifieraren som nyckel. Vi anv\u00e4nder sedan f\u00e4ltets ID och refererar till inmatningsmatrisen. I slutet av denna loop <code>$values<\/code>ska fyllas i med eventuella inl\u00e4mnade v\u00e4rden som \u00e4r relevanta. Alla f\u00e4lt som l\u00e4mnats tomma eller som inte ing\u00e5r i identifieringsmatrisen kommer att exkluderas.<\/p>\n<p>Om du har lagt till ett speciellt multipelinmatningsf\u00e4lt m\u00e5ste du l\u00e4gga till lite extra kod f\u00f6r att korrekt referera till sub-ID:n. Jag vet att det <code>awp_address<\/code>\u00e4r en adressf\u00e4ltstyp. Adressf\u00e4lttyper i Gravity Forms f\u00f6ljer ett fast m\u00f6nster av sub-ID:n och jag har bara aktiverat tre m\u00f6jliga ing\u00e5ngar (Gatuadress 1 har sub-ID 1, postnummer har sub-ID 3 och City har sub-ID 5). F\u00f6r att hantera den h\u00e4r typen av f\u00e4lt m\u00e5ste vi g\u00f6ra n\u00e5got s\u00e5 h\u00e4r:<\/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>P\u00e5 rad <code>#4<\/code>sammanfogar jag alla v\u00e4rden s\u00e5 att den sista str\u00e4ngen \u00e4r ett standardiserat enradsadressformat (&#8221;, &#8221;).<\/p>\n<p>Vi har nu alla n\u00f6dv\u00e4ndiga v\u00e4rden snyggt sorterade efter identifieringsnycklar i arrayen <code>$values<\/code>. Vad du g\u00f6r med detta \u00e4r helt upp till dig och ditt projekts behov. Men jag kommer att ta med ett exempel p\u00e5 att skapa en anv\u00e4ndare i WordPress.<\/p>\n<h2>Skapa en ny anv\u00e4ndare fr\u00e5n inl\u00e4mning<\/h2>\n<p>F\u00f6r att h\u00e5lla min kod ren kommer jag att anropa en separat funktion som ansvarar f\u00f6r att skapa en ny anv\u00e4ndare. Allt jag beh\u00f6ver \u00e4r att passera v\u00e4rdematrisen. Jag vill att den h\u00e4r funktionen ska returnera n\u00e5gon form av indikation p\u00e5 resultatet av denna \u00e5tg\u00e4rd. P\u00e5 s\u00e5 s\u00e4tt kan jag skapa ett meddelande oavsett om anv\u00e4ndaren skapades framg\u00e5ngsrikt eller om det redan finns en anv\u00e4ndare med den angivna e-postadressen.<\/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>Sedan definierar vi helt enkelt <code>awp_gf_create_user()<\/code>funktionen. Jag kommer att inkludera ett enkelt exempel p\u00e5 att skapa en anv\u00e4ndare programmatiskt i WordPress. Detta \u00e4r helt enkelt menat som ett exempel f\u00f6r att visa hur man anv\u00e4nder de extraherade v\u00e4rdena.<\/p>\n<p>F\u00f6rst kontrollerar vi om en anv\u00e4ndare med den angivna e-postadressen finns med <code>[get_user_by](https:\/\/developer.wordpress.org\/reference\/functions\/get_user_by\/)()<\/code>. Om inte anv\u00e4nder vi <code>[wp_insert_user](https:\/\/developer.wordpress.org\/reference\/functions\/wp_insert_user\/)()<\/code>f\u00f6r att l\u00e4gga till en anv\u00e4ndare. Jag har ocks\u00e5 inkluderat ett exempel p\u00e5 lagring av anpassad anv\u00e4ndarmeta (v\u00e5rt adressf\u00e4lt). Slutligen b\u00f6r v\u00e5r metod returnera resultatet av att skapa anv\u00e4ndaren. Om anv\u00e4ndaren redan fanns returnerar vi -1. Annars returnerar vi anv\u00e4ndar-ID.<\/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>Tillbaka i v\u00e5r metabox-rendering kan vi nu villkorligt l\u00e4gga till ett meddelande till slutanv\u00e4ndaren baserat p\u00e5 resultatet av detta. Detta \u00e4r ett enkelt exempel; om det returnerade v\u00e4rdet var -1 finns det redan en anv\u00e4ndare med den angivna e-postadressen. Och om det returnerade v\u00e4rdet var st\u00f6rre \u00e4n 0 vet vi att det har skapat en anv\u00e4ndare. D\u00e4rf\u00f6r f\u00e5r vi ett meddelande som s\u00e4ger att anv\u00e4ndarskapandet lyckades.<\/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>Undvik duplicerat inneh\u00e5ll<\/h2>\n<p>Det enkla exemplet ovan kommer att inaktivera skapande av flera anv\u00e4ndare fr\u00e5n samma post eftersom det kontrollerar om en anv\u00e4ndare med angivna e-postadresser redan finns eller inte. Men i andra fall kanske du inte har denna m\u00f6jlighet. S\u00e5 en annan strategi f\u00f6r att undvika att slutanv\u00e4ndare skapar duplicerat inneh\u00e5ll fr\u00e5n samma post \u00e4r att l\u00e4gga till anpassad ing\u00e5ngsmeta. Med andra ord; om \u00e5tg\u00e4rden lyckades l\u00e4gger vi till en anpassad meta till den posten. Och sedan kontrollerar vi helt enkelt om den anpassade metan finns innan vi startar handlingen.<\/p>\n<p>Gravity Forms erbjuder metoder f\u00f6r att l\u00e4gga till anpassade meta till poster; <code>[gform_add_meta](https:\/\/docs.gravityforms.com\/gform_add_meta\/)()<\/code>samt h\u00e4mta v\u00e4rden: <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>P\u00e5 raden <code>#4<\/code>h\u00e4mtar vi v\u00e5r anpassade ing\u00e5ngsmeta. Om det fanns (inte tomt), st\u00e4ller vi in \u200b\u200bett meddelande som informerar slutanv\u00e4ndaren om att han eller hon redan har f\u00f6rs\u00f6kt skapa inneh\u00e5ll fr\u00e5n denna post tidigare. Om den anpassade metan inte existerade forts\u00e4tter vi att skapa v\u00e5rt inneh\u00e5ll. N\u00e4r inneh\u00e5llet har skapats m\u00e5ste vi l\u00e4gga till den anpassade metan till posten (rad <code>#10<\/code>).<\/p>\n<h2>Slutsats och slutlig kod<\/h2>\n<p>I det h\u00e4r inl\u00e4gget har jag f\u00f6rs\u00f6kt ge ett exempel p\u00e5 hur man skapar inneh\u00e5ll fr\u00e5n en post i Gravity Forms. Kodexemplen \u00e4r t\u00e4nkta att ge dig en uppfattning om hur du kan anpassa och \u00e4ndra den f\u00f6r att passa ditt projekts behov. Jag rekommenderar definitivt att ut\u00f6ka denna funktionalitet f\u00f6r att hantera felmeddelanden b\u00e4ttre. Du kanske ocks\u00e5 vill l\u00e4gga till denna metabox f\u00f6r en specifik form. Men det h\u00e4r borde vara en bra bas att bygga vidare p\u00e5.<\/p>\n<p>Och h\u00e4r \u00e4r den sista koden:<\/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\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Det h\u00e4r inl\u00e4gget kommer att guida dig i hur du skapar n\u00e5gon form av inneh\u00e5ll (anv\u00e4ndare, inl\u00e4gg eller n\u00e5got annat anpassat) baserat p\u00e5 poster i ett Gravity Forms-formul\u00e4r.<\/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":[901,848,901,922,1110,922,818,818,848,868,868],"tags":[1173],"class_list":["post-233932","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-handledningar","category-oevrig","category-n-a","category-plugins-3","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233932"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233932\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/151471"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233932"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233932"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}