{"id":233976,"date":"2023-02-26T17:07:00","date_gmt":"2023-02-26T14:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233976"},"modified":"2022-11-11T13:30:56","modified_gmt":"2022-11-11T10:30:56","slug":"programowe-tworzenie-tresci-z-wpisow-formularzy-grawitacyjnych","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/programowe-tworzenie-tresci-z-wpisow-formularzy-grawitacyjnych\/","title":{"rendered":"Programowe tworzenie tre\u015bci z wpis\u00f3w formularzy grawitacyjnych"},"content":{"rendered":"\n<p>Ten post poprowadzi Ci\u0119, jak tworzy\u0107 wszelkiego rodzaju tre\u015bci (u\u017cytkownicy, posty lub co\u015b innego niestandardowego) na podstawie wpis\u00f3w w formularzu Gravity Forms. Dodamy obszar na ekranie szczeg\u00f3\u0142\u00f3w wpisu w admin, aby tworzy\u0107 tre\u015bci na podstawie przes\u0142anych informacji.<\/p>\n<h2>Co zrobimy<\/h2>\n<p>Stworzymy nowy metabox na ekranie szczeg\u00f3\u0142\u00f3w wpisu Gravity Form. W tym metabox dodamy przycisk. Chodzi o to, aby u\u017cytkownik ko\u0144cowy m\u00f3g\u0142 przejrze\u0107 wpis, a je\u015bli zatwierdzi szczeg\u00f3\u0142y wpisu, mo\u017ce nacisn\u0105\u0107 przycisk, aby uruchomi\u0107 tworzenie tre\u015bci.<\/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=\"Programowe tworzenie tre\u015bci z wpis\u00f3w formularzy grawitacyjnych\" ><\/a><\/p>\n<p>Nasz kod zostanie wyzwolony po klikni\u0119ciu tego przycisku, wykonaniu niezb\u0119dnej akcji, a opcjonalnie zaprezentujemy u\u017cytkownikowi ko\u0144cowemu komunikat o wyniku. Dodamy r\u00f3wnie\u017c (opcjonalnie) metadane do wpisu, aby\u015bmy mogli \u0142atwo sprawdzi\u0107, czy tre\u015b\u0107 zosta\u0142a utworzona z tego wpisu wcze\u015bniej, czy nie.<\/p>\n<p>Postaram si\u0119, aby kod by\u0142 do\u015b\u0107 prosty i og\u00f3lny, dzi\u0119ki czemu mo\u017cna go \u0142atwo podmienia\u0107 i dostosowywa\u0107 do potrzeb projektu. W poni\u017cszym przyk\u0142adzie za\u0142o\u017c\u0119, \u017ce chcemy programowo utworzy\u0107 u\u017cytkownika. Ale to, co zrobisz ze szczeg\u00f3\u0142ami wpisu, zale\u017cy wy\u0142\u0105cznie od Ciebie; mo\u017cesz utworzy\u0107 post, zaktualizowa\u0107 inne tre\u015bci lub wys\u0142a\u0107 niestandardowy e-mail, je\u015bli chcesz.<\/p>\n<h2>Identyfikacja p\u00f3l<\/h2>\n<p>Pierwsz\u0105 kwesti\u0105, kt\u00f3r\u0105 musimy zrobi\u0107, jest to, jak zidentyfikowa\u0107 pola. Innymi s\u0142owy, musimy wiedzie\u0107, kt\u00f3re pole jest czym. Pami\u0119taj, \u017ce warto\u015bci wpisu w Gravity Forms odnosz\u0105 si\u0119 do ich identyfikator\u00f3w p\u00f3l formularza. A nawet maj\u0105c dost\u0119p do informacji z ka\u017cdego pola formularza \u2013 potrzebujemy niezawodnego sposobu, aby wiedzie\u0107, kt\u00f3re pola s\u0105 jakimi informacjami. Formularz mo\u017ce sk\u0142ada\u0107 si\u0119 z czterech wej\u015b\u0107 tekstowych \u2014 musimy wiedzie\u0107, kt\u00f3re z czterech wej\u015b\u0107 tekstowych dotycz\u0105 imienia.<\/p>\n<p>Masz tutaj kilka alternatyw. Mo\u017cna na sta\u0142e zakodowa\u0107 identyfikatory p\u00f3l (np. okre\u015bli\u0107, \u017ce identyfikator pola 2 to nazwisko), ale jest to bardzo podatne na b\u0142\u0119dy i nie jest zalecane. Prostym sposobem jest u\u017cycie jednego z istniej\u0105cych danych wej\u015bciowych pola w Gravity Forms, na przyk\u0142ad nazwy klasy CSS. Nale\u017cy jednak pami\u0119ta\u0107, \u017ce u\u017cytkownik ko\u0144cowy mo\u017ce poda\u0107 wiele nazw klas, aby uzyska\u0107 \u017c\u0105dan\u0105 stylizacj\u0119, a kod mo\u017ce \u0142atwo si\u0119 zepsu\u0107, je\u015bli nie przeanalizujesz prawid\u0142owo tego ci\u0105gu. Zdecydowanie polecam dodawanie w\u0142asnych niestandardowych danych wej\u015bciowych do p\u00f3l:<\/p>\n<p>Je\u015bli chcesz solidnej metody identyfikacji p\u00f3l dla Twojego kodu, zdecydowanie sprawd\u017a jak w powy\u017cszym po\u015bcie. Ale \u017ceby to upro\u015bci\u0107 w tym po\u015bcie, u\u017cyj\u0119 klasy CSS i za\u0142o\u017c\u0119, \u017ce u\u017cytkownik nie wprowadza niczego poza warto\u015bciami, kt\u00f3rych potrzebujemy w tym obszarze.<\/p>\n<h2>Konfiguracja formularza<\/h2>\n<p>Pierwszym krokiem jest oczywi\u015bcie skonfigurowanie formularza z potrzebnymi polami i typami p\u00f3l. A nast\u0119pnie wstawiasz identyfikatory p\u00f3l we w\u0142a\u015bciwych miejscach. Jako przyk\u0142ad mam ten formularz:<\/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=\"Programowe tworzenie tre\u015bci z wpis\u00f3w formularzy grawitacyjnych\" ><\/a><\/p>\n<p>I dla ka\u017cdego pola, kt\u00f3re chc\u0119 uwzgl\u0119dni\u0107, dostarczam niestandardow\u0105 klas\u0119 CSS, kt\u00f3r\u0105 mog\u0119 kierowa\u0107 w swoim kodzie. Na przyk\u0142ad na imi\u0119;<\/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=\"Programowe tworzenie tre\u015bci z wpis\u00f3w formularzy grawitacyjnych\" ><\/a><\/p>\n<p>Przejd\u017amy teraz do kodu i tworzenia funkcji, kt\u00f3ra konwertuje zg\u0142oszenia na zawarto\u015b\u0107 niestandardow\u0105.<\/p>\n<h2>Dodanie metaboxa w szczeg\u00f3\u0142ach wpisu<\/h2>\n<p>Pierwszym krokiem jest dodanie pewnego rodzaju wyzwalacza akcji, aby utworzy\u0107 nasz\u0105 niestandardow\u0105 tre\u015b\u0107. Naturalnym miejscem jest ekran szczeg\u00f3\u0142\u00f3w wpisu. Pozwala to u\u017cytkownikowi ko\u0144cowemu na przejrzenie przes\u0142anych warto\u015bci, a nast\u0119pnie podj\u0119cie decyzji, czy tworzy\u0107 z nich tre\u015bci. Gravity Forms umo\u017cliwia programistom \u0142atwe tworzenie niestandardowych metaboks\u00f3w na tych ekranach.<\/p>\n<p>Aby utworzy\u0107 niestandardowy metabox do szczeg\u00f3\u0142\u00f3w wpisu mo\u017cemy u\u017cy\u0107 filtru <code>gform_entry_detail_meta_boxes<\/code>. Jest to filtr, kt\u00f3ry zwraca tablic\u0119 wszystkich metaboks\u00f3w do wy\u015bwietlenia w szczeg\u00f3\u0142ach wpisu. Po prostu dodajemy nowy element tablicy, aby utworzy\u0107 nowy metabox i definiujemy funkcj\u0119 zwrotn\u0105, kt\u00f3ra renderuje jego zawarto\u015b\u0107. Ustawiamy \u0142adny opisowy tytu\u0142 w &#8217; <code>title<\/code>&#8217; i okre\u015blamy jego pozycj\u0119 tak, aby pojawia\u0142a si\u0119 w &#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>A potem musimy zdefiniowa\u0107 funkcj\u0119 zwrotn\u0105: <code>awp_gf_create_user_metabox_render()<\/code>w naszym kodzie. Ta funkcja odpowiada za renderowanie zawarto\u015bci metaboksu. Jako parametr tej funkcji otrzymujemy tablic\u0119 argument\u00f3w, w kt\u00f3rej mo\u017cemy pobra\u0107 obiekt formularza i wpisu;<\/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>Wszystko, co musimy zrobi\u0107 w tej funkcji, to zbudowa\u0107 troch\u0119 kodu HTML i wy\u015bwietli\u0107 go.<\/p>\n<p>Je\u015bli chodzi o dodanie przycisku uruchamiaj\u0105cego akcj\u0119, zastosujemy t\u0119 sam\u0105 metod\u0119, jak robi to samo Gravity Forms. Istnieje element formularza otaczaj\u0105cy ca\u0142y ekran szczeg\u00f3\u0142\u00f3w wpisu, a wszystko, co musimy zrobi\u0107, to doda\u0107 zdarzenie onclick do przycisku przesy\u0142ania, kt\u00f3re zmieni w\u0142a\u015bciwo\u015b\u0107 \u201e <code>action<\/code>&quot;. Definiujemy w\u0142asn\u0105 niestandardow\u0105 nazw\u0119 akcji, dzi\u0119ki czemu wiemy, kiedy zosta\u0142a uruchomiona \u2013 i nie koliduje z akcjami Gravity Forms.<\/p>\n<p>Wywo\u0142ajmy nasz\u0105 akcj\u0119 niestandardow\u0105 \u201e <code>awp_gf_create_user<\/code>&#8221; i wyrenderujmy przycisk przesy\u0142ania ze zdarzeniem onclick, jak na przyk\u0142ad:<\/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>Z powy\u017cszym kodem dostaniemy nowy metabox z boku na ekranie szczeg\u00f3\u0142\u00f3w wpisu, wygl\u0105daj\u0105cy tak:<\/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=\"Programowe tworzenie tre\u015bci z wpis\u00f3w formularzy grawitacyjnych\" ><\/a><\/p>\n<p>W tej chwili nic si\u0119 nie dzieje po klikni\u0119ciu przycisku. To dlatego, \u017ce nie napisali\u015bmy jeszcze \u017cadnego kodu, aby go s\u0142ucha\u0107.<\/p>\n<h2>Pobieranie warto\u015bci z wpisu<\/h2>\n<p>Jak wspomniano wcze\u015bniej, wszystkie przes\u0142ane warto\u015bci w tablicy wpis\u00f3w s\u0105 identyfikowane przez ich identyfikatory p\u00f3l.<\/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=\"Programowe tworzenie tre\u015bci z wpis\u00f3w formularzy grawitacyjnych\" ><\/a><\/p>\n<p>Na obrazku powy\u017cej pole ID 1 to imi\u0119, ID 2 to nazwisko i tak dalej. Ale poczekaj \u2013 co si\u0119 dzieje z 5.1, 5.3 i tak dalej? W Gravity Forms otrzymujemy &quot;sub-ID&quot; dla specjalnego pola, kt\u00f3re akceptuje wiele warto\u015bci. Do mojego formularza doda\u0142em pole adresu, kt\u00f3re jest jednym polem, ale wieloma danymi wej\u015bciowymi. Ka\u017cde wej\u015bcie w tym polu otrzymuje w\u0142asne identyfikatory, do\u0142\u0105czone do g\u0142\u00f3wnego ID i kropka.Je\u015bli nie u\u017cywasz \u017cadnego z tych p\u00f3l z wieloma danymi wej\u015bciowymi, \u015bwietnie!Kod staje si\u0119 naprawd\u0119 prosty.Ale doda\u0142em to specjalne pole, aby\u015bmy mogli zobaczy\u0107, jak uzyska\u0107 do niego dost\u0119p.<\/p>\n<p>W tej chwili naszym problemem jest to, \u017ce kod nie wie, do czego s\u0142u\u017cy pole o identyfikatorze 1, 2 lub 3. Ta informacja znajduje si\u0119 w tablicy formularzy, a dok\u0142adniej w <code>$form['fields']<\/code>elemencie. Ten element zawiera wszystkie pola w formularzu i mamy pe\u0142ny dost\u0119p do ka\u017cdego obiektu pola. To tutaj mo\u017cemy znale\u017a\u0107 wybran\u0105 przez nas metod\u0119 identyfikacji; w moim przyk\u0142adzie <code>cssClass<\/code>.<\/p>\n<p>Mo\u017cemy po prostu zap\u0119tli\u0107 te pola i poszuka\u0107 identyfikator\u00f3w, kt\u00f3re chcemy wyodr\u0119bni\u0107. Umieszcz\u0119 wszystkie moje identyfikatory w tablicy i mo\u017cemy po prostu sprawdzi\u0107, czy pole w p\u0119tli jest jednym z nich.<\/p>\n<p>Ale najpierw musimy wiedzie\u0107, \u017ce przycisk zosta\u0142 klikni\u0119ty. To ca\u0142kiem proste; mo\u017cemy po prostu sprawdzi\u0107, czy nasza niestandardowa akcja znajduje si\u0119 w <code>$_POST<\/code>tablicy. Ale poniewa\u017c pracujemy z Gravity Forms, mo\u017cemy u\u017cy\u0107 <code>[rgpost](https:\/\/docs.gravityforms.com\/rgpost\/)()<\/code>. Funkcja Gravity Forms <code>rgpost()<\/code>po prostu zwraca warto\u015b\u0107 \u017c\u0105dania POST. Sprawdzanie <code>rgpost('awp_gf_create_user')<\/code>i <code>$_POST['awp_gf_create_user']<\/code>jest dok\u0142adnie takie samo. Ale u\u017cyjemy funkcji 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>W linii <code>#8<\/code>definiujemy tablic\u0119 ze wszystkimi niestandardowymi identyfikatorami, kt\u00f3re chcemy wyszuka\u0107. To s\u0105 wszystkie warto\u015bci, kt\u00f3re wprowadzi\u0142em jako klas\u0119 CSS w moim formularzu. Nast\u0119pnie w p\u0119tli dla ka\u017cdego pola sprawdzamy, czy pole jest jednym z tych identyfikator\u00f3w. W moim przyk\u0142adzie u\u017cywam klasy CSS do identyfikacji p\u00f3l, ale zalecam u\u017cywanie niestandardowych danych wej\u015bciowych. Ten kod r\u00f3wnie\u017c nie zadzia\u0142a, je\u015bli podano wiele klas CSS.<\/p>\n<p>Nast\u0119pnie w wierszu <code>#12<\/code>dodajemy nowy element do naszej ko\u0144cowej tablicy warto\u015bci z identyfikatorem jako kluczem. Nast\u0119pnie u\u017cywamy identyfikatora pola i odwo\u0142ujemy si\u0119 do tablicy wej\u015bciowej. Na ko\u0144cu tej p\u0119tli <code>$values<\/code>nale\u017cy wype\u0142ni\u0107 wszelkie przes\u0142ane warto\u015bci, kt\u00f3re s\u0105 istotne. Wszelkie pola, kt\u00f3re pozosta\u0142y puste lub nie zosta\u0142y uwzgl\u0119dnione w tablicy identyfikator\u00f3w, zostan\u0105 wykluczone.<\/p>\n<p>Je\u015bli doda\u0142e\u015b specjalne pole wielokrotnego wprowadzania, b\u0119dziesz musia\u0142 doda\u0107 dodatkowy kod, aby prawid\u0142owo odwo\u0142ywa\u0107 si\u0119 do identyfikator\u00f3w podrz\u0119dnych. Wiem, \u017ce <code>awp_address<\/code>jest to typ pola Adres. Typy p\u00f3l adresowych w Gravity Forms s\u0105 zgodne ze sta\u0142ym wzorem identyfikator\u00f3w podrz\u0119dnych, a ja w\u0142\u0105czy\u0142em tylko trzy z mo\u017cliwych danych wej\u015bciowych (adres ulicy 1 ma identyfikator podrz\u0119dny 1, kod pocztowy ma identyfikator podrz\u0119dny 3, a miasto ma identyfikator podrz\u0119dny 5). Aby obs\u0142u\u017cy\u0107 tego rodzaju pola, musimy zrobi\u0107 co\u015b takiego:<\/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>W wierszu <code>#4<\/code>\u0142\u0105cz\u0119 wszystkie warto\u015bci, tak aby ko\u0144cowy ci\u0105g by\u0142 standardowym jednowierszowym formatem adresu (\u201e,&#8221;).<\/p>\n<p>Mamy teraz wszystkie niezb\u0119dne warto\u015bci \u0142adnie posortowane wed\u0142ug kluczy identyfikator\u00f3w w tablicy <code>$values<\/code>. To, co z tym zrobisz, zale\u017cy wy\u0142\u0105cznie od Ciebie i potrzeb Twojego projektu. Ale podam przyk\u0142ad tworzenia u\u017cytkownika w WordPressie.<\/p>\n<h2>Tworzenie nowego u\u017cytkownika z wys\u0142ania zg\u0142oszenia<\/h2>\n<p>Aby m\u00f3j kod by\u0142 czysty, wywo\u0142am osobn\u0105 funkcj\u0119 odpowiedzialn\u0105 za utworzenie nowego u\u017cytkownika. Wszystko czego potrzebuj\u0119 to przekaza\u0107 tablic\u0119 warto\u015bci. Chc\u0119, aby ta funkcja zwraca\u0142a jakie\u015b wskazanie wyniku tej akcji. W ten spos\u00f3b mog\u0119 utworzy\u0107 wiadomo\u015b\u0107 niezale\u017cnie od tego, czy u\u017cytkownik zosta\u0142 pomy\u015blnie utworzony, czy te\u017c u\u017cytkownik z podanym adresem e-mail ju\u017c istnieje.<\/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>Nast\u0119pnie po prostu definiujemy <code>awp_gf_create_user()<\/code>funkcj\u0119. Podam prosty przyk\u0142ad tworzenia u\u017cytkownika programowo w WordPressie. Jest to po prostu przyk\u0142ad pokazuj\u0105cy, jak u\u017cywa\u0107 wyodr\u0119bnionych warto\u015bci.<\/p>\n<p>Najpierw sprawdzamy, czy u\u017cytkownik o podanym adresie e-mail istnieje z <code>[get_user_by](https:\/\/developer.wordpress.org\/reference\/functions\/get_user_by\/)()<\/code>. Je\u015bli nie, u\u017cywamy <code>[wp_insert_user](https:\/\/developer.wordpress.org\/reference\/functions\/wp_insert_user\/)()<\/code>do dodania u\u017cytkownika. Poda\u0142em r\u00f3wnie\u017c przyk\u0142ad przechowywania niestandardowej meta u\u017cytkownika (nasze pole adresowe). Wreszcie nasza metoda powinna zwr\u00f3ci\u0107 wynik utworzenia u\u017cytkownika. Je\u015bli u\u017cytkownik ju\u017c istnia\u0142, zwracamy -1. W przeciwnym razie zwracamy identyfikator u\u017cytkownika.<\/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>Po powrocie do renderowania metaboksu mo\u017cemy teraz warunkowo doda\u0107 wiadomo\u015b\u0107 do u\u017cytkownika ko\u0144cowego na podstawie wyniku tego. To jest prosty przyk\u0142ad; je\u015bli zwr\u00f3cona warto\u015b\u0107 wynosi\u0142a -1, u\u017cytkownik z podanym adresem e-mail ju\u017c istnieje. A je\u015bli zwr\u00f3cona warto\u015b\u0107 by\u0142a wi\u0119ksza ni\u017c 0, wiemy, \u017ce pomy\u015blnie utworzy\u0142 u\u017cytkownika. W ten spos\u00f3b wy\u015bwietlamy komunikat informuj\u0105cy, \u017ce tworzenie u\u017cytkownika zako\u0144czy\u0142o si\u0119 pomy\u015blnie.<\/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>Unikanie duplikat\u00f3w tre\u015bci<\/h2>\n<p>Powy\u017cszy prosty przyk\u0142ad dziedziczy wy\u0142\u0105cza tworzenie wielu u\u017cytkownik\u00f3w z tego samego wpisu, poniewa\u017c sprawdza, czy u\u017cytkownik z podanym adresem e-mail ju\u017c istnieje. Ale w innych przypadkach mo\u017cesz nie mie\u0107 takiej mo\u017cliwo\u015bci. Tak wi\u0119c inn\u0105 strategi\u0105, aby unikn\u0105\u0107 tworzenia duplikat\u00f3w tre\u015bci przez u\u017cytkownik\u00f3w ko\u0144cowych z tego samego wpisu, jest dodanie niestandardowej meta wpisu. Innymi s\u0142owy; je\u015bli akcja si\u0119 powiod\u0142a, dodamy niestandardow\u0105 meta do tego wpisu. A potem po prostu sprawdzamy, czy ta niestandardowa meta istnieje, zanim rozpoczniemy akcj\u0119.<\/p>\n<p>Gravity Forms oferuje metody dodawania niestandardowych meta do wpis\u00f3w; <code>[gform_add_meta](https:\/\/docs.gravityforms.com\/gform_add_meta\/)()<\/code>a tak\u017ce pobieranie warto\u015bci: <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>W linii <code>#4<\/code>pobieramy nasz\u0105 niestandardow\u0105 meta wpisu. Je\u015bli istnia\u0142 (nie pusty), ustawiamy komunikat informuj\u0105cy u\u017cytkownika ko\u0144cowego, \u017ce pr\u00f3bowa\u0142 ju\u017c wcze\u015bniej tworzy\u0107 tre\u015b\u0107 z tego wpisu. Je\u015bli niestandardowa meta nie istnia\u0142a, kontynuujemy tworzenie naszej zawarto\u015bci. Po pomy\u015blnym utworzeniu tre\u015bci musimy doda\u0107 niestandardow\u0105 meta do wpisu (linia <code>#10<\/code>).<\/p>\n<h2>Wniosek i kod ko\u0144cowy<\/h2>\n<p>W tym po\u015bcie pr\u00f3bowa\u0142em poda\u0107 przyk\u0142ad tworzenia tre\u015bci z wpisu w Gravity Forms. Przyk\u0142ady kodu maj\u0105 na celu da\u0107 ci pomys\u0142, jak dostosowa\u0107 i zmieni\u0107 go, aby pasowa\u0142 do potrzeb twojego projektu. Zdecydowanie polecam rozszerzenie tej funkcjonalno\u015bci, aby lepiej radzi\u0107 sobie z komunikatami o b\u0142\u0119dach. Mo\u017cesz r\u00f3wnie\u017c doda\u0107 to metabox tylko dla okre\u015blonych formularzy. Ale to powinna by\u0107 dobra baza do budowania.<\/p>\n<p>A oto ostateczny kod:<\/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\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ten post poprowadzi Ci\u0119, jak tworzy\u0107 wszelkiego rodzaju tre\u015bci (u\u017cytkownicy, posty lub co\u015b innego niestandardowego) na podstawie wpis\u00f3w w formularzu 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":[897,919,897,919,1110,815,845,845,866,866,815],"tags":[1169],"class_list":["post-233976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-inny","category-n-a","category-wtyczki","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=233976"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/151471"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}