{"id":233647,"date":"2023-02-18T20:14:00","date_gmt":"2023-02-18T17:14:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233647"},"modified":"2023-02-23T17:28:31","modified_gmt":"2023-02-23T14:28:31","slug":"jak-stworzyc-formularz-front-endowy-za-pomoca-acf","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/jak-stworzyc-formularz-front-endowy-za-pomoca-acf\/","title":{"rendered":"Jak stworzy\u0107 formularz front-endowy za pomoc\u0105 ACF"},"content":{"rendered":"\n<p>W tym samouczku poka\u017c\u0119 Ci, jak utworzy\u0107 formularz front-endowy za pomoc\u0105 Advanced Custom Fields (ACF). Om\u00f3wi\u0119 szczeg\u00f3\u0142owo, jak to dzia\u0142a i jak mo\u017cna go dostosowa\u0107 do w\u0142asnych potrzeb.<\/p>\n<p><a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) to darmowa wtyczka, kt\u00f3ra pomaga dodawa\u0107 ustawienia p\u00f3l wielu typ\u00f3w do prawie ka\u017cdego rodzaju tre\u015bci w WordPress. Mo\u017cesz dodawa\u0107 pola do post\u00f3w, taksonomii, menu, wid\u017cet\u00f3w, u\u017cytkownik\u00f3w, a nawet niestandardowych stron administracyjnych. Jego g\u0142\u00f3wnym zastosowaniem jest administrator, ale mo\u017cna go r\u00f3wnie\u017c u\u017cywa\u0107 do generowania p\u00f3l w interfejsie u\u017cytkownika.<\/p>\n<p>Istnieje wiele aplikacji do dodawania p\u00f3l ACF do interfejsu u\u017cytkownika; mo\u017cesz doda\u0107 formularz, aby tworzy\u0107 i aktualizowa\u0107 posty, kategorie lub u\u017cytkownik\u00f3w. Za pomoc\u0105 niekt\u00f3rych kod\u00f3w mo\u017cesz nawet utworzy\u0107 og\u00f3lny formularz kontaktowy, w kt\u00f3rym odpowiedzi s\u0105 zapisywane jako posty niestandardowego typu, a kod wyzwala powiadomienia e-mail w odpowiedziach na formularze. Tak jak zwyk\u0142y formularz kontaktowy. Cz\u0119stym zastosowaniem jest korzystanie z funkcji formularzy frontonu ACF do tworzenia formularzy i umo\u017cliwiania odwiedzaj\u0105cym tworzenia lub edytowania zawarto\u015bci witryny bez logowania. Ale u\u017cywaj tego ostro\u017cnie. To \u0142atwo otwiera si\u0119 na spam i nadu\u017cycia, a w najgorszym przypadku odwiedzaj\u0105cy mog\u0105 zniszczy\u0107 zawarto\u015b\u0107 lub ustawienia Twojej witryny. Powiniene\u015b przynajmniej wymaga\u0107 od odwiedzaj\u0105cych, aby logowali si\u0119 z wa\u017cnymi u\u017cytkownikami, aby uzyska\u0107 dost\u0119p do formularzy, kt\u00f3re mog\u0105 zmienia\u0107 krytyczne tre\u015bci WordPress (profil u\u017cytkownika, posty itp.).<\/p>\n<h2>Co zrobimy<\/h2>\n<p>Zak\u0142adam, \u017ce witryna WordPress zdefiniowa\u0142a zestaw dodatkowych p\u00f3l dla u\u017cytkownik\u00f3w o niestandardowej roli (&#8217; <code>member<\/code>&#8217;) przy u\u017cyciu ACF. Ci u\u017cytkownicy nie maj\u0105 w og\u00f3le dost\u0119pu administracyjnego, ale chcemy zaoferowa\u0107 im mo\u017cliwo\u015b\u0107 edytowania w\u0142asnych p\u00f3l w ich profilu. Rozwi\u0105zaniem, na kt\u00f3re si\u0119 zdecydowa\u0142em, jest stworzenie niestandardowego szablonu strony do aktualizacji ich profilu, pokazuj\u0105cego formularz tylko wtedy, gdy s\u0105 zalogowani i maj\u0105 odpowiedni\u0105 rol\u0119.<\/p>\n<p>W tym samouczku jest to do\u015b\u0107 proste, wi\u0119c nie b\u0119d\u0119 zawiera\u0142 przyk\u0142adu dodawania standardowych p\u00f3l profilu u\u017cytkownika w WordPress (e-mail, has\u0142o itp.). To troch\u0119 wykracza poza zakres tego samouczka. Zezwalam tylko na edycj\u0119 p\u00f3l ACF na tej stronie edycji profilu.<\/p>\n<p>W ACF stworzy\u0142em grup\u0119 p\u00f3l z zestawem ustawie\u0144 dla u\u017cytkownik\u00f3w cz\u0142onkowskich:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152752-61e4fa3424bfa.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-152752-61e4fa3424bfa.png\" alt=\"Jak stworzy\u0107 formularz front-endowy za pomoc\u0105 ACF\"><\/a><\/p>\n<p>W moim motywie mam niestandardowy szablon strony, kt\u00f3ry obecnie wygl\u0105da tak \u2013 w tej chwili jest to zwyk\u0142y, standardowy szablon pojedynczej strony;<\/p>\n<pre><code>&lt;?php \n\/* Template Name: ACF Profile Page *\/\nget_header(); ?&gt;\n&lt;main class=\"content\"&gt;\n    &lt;?php if (have_posts()) { \n        while (have_posts()): the_post(); ?&gt;\n        &lt;article id=\"post-&lt;?php the_ID() ?&gt;\" &lt;?php post_class(); ?&gt;&gt;\n            &lt;h2 class=\"page-title\"&gt;&lt;?php the_title(); ?&gt;&lt;\/h2&gt;\n            &lt;?php the_content(''); ?&gt;\n            &lt;?php \n            if (is_user_logged_in() &amp;&amp; current_user_can('member')) {\n                \/\/ Profile settings here\n            }\n            ?&gt;\n        &lt;\/article&gt;\n    &lt;?php endwhile;\n    } ?&gt;\n&lt;\/main&gt;\n&lt;?php \nget_sidebar();\nget_footer();<\/code><\/pre>\n<p>W linii <code>#11<\/code>sprawdzamy, czy aktualny u\u017cytkownik jest zalogowany i ma niestandardow\u0105 rol\u0119 <code>member<\/code>. Zmie\u0144 rol\u0119 lub regu\u0142\u0119 minimaln\u0105 na dowoln\u0105, na kt\u00f3r\u0105 chcesz zezwoli\u0107 w tym formularzu frontonu. Pami\u0119taj tylko, \u017ce nawet najni\u017csza rola w WordPressie <code>subscriber<\/code>, ma dost\u0119p do edycji swojego profilu w panelu administracyjnym.<\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, chcemy doda\u0107 te pola na ka\u017cdym cz\u0142onku do tej niestandardowej strony frontonu:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152752-61e4fa37478d8.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-152752-61e4fa37478d8.png\" alt=\"Jak stworzy\u0107 formularz front-endowy za pomoc\u0105 ACF\"><\/a><\/p>\n<h2>Jak dzia\u0142aj\u0105 formularze front-end ACF<\/h2>\n<p>Musisz doda\u0107 dwa wywo\u0142ania funkcji w szablonie, kt\u00f3ry ma by\u0107 formularzem frontonu; <code>[acf_form_head](https:\/\/www.advancedcustomfields.com\/resources\/acf_form_head\/)()<\/code>i <code>[acf_form](https:\/\/www.advancedcustomfields.com\/resources\/acf_form\/)()<\/code>.<\/p>\n<p>Funkcja <code>acf_form_head()<\/code>musi by\u0107 umieszczona na samej g\u00f3rze szablonu, przed jakimkolwiek wyj\u015bciem. Zwykle w szablonie oznacza to przed <code>[get_header](https:\/\/developer.wordpress.org\/reference\/functions\/get_header\/)()<\/code>. Wywo\u0142anie funkcji zapewnia dodanie wszystkich skrypt\u00f3w i styl\u00f3w, aby pola ACF by\u0142y renderowane poprawnie, a tak\u017ce wszystkie funkcje przetwarzania, walidacji i przesy\u0142ania pracy. Do tej funkcji nie musimy dodawa\u0107 \u017cadnych parametr\u00f3w.<\/p>\n<p>Funkcja <code>acf_form()<\/code>jest t\u0105, kt\u00f3ra renderuje formularz frontonu i powinna by\u0107 umieszczona w miejscu, w kt\u00f3rym ma si\u0119 pojawi\u0107 formularz. Akceptuje szereg ustawie\u0144. Musimy co najmniej informowa\u0107 o tym, kt\u00f3re pola lub grupy pokaza\u0107 i gdzie je zapisa\u0107.<\/p>\n<p>Je\u015bli chodzi o decydowanie, kt\u00f3re pola maj\u0105 by\u0107 wy\u015bwietlane, zwykle podajesz grup\u0119 p\u00f3l (w\u0142a\u015bciwo\u015b\u0107 <code>field_groups<\/code>). Ale <code>acf_form()<\/code>funkcja obs\u0142uguje r\u00f3wnie\u017c dostarczanie okre\u015blonych pojedynczych p\u00f3l (w\u0142a\u015bciwo\u015b\u0107 <code>fields<\/code>). Mo\u017cesz r\u00f3wnie\u017c poda\u0107 wiele p\u00f3l lub grup p\u00f3l, aby po\u0142\u0105czy\u0107 je w ten sam formularz. Z tego powodu <code>field_groups<\/code>oczekuje tablicy. Wi\u0119c nawet je\u015bli chcesz pokaza\u0107 tylko jedn\u0105 grup\u0119 p\u00f3l, musisz poda\u0107 ten identyfikator lub informacj\u0119 o pracy w tablicy.<\/p>\n<p>Drug\u0105 wymagan\u0105 w\u0142a\u015bciwo\u015bci\u0105, kt\u00f3r\u0105 musisz poda\u0107 w formularzu <code>acf_form()<\/code>, jest miejsce, z kt\u00f3rego dane maj\u0105 zosta\u0107 za\u0142adowane i gdzie powinny zosta\u0107 zapisane, we w\u0142a\u015bciwo\u015bci <code>post_id<\/code>. Nie daj si\u0119 zwie\u015b\u0107 nazwie \u201epost&quot;. Zasady dla <code>post_id<\/code>s\u0105 takie same, gdy u\u017cywasz <code>get_field()<\/code>, je\u015bli znasz wcze\u015bniej prac\u0119 z ACF. Je\u015bli pola dotycz\u0105 wpisu (post, strona, post niestandardowy), wystarczy poda\u0107 tutaj identyfikator. Ale je\u015bli chcesz \u0142adowa\u0107 i aktualizowa\u0107 dane u\u017cytkownik\u00f3w, u\u017cyj tego formatu: <code>user_{user ID}<\/code>. Podobnie z polami dla kategorii: <code>category_{category ID}<\/code>. Sprawd\u017a wszystkie zasady pod nag\u0142\u00f3wkiem \u201eUzyskaj warto\u015b\u0107 z r\u00f3\u017cnych obiekt\u00f3w&#8221; w <a href=\"https:\/\/www.advancedcustomfields.com\/resources\/get_field\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacji ACF dotycz\u0105cej<code>get_field()<\/code><\/a>.<\/p>\n<h2>Dodanie formularza front-end ACF do naszego szablonu<\/h2>\n<p>Najpierw dodajemy <code>acf_form_head()<\/code>na samej g\u00f3rze, tu\u017c przed <code>get_header()<\/code>\u2013 ale za deklaracj\u0105 szablonu strony (linia <code>#3<\/code>). Nast\u0119pnie w miejscu, w kt\u00f3rym chcemy wyrenderowa\u0107 formularz dodajemy <code>acf_form()<\/code>dwie w\u0142a\u015bciwo\u015bci.<\/p>\n<p>Musimy znale\u017a\u0107 nasz identyfikator grupy terenowej. Je\u015bli doda\u0142e\u015b grup\u0119 p\u00f3l wed\u0142ug kodu (mam <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/kompletna-instrukcja-dodawania-grup-i-pol-zaawansowanych-niestandardowych-pol-wedlug-kodu\/\" title=\"post szczeg\u00f3\u0142owo o tym, jak doda\u0107 pola ACF wed\u0142ug kodu\">post szczeg\u00f3\u0142owo o tym, jak doda\u0107 pola ACF wed\u0142ug kodu<\/a> ), masz ju\u017c slug grupy p\u00f3l. Nast\u0119pnie nale\u017cy poda\u0107 informacj\u0119 o pracy do <code>field_groups<\/code>w\u0142a\u015bciwo\u015bci w postaci tablicy. Je\u015bli doda\u0142e\u015b grup\u0119 p\u00f3l w panelu administracyjnym, musisz otworzy\u0107 grup\u0119 w przegl\u0105darce i sprawdzi\u0107 adres URL. Interesuje nas identyfikator, kt\u00f3ry pojawia si\u0119 po \u201e <code>?post=<\/code>&#8222;:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152752-61e4fa3a1621b.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-152752-61e4fa3a1621b.png\" alt=\"Jak stworzy\u0107 formularz front-endowy za pomoc\u0105 ACF\"><\/a><\/p>\n<p>W moim przyk\u0142adzie identyfikator to <code>1145<\/code>. To w\u0142a\u015bnie dostarczam w tablicy <code>field_groups<\/code>.<\/p>\n<p>PS: Nie polecam zakodowania identyfikatora na sztywno, poniewa\u017c ten identyfikator b\u0119dzie inny w ka\u017cdej instancji WordPressa! Je\u015bli pracujesz na lokalnej instalacji, a tak\u017ce na serwerze pomostowym i produkcyjnym, zdecydowanie polecam zamiast tego dodanie p\u00f3l wed\u0142ug kodu. W ten spos\u00f3b mo\u017cesz zdefiniowa\u0107 nazw\u0119 grupy p\u00f3l, kt\u00f3ra b\u0119dzie dzia\u0142a\u0107 wsz\u0119dzie.<\/p>\n<p>Je\u015bli chodzi o <code>post_id<\/code>nieruchomo\u015b\u0107, to mog\u0119 uzyska\u0107 aktualny identyfikator u\u017cytkownika za pomoc\u0105 funkcji WordPress <code>[get_current_user_id](https:\/\/developer.wordpress.org\/reference\/functions\/get_current_user_id\/)()<\/code>. \u0141\u0105cz\u0119 ci\u0105g &#8217; <code>user_<\/code>&#8217; i zwrot tej funkcji jako <code>post_id<\/code>.<\/p>\n<pre><code>&lt;?php \n\/* Template Name: ACF Profile Page *\/\nacf_form_head();\nget_header(); ?&gt;\n&lt;main class=\"content\"&gt;\n    &lt;?php if (have_posts()) { \n        while (have_posts()): the_post(); ?&gt;\n        &lt;article id=\"post-&lt;?php the_ID() ?&gt;\" &lt;?php post_class(); ?&gt;&gt;\n            &lt;h2 class=\"page-title\"&gt;&lt;?php the_title(); ?&gt;&lt;\/h2&gt;\n            &lt;?php the_content(''); ?&gt;\n            &lt;?php \n            if (is_user_logged_in() &amp;&amp; current_user_can('member')) {\n                $current_user_id = get_current_user_id();\n                acf_form([\n                    'field_groups' =&gt; [1145],\n                    'post_id' =&gt; 'user_'. $current_user_id\n                ]);\n            }\n            ?&gt;\n        &lt;\/article&gt;\n    &lt;?php endwhile;\n    } ?&gt;\n&lt;\/main&gt;\n&lt;?php \nget_sidebar();\nget_footer();<\/code><\/pre>\n<p>I to w zasadzie to!<\/p>\n<p>Je\u015bli odwiedz\u0119 t\u0119 stron\u0119 b\u0119d\u0105c zalogowanym jako cz\u0142onek, otrzymam aktualne warto\u015bci dla tego u\u017cytkownika. Wszystkie typy p\u00f3l ACF dzia\u0142aj\u0105 i dobrze wygl\u0105daj\u0105. Mog\u0119 zaktualizowa\u0107 warto\u015bci za pomoc\u0105 formularza front-end i zobaczy\u0107, \u017ce s\u0105 one r\u00f3wnie\u017c aktualizowane w admin.<\/p>\n<h2>Dalsze dostosowywanie formularza<\/h2>\n<p>Mo\u017cemy dalej modyfikowa\u0107 ustawienia przekazywane do <code>acf_form()<\/code>. Zapoznaj si\u0119 <a href=\"https:\/\/www.advancedcustomfields.com\/resources\/acf_form\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z dokumentacj\u0105 ACF dotycz\u0105c\u0105 acf_form()<\/a>, aby zobaczy\u0107 wszystkie mo\u017cliwe ustawienia.<\/p>\n<p>W tej chwili nasz formularz profilu u\u017cytkownika wy\u015bwietla \u201eOpublikuj aktualizacj\u0119&#8221; po przes\u0142aniu ustawie\u0144. Nie ma to sensu w przypadku ustawie\u0144 profilu. Mo\u017cemy dostosowa\u0107 wiadomo\u015b\u0107 za pomoc\u0105 w\u0142a\u015bciwo\u015bci <code>updated_message<\/code>.<\/p>\n<pre><code>acf_form([\n    'field_groups' =&gt; [1145],\n    'post_id' =&gt; 'user_'. $current_user_id,\n    'updated_message' =&gt; __('User profile updated.', 'txtdomain')\n]);<\/code><\/pre>\n<p>Je\u015bli chcesz, mo\u017cesz zdefiniowa\u0107 inny adres URL do przekierowania po przes\u0142aniu formularza. Domy\u015blnie ta sama strona \u0142aduje si\u0119 ponownie z parametrem GET \u201e <code>?updated=true<\/code>&#8222;. Mo\u017cesz okre\u015bli\u0107 konkretny adres URL strony z podzi\u0119kowaniami lub, je\u015bli formularz dotyczy posta, mo\u017cesz przekierowa\u0107 go do wy\u015bwietlenia tego posta. Mo\u017cemy poda\u0107 adres URL we w\u0142a\u015bciwo\u015bci <code>return<\/code>.<\/p>\n<pre><code>acf_form([\n    'field_groups' =&gt; [1145],\n    'post_id' =&gt; 'user_'. $current_user_id,\n    'return' =&gt; home_url('thank-you')\n]);<\/code><\/pre>\n<p>Je\u015bli chcemy mie\u0107 inny tekst na przycisku przesy\u0142ania formularza, mo\u017cemy to okre\u015bli\u0107 we w\u0142a\u015bciwo\u015bci <code>submit_value<\/code>.<\/p>\n<pre><code>acf_form([\n    'field_groups' =&gt; [1145],\n    'post_id' =&gt; 'user_'. $current_user_id,\n    'submit_value' =&gt; __('Update profile', 'txtdomain')\n]);<\/code><\/pre>\n<p>Mo\u017cesz r\u00f3wnie\u017c powiedzie\u0107, <code>acf_form()<\/code>aby nie renderowa\u0107 <code>&lt;form&gt;<\/code>tagu. Je\u015bli chcesz po\u0142\u0105czy\u0107 formularz ACF z w\u0142asnym niestandardowym formularzem, mo\u017cesz ustawi\u0107 <code>form<\/code>i <code>false<\/code>wpisa\u0107 <code>&lt;form&gt;<\/code>i <code>&lt;input type=\"submit\"\/&gt;<\/code>r\u0119cznie. Je\u015bli to zrobisz, ACF nadal b\u0119dzie m\u00f3g\u0142 aktualizowa\u0107 warto\u015bci, ale musisz zadba\u0107 o aktualizacj\u0119 wszystkich innych p\u00f3l w formularzu niestandardowym.<\/p>\n<pre><code>&lt;form method=\"POST\"&gt;\n    &lt;input type=\"text\" name=\"my-custom-input\" value=\"\" \/&gt;\n    &lt;?php\n    acf_form([\n        'field_groups' =&gt; [1145],\n        'post_id' =&gt; 'user_'. $current_user_id,\n        'form' =&gt; false\n    ]);\n    ?&gt;\n    &lt;input type=\"submit\" value=\"&lt;?php _e('Submit', 'txtdomain'); ?&gt;\" \/&gt;\n&lt;\/form&gt;<\/code><\/pre>\n<h2>Wyzwalanie dzia\u0142a\u0144 po przes\u0142aniu formularza<\/h2>\n<p>Czasami mo\u017cesz chcie\u0107 wyzwoli\u0107 jak\u0105\u015b niestandardow\u0105 funkcj\u0119 lub zdarzenia, gdy formularz frontonu zostanie zaktualizowany. Typowym przyk\u0142adem jest napisanie funkcji, kt\u00f3ra wysy\u0142a powiadomienie e-mail po ka\u017cdym przes\u0142aniu formularza.<\/p>\n<p>Zaawansowane pola niestandardowe oferuj\u0105 dwa przydatne punkty zaczepienia, gdy pola s\u0105 aktualizowane; dzia\u0142anie <code>[acf\/save_post](https:\/\/www.advancedcustomfields.com\/resources\/acf-save_post\/)<\/code>i filtr <code>[acf\/pre_save_post](https:\/\/www.advancedcustomfields.com\/resources\/acf-pre_save_post\/)<\/code>. Ponownie, nie daj si\u0119 zwie\u015b\u0107 nazwie \u201epost&#8221;. S\u0105 one wyzwalane przy ka\u017cdej aktualizacji p\u00f3l ACF, w tym p\u00f3l u\u017cytkownika, kategorii, menu itd.<\/p>\n<p>Filtr <code>acf\/pre_save_post<\/code>jest uruchamiany <strong>tylko<\/strong> w formularzach frontonu przy u\u017cyciu <code>acf_form()<\/code>. Jako parametr tego filtra otrzymujemy <code>post_id<\/code>, tak\u0105 sam\u0105 warto\u015b\u0107, jak\u0105 przekazali\u015bmy powy\u017cej <code>post_id<\/code>. <code>acf_form()<\/code>Filtr oczekuje, \u017ce wr\u00f3cisz <code>post_id<\/code>. Pami\u0119taj, \u017ce musimy to przeanalizowa\u0107, je\u015bli nie mamy na my\u015bli identyfikatora poczty. Na przyk\u0142ad dla u\u017cytkownika musisz zrobi\u0107 co\u015b takiego:<\/p>\n<pre><code>add_filter('acf\/pre_save_post', function($post_id) {\n    if (strpos($post_id, 'user_') === false) {\n        return $post_id;\n    }\n\u00a0\n    $user_id = intval(substr($post_id, 5));  \/\/ Extracts the user ID\n\u00a0\n    \/\/ Do your thing. You'll find the submitted values in $_POST\n\u00a0\n    return $post_id;\n});<\/code><\/pre>\n<p>Alternatywnie mo\u017cesz u\u017cy\u0107 haka <code>acf\/save_post<\/code>&#8211; ale pami\u0119taj, \u017ce jest on r\u00f3wnie\u017c uruchamiany w adminie. Jako parametr tego haka otrzymasz <code>post_id<\/code>, tak samo jak <code>acf\/pre_save_post<\/code>. Wa\u017cn\u0105 rzecz\u0105 do zapami\u0119tania podczas u\u017cywania <code>acf\/save_post<\/code>jest to, \u017ce mo\u017cesz u\u017cy\u0107 priorytetu przechwycenia, aby kontrolowa\u0107, czy twoja funkcja jest uruchamiana przed zapisaniem p\u00f3l, czy po. Funkcja podpi\u0119ta o priorytecie 10 lub wy\u017cszym zostanie uruchomiona po zapisaniu p\u00f3l. Priorytet mniejszy ni\u017c 10 zostanie uruchomiony przed zapisaniem warto\u015bci przez ACF.<\/p>\n<pre><code>add_action('acf\/save_post', function($post_id) {\n    \/\/ You can fetch the values with standard get_field()\n});\n\u00a0\nadd_action('acf\/save_post', function($post_id) {\n    \/\/ You can access the submitted values in $_POST\n}, 8);<\/code><\/pre>\n<p>Po zaczepieniu funkcji przed zapisem (priorytet mniejszy ni\u017c 10) mo\u017cesz por\u00f3wna\u0107 przes\u0142ane warto\u015bci z tym, co ACF zapisze. Mo\u017cesz zrobi\u0107, <code>get_field()<\/code>aby uzyska\u0107 aktualn\u0105 warto\u015b\u0107 i por\u00f3wna\u0107 je z odpowiedni\u0105 warto\u015bci\u0105 w <code>$_POST<\/code>.<\/p>\n<p>Je\u015bli chcesz co\u015b zrobi\u0107 tylko wtedy, gdy pola zosta\u0142y zaktualizowane we front-endzie, mo\u017cesz po prostu sprawdzi\u0107, czy jeste\u015bmy w admin z <code>[is_admin](https:\/\/developer.wordpress.org\/reference\/functions\/is_admin\/)()<\/code>. Poni\u017cej znajduje si\u0119 przyk\u0142ad konfiguracji powiadomie\u0144 e-mail, gdy u\u017cytkownik aktualizuje swoje ustawienia w interfejsie u\u017cytkownika;<\/p>\n<pre><code>add_action('acf\/save_post', function($post_id) {\n    if (strpos($post_id, 'user_') === false) {\n        return $post_id;\n    }\n\u00a0\n    if (is_admin()) {\n        return;  \/\/ Bail if we are updating in admin\n    }\n\u00a0\n    $user_id = intval(substr($post_id, 5));\n\u00a0\n    \/\/ Use get_field() to get the saved\/submitted values if needed\n    \/\/ Then use wp_mail() to send an email\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>Jak utworzy\u0107 formularz frontonu za pomoc\u0105 zaawansowanych p\u00f3l niestandardowych (ACF). Om\u00f3wi\u0119 szczeg\u00f3\u0142owo, jak to dzia\u0142a i jak mo\u017cna go dostosowa\u0107 do w\u0142asnych potrzeb.<\/p>\n","protected":false},"author":1,"featured_media":224889,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,721,1110,815,836,836,845,845,866,866,815],"tags":[1169],"class_list":["post-233647","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-n-a","category-wtyczki","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233647","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=233647"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233647\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224889"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}