{"id":233470,"date":"2023-02-15T16:49:00","date_gmt":"2023-02-15T13:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233470"},"modified":"2022-11-10T23:52:27","modified_gmt":"2022-11-10T20:52:27","slug":"utworz-niestandardowy-blok-gutenberga-czesc-8-obsluga-tlumaczen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/utworz-niestandardowy-blok-gutenberga-czesc-8-obsluga-tlumaczen\/","title":{"rendered":"Utw\u00f3rz niestandardowy blok Gutenberga &#8211; Cz\u0119\u015b\u0107 8: Obs\u0142uga t\u0142umacze\u0144"},"content":{"rendered":"\n<p>W tej cz\u0119\u015bci skupimy si\u0119 na t\u0142umaczeniu tekst\u00f3w i warto\u015bci w naszym niestandardowym bloku Gutenberga. U\u017cywamy WP-CLI do generowania niezb\u0119dnych plik\u00f3w, aby Gutenberg m\u00f3g\u0142 za\u0142adowa\u0107 nasze t\u0142umaczenia przy zmianie j\u0119zyka WordPress.<\/p>\n<p>Zanim to zrobisz, musisz mie\u0107 zainstalowany <a href=\"https:\/\/wp-cli.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP CLI<\/a> (interfejs wiersza polece\u0144 dla WordPress). Je\u015bli go nie masz, po prostu post\u0119puj zgodnie z <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/installing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przewodnikiem w Podr\u0119czniku WordPress dla CLI<\/a>.<\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, jak t\u0142umaczy\u0107 skrypty JavaScript (Gutenberg): WordPress wymaga <code>.mo<\/code>plik\u00f3w do t\u0142umaczenia plik\u00f3w PHP, ale dla JavaScript WordPress wymaga <code>.json<\/code>pliku. Ka\u017cdy plik JavaScript wymaga jednego pliku JSON do t\u0142umaczenia. JSON powinien mie\u0107 okre\u015blony format (WP CLI wygeneruje go dla nas) z naszymi przet\u0142umaczonymi ci\u0105gami. Potrzebujemy jednego pliku JSON na j\u0119zyk, na kt\u00f3ry chcemy t\u0142umaczy\u0107.<\/p>\n<p>Musimy wi\u0119c najpierw doda\u0107 funkcje gettext (<code>__()<\/code>, <code>_e()<\/code>itp.) do naszych plik\u00f3w JavaScript i jak zwykle wygenerowa\u0107 plik PO dla naszego motywu lub wtyczki. Poniewa\u017c opakowali\u015bmy teksty w naszych plikach skryptowych np <code>__()<\/code>., plik PO powinien by\u0107 w stanie je zawiera\u0107. Nast\u0119pnie wykonujemy t\u0142umaczenie jak zwykle w naszym pliku PO. A potem w ko\u0144cu u\u017cywamy WP CLI, aby wyodr\u0119bni\u0107 niezb\u0119dne ci\u0105gi z pliku PO i wygenerowa\u0107 pliki JSON dla wszystkich naszych plik\u00f3w JavaScript.<\/p>\n<p>Pami\u0119taj, \u017ce Tw\u00f3j motyw lub pliki <code>.po<\/code>\/ <code>.mo<\/code>-wtyczki nigdy nie b\u0119d\u0105 mia\u0142y wp\u0142ywu na Twoje pliki JavaScript \u2013 nawet je\u015bli zawieraj\u0105 one przet\u0142umaczone ci\u0105gi z naszych plik\u00f3w JavaScript.<\/p>\n<h2>Implementacja t\u0142umaczenia w JavaScript<\/h2>\n<p>Pierwszym krokiem jest umieszczenie wszystkich tekst\u00f3w w naszym pliku JavaScript wewn\u0105trz funkcji t\u0142umaczenia. Je\u015bli zajmowa\u0142e\u015b si\u0119 t\u0142umaczeniem WordPressa w PHP, prawdopodobnie dobrze znasz funkcje <code>__()<\/code>, <code>_e()<\/code>i <code>esc_html__()<\/code>tak dalej. WordPress posiada pakiet <code>wp.i18n<\/code>zawieraj\u0105cy te funkcje, kt\u00f3re dzia\u0142aj\u0105 dok\u0142adnie tak, jak w PHP.<\/p>\n<p>Podobnie jak w przypadku PHP, musisz poda\u0107 domen\u0119 textdomain (nazwa\/uchwyt). Mo\u017ce to by\u0107 cokolwiek chcesz, ale trzymaj si\u0119 kr\u00f3tkich, poniewa\u017c prawdopodobnie b\u0119dziesz musia\u0142 je wpisywa\u0107 bardzo cz\u0119sto. Dla mojego motywu ustawi\u0142em moj\u0105 textdomain z domen\u0105 <code>awhitepixel<\/code>. Wi\u0119c w PHP zrobi\u0119 <code>__('My string', 'awhitepixel')<\/code>t\u0142umaczenie \u0142a\u0144cuch\u00f3w i b\u0119dzie to dok\u0142adnie to samo w plikach JavaScript.<\/p>\n<p>Zacznijmy edytowa\u0107 nasz plik JavaScript. Najpierw musimy zdestrukturyzowa\u0107 funkcj\u0119 <code>__<\/code>i <code>_e<\/code>z <code>wp.i18n<\/code>pakietu. Ze wzgl\u0119du na charakter React najprawdopodobniej b\u0119dziesz w wi\u0119kszo\u015bci, a mo\u017ce tylko korzysta\u0107 z tej <code>__<\/code>funkcji.<\/p>\n<pre><code>const { __, _e } = wp.i18n;<\/code><\/pre>\n<p>A potem jest kwestia znalezienia wszystkich naszych zakodowanych na sztywno tekst\u00f3w w pliku JavaScript i ich aktualizacji. Pami\u0119taj, \u017ce funkcje <code>__<\/code>i <code>_e<\/code>wymagaj\u0105 kontekstu JavaScript. Oznacza to, \u017ce gdy wpisujemy stringi jako na przyk\u0142ad warto\u015bci w\u0142a\u015bciwo\u015bci obiektu, u\u017cywamy <code>__()<\/code>od razu, ale jako warto\u015bci np. rekwizyt\u00f3w musimy wszystko zawin\u0105\u0107 do \u015brodka <code>{ }<\/code>, aby zaznaczy\u0107, \u017ce jest to kod JavaScript.<\/p>\n<p>Na przyk\u0142ad nasza <code>registerBlockType<\/code>obs\u0142uga t\u0142umaczenia b\u0119dzie wygl\u0105da\u0107 tak:<\/p>\n<pre><code>registerBlockType('awp\/firstblock', {\n    title: __('My first block', 'awhitepixel'), \n    category: 'common',\n    icon: 'smiley',\n    description: __('Learning in progress', 'awhitepixel'),\n    keywords: [__('example', 'awhitepixel'), __('test', 'awhitepixel')],\n    attributes: {\n        ...<\/code><\/pre>\n<p>A co do rekwizyt\u00f3w, czyli w <code>InspectorControls<\/code>:<\/p>\n<pre><code>&lt;InspectorControls&gt;\n    &lt;PanelBody\n        title={__(\"Most awesome settings ever\", 'awhitepixel')}\n        initialOpen={true}\n    &gt;\n    ...\n        &lt;ToggleControl\n            label={__(\"Toggle me\", 'awhitepixel')}\n            checked={attributes.toggle}\n            onChange={(newval) =&gt; setAttributes({ toggle: newval })}\n        \/&gt;\n        ...<\/code><\/pre>\n<p>Zawi\u0144 wszystkie teksty, dla kt\u00f3rych chcesz obs\u0142ugiwa\u0107 t\u0142umaczenie w <code>__()<\/code>i <code>_e()<\/code>. Je\u015bli wykona\u0142e\u015b ten samouczek krok po kroku, nie powiniene\u015b mie\u0107 \u017cadnych przypadk\u00f3w, w kt\u00f3rych musisz u\u017cy\u0107 <code>_e()<\/code>. Kiedy sko\u0144czysz, ponownie skompiluj JavaScript, a my odejdziemy od JavaScript.<\/p>\n<h2>Konfigurowanie plik\u00f3w po i\/lub pot<\/h2>\n<p>Ten krok r\u00f3\u017cni si\u0119 nieco w zale\u017cno\u015bci od tego, co ju\u017c zrobi\u0142e\u015b i skonfigurowa\u0142e\u015b dla swojego motywu lub wtyczki. By\u0107 mo\u017ce piszesz skrypty Gutenberga w nowej i pustej wtyczce, kt\u00f3ra nie zosta\u0142a skonfigurowana do t\u0142umaczenia PHP, lub w motywie, kt\u00f3ry ma ju\u017c zarejestrowan\u0105 domen\u0119 tekstow\u0105. Mo\u017cesz mie\u0107 gotowe pliki PO (i MO) lub mo\u017cesz mie\u0107 tylko plik POT. Postaram si\u0119 jak najlepiej obj\u0105\u0107 wszystkie podstawy.<\/p>\n<h3>M\u00f3j motyw lub wtyczka ma ju\u017c plik po(t)<\/h3>\n<p>Je\u015bli masz ju\u017c plik PO lub POT w swoim projekcie, najprawdopodobniej masz r\u00f3wnie\u017c funkcj\u0119 PHP <code>load_theme_textdomain()<\/code>lub gdzie\u015b w swoim kodzie. Upewnij si\u0119, \u017ce zarejestrowana domena jest taka sama, jak w plikach JavaScript.<code>load_child_theme_textdomain()``load_plugin_textdomain()<\/code><\/p>\n<p>Wszystko, co musisz zrobi\u0107, to za\u0142adowa\u0107 plik PO dla j\u0119zyka, kt\u00f3ry chcesz przet\u0142umaczy\u0107 (lub wygenerowa\u0107 plik z pliku POT) na przyk\u0142ad w <a href=\"https:\/\/poedit.net\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PoEdit<\/a>. Kliknij \u201eAktualizuj z kodu&quot; (lub podobnie w innych programach), aby program m\u00f3g\u0142 przeskanowa\u0107 wszystkie pliki projektu (w tym nasze ostatnio zaktualizowane pliki JavaScript) i zaktualizowa\u0107 pul\u0119 ci\u0105g\u00f3w do t\u0142umaczenia. Ci\u0105gi w naszym pliku JavaScript powinny si\u0119 pojawi\u0107. Nast\u0119pnie wystarczy przet\u0142umaczy\u0107 je jak zwykle i zapisa\u0107.<\/p>\n<p>PS: Je\u015bli nie mo\u017cesz klikn\u0105\u0107 \u201eAktualizuj z kodu&#8221; lub ponownie przeskanowa\u0107 pliki, prawdopodobnie plik PO nie zosta\u0142 poprawnie skonfigurowany. Poszukaj wskaz\u00f3wek w nast\u0119pnej sekcji.<\/p>\n<h3>Nie mam \u017cadnych plik\u00f3w t\u0142umaczeniowych<\/h3>\n<p>Je\u015bli Tw\u00f3j motyw lub projekt nie zosta\u0142 skonfigurowany z t\u0142umaczeniem, musisz wygenerowa\u0107 plik POT za pomoc\u0105 WP-CLI lub r\u0119cznie utworzy\u0107 plik PO.<\/p>\n<p>Mam dok\u0142adny przewodnik, jak utworzy\u0107 plik PO w moim <a href=\"https:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-8-translation-of-your-theme\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">samouczku motywu dla pocz\u0105tkuj\u0105cych \u2013 cz\u0119\u015b\u0107 8<\/a>. W po\u015bcie opisano, jak utworzy\u0107 plik i poprawnie go skonfigurowa\u0107, aby przeszukiwa\u0107 pliki motyw\u00f3w, oraz s\u0142owa kluczowe do wyszukania (<code>__<\/code>, <code>_e<\/code>, itp.).<\/p>\n<p>Je\u015bli wolisz utworzy\u0107 plik POT, mo\u017cesz u\u017cy\u0107 polecenia <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/i18n\/make-pot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp i18n make-pot<\/a> w WP-CLI, a nast\u0119pnie utworzy\u0107 z tego plik PO za pomoc\u0105 np. PoEdit. Pami\u0119taj, \u017ce b\u0119dziesz musia\u0142 ponownie wygenerowa\u0107 plik POT (a nast\u0119pnie plik PO) za ka\u017cdym razem, gdy aktualizujesz dowolne ci\u0105gi w kodzie.<\/p>\n<h3>Wynik ko\u0144cowy<\/h3>\n<p>Tym, czego ostatecznie potrzebujesz, jest plik PO, kt\u00f3ry znalaz\u0142 ci\u0105gi JavaScript w miejscu, w kt\u00f3rym zosta\u0142y one przet\u0142umaczone. Zalecam umieszczenie plik\u00f3w t\u0142umacze\u0144 w osobnym folderze w motywie lub wtyczce. Kiedy zaczniemy generowa\u0107 pliki JSON, otrzymamy ca\u0142kiem sporo plik\u00f3w do t\u0142umaczenia i fajnie b\u0119dzie trzyma\u0107 je wszystkie razem we w\u0142asnym folderze.<\/p>\n<p>Jako punkt odniesienia umieszczam wszystkie pliki t\u0142umacze\u0144 w moim <code>theme\/assets\/lang\/<\/code>. Doda\u0142em norweskie t\u0142umaczenie dla mojego motywu o nazwie <code>nb_NO.po<\/code>, kt\u00f3re zawiera przet\u0142umaczone ci\u0105gi z naszego niestandardowego pliku JavaScript bloku.<\/p>\n<h2>Generowanie plik\u00f3w JSON z pliku po<\/h2>\n<p>Nast\u0119pnym krokiem jest u\u017cycie WP-CLI do wygenerowania plik\u00f3w JSON z naszego pliku po. W tym celu u\u017cywamy polecenia <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/i18n\/make-json\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp i18n make-json<\/a>.<\/p>\n<p>Nale\u017cy pami\u0119ta\u0107, \u017ce domy\u015blnie to polecenie usunie przet\u0142umaczone ci\u0105gi z pliku PO do u\u017cycia podczas generowania pliku JSON. Mo\u017ce to by\u0107 uci\u0105\u017cliwe w trakcie opracowywania motywu lub wtyczki. Poniewa\u017c kiedy dodasz nowe lub dostosujesz ci\u0105gi, b\u0119dziesz musia\u0142 ponownie przeskanowa\u0107 pliki i ponownie przet\u0142umaczy\u0107 wszystkie ci\u0105gi (i znowu i znowu). Na szcz\u0119\u015bcie w poleceniu jest flaga, aby tego unikn\u0105\u0107.<\/p>\n<p>Zaczynajmy! W swoim terminalu przejd\u017a do katalogu j\u0119zykowego dla swojego projektu. Uruchom nast\u0119puj\u0105ce polecenie i odnie\u015b si\u0119 do swojego pliku po (jak wspomniano, mam <code>nb_NO.po<\/code>gotowy plik).<\/p>\n<pre><code>wp i18n make-json nb_NO.po --no-purge<\/code><\/pre>\n<p>Je\u015bli nie masz problemu z usuni\u0119ciem przet\u0142umaczonych napis\u00f3w z pliku PO (na przyk\u0142ad, je\u015bli tworzysz ostateczn\u0105 wersj\u0119), mo\u017cesz pomin\u0105\u0107 <code>--no-purge<\/code>flag\u0119.<\/p>\n<p>Terminal powinien wy\u015bwietli\u0107 komunikat \u201eSukces&#8221; i poda\u0107 liczb\u0119 utworzonych plik\u00f3w JSON. Je\u015bli widzisz, \u017ce wygenerowa\u0142 dwa pliki JSON, dzieje si\u0119 tak dlatego, \u017ce odczyta\u0142 zar\u00f3wno nasz kod \u017ar\u00f3d\u0142owy pliku JavaScript, jak i plik kompilacji, i wygenerowa\u0142 po jednym dla ka\u017cdego. Je\u015bli masz wi\u0119cej plik\u00f3w JavaScript w swoim projekcie, otrzymasz jeszcze wi\u0119cej plik\u00f3w JSON.<\/p>\n<p>W momencie pisania tego (WordPress v 5.3.2 i WP-CLI wersja 2.4.0) pliki JSON s\u0105 generowane z kodem j\u0119zyka i hashem \u2013 zagadkowym ci\u0105giem jako nazwami plik\u00f3w. Musimy znale\u017a\u0107 w\u0142a\u015bciwy i zmieni\u0107 jego nazw\u0119.<\/p>\n<h2>Zmiana nazwy pliku JSON i \u0142adowanie go w PHP<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153240-61e50a824a365.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-153240-61e50a824a365.png\" alt=\"Utw\u00f3rz niestandardowy blok Gutenberga - Cz\u0119\u015b\u0107 8: Obs\u0142uga t\u0142umacze\u0144\" ><\/a><\/p>\n<p>Tw\u00f3j folder j\u0119zykowy prawdopodobnie wygl\u0105da mniej wi\u0119cej tak:<\/p>\n<p>Pami\u0119taj, \u017ce polecenie wygenerowa\u0142o jeden plik JSON na plik JavaScript \u2013 a poniewa\u017c w rzeczywisto\u015bci mamy dwa pliki dla naszego niestandardowego bloku (\u017ar\u00f3d\u0142o i kompilacja), wygenerowa\u0142o dwa pliki. Je\u015bli Tw\u00f3j kod JavaScript jest podzielony na kilka plik\u00f3w, ka\u017cdy otrzyma dwa w\u0142asne pliki JSON.<\/p>\n<p>Je\u015bli siedzisz z tylko dwoma plikami JSON (poniewa\u017c nie znaleziono innych plik\u00f3w JavaScript), mo\u017cesz teraz usun\u0105\u0107 jeden z nich. Je\u015bli masz wi\u0119cej ni\u017c dwa, musisz otworzy\u0107 pliki JSON i zobaczy\u0107, do jakiego pliku s\u0105 przeznaczone. Pliki JSON zawieraj\u0105 w\u0142a\u015bciwo\u015b\u0107 \u201e <code>source<\/code>&#8222;, kt\u00f3ra informuje, do kt\u00f3rego pliku JavaScript jest przeznaczony ten plik JSON. U\u017cyj tego, aby dowiedzie\u0107 si\u0119, kt\u00f3ry plik JSON zachowa\u0107. Zalecam znalezienie ostatecznego pliku kompilacji (w przeciwie\u0144stwie do plik\u00f3w deweloperskich), poniewa\u017c powinien on zawiera\u0107 wszystkie ci\u0105gi ze wszystkich plik\u00f3w.<\/p>\n<p>Kiedy znajdziesz w\u0142a\u015bciwy, musimy zmieni\u0107 jego nazw\u0119. Musimy zmieni\u0107 jego nazw\u0119, aby pod\u0105\u017ca\u0142a za tym wzorem:<\/p>\n<p><code>[textdomain]-[language code]-[script handle].json<\/code><\/p>\n<p>U\u017cyj domeny tekstowej, kt\u00f3rej u\u017cywa\u0142e\u015b wsz\u0119dzie (np <code>__('My string', 'awhitepixel')<\/code>. ), dodaj my\u015blnik i kod j\u0119zyka. Nast\u0119pnie podaj my\u015blnik i uchwyt skryptu u\u017cyty do zarejestrowania pliku JavaScript Gutenberga (<code>wp_register_script()<\/code>). Jako odniesienie, moja domena tekstowa to <code>awhitepixel<\/code>, m\u00f3j kod j\u0119zyka to <code>nb_NO<\/code>, a m\u00f3j uchwyt skryptu dla skryptu Gutenberga to <code>awp-myfirstblock-js<\/code>. Zmieniam wi\u0119c nazw\u0119 pliku JSON na:<\/p>\n<p><code>awhitepixel-nb_NO-awp-myfirstblock-js.json<\/code><\/p>\n<h3>Powiedz WordPressowi, aby wczyta\u0142 nasz JSON<\/h3>\n<p>Teraz pozostaje tylko ostatni krok \u2013 nakazanie WordPressowi za\u0142adowania naszego pliku JSON. Musimy u\u017cy\u0107 funkcji <code>[wp_set_script_translations](https:\/\/developer.wordpress.org\/reference\/functions\/wp_set_script_translations\/)()<\/code>. Jest to ca\u0142kiem nowa funkcja WordPressa, wi\u0119c polecam zawin\u0105\u0107 j\u0105 w <code>function_exists()<\/code>. Akceptuje trzy parametry; uchwyt skryptu dla naszego bloku, textdomain i \u015bcie\u017cka do naszego folderu t\u0142umaczenia (uwaga: \u015bcie\u017cka, a nie adres URL).<\/p>\n<p>Wewn\u0105trz naszej funkcji podpi\u0119tej do <code>init<\/code>, gdzie zarejestrowali\u015bmy nasz skrypt blokowy i wywo\u0142anie <code>register_block_type<\/code>, mo\u017cemy r\u00f3wnie\u017c wywo\u0142a\u0107 t\u0119 now\u0105 funkcj\u0119, aby za\u0142adowa\u0107 nasz plik t\u0142umaczenia JSON. PS: Pami\u0119taj, \u017ce hook <code>enqueue_block_assets<\/code>nie b\u0119dzie dzia\u0142a\u0142 przy rejestracji t\u0142umacze\u0144.<\/p>\n<pre><code>add_action('init', function() {\n    wp_register_script('awp-myfirstblock-js', ....);\n    register_block_type('awp\/firstblock', ....\n\u00a0\n    if (function_exists('wp_set_script_translations')) {\n        wp_set_script_translations('awp-myfirstblock-js', 'awhitepixel', get_template_directory(). '\/assets\/lang');\n    }\n});<\/code><\/pre>\n<p>I to wszystko! Tw\u00f3j blok powinien zosta\u0107 teraz przet\u0142umaczony. Zmie\u0144 j\u0119zyk WordPressa na j\u0119zyk, na kt\u00f3ry przet\u0142umaczy\u0142e\u015b i sprawd\u017a sam. Kiedy zmieniam j\u0119zyk WordPressa na norweski i dodaj\u0119 sw\u00f3j blok, nazwa i wszystko w nim jest t\u0142umaczone:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153240-61e50a83bedae.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-153240-61e50a83bedae.png\" alt=\"Utw\u00f3rz niestandardowy blok Gutenberga - Cz\u0119\u015b\u0107 8: Obs\u0142uga t\u0142umacze\u0144\" ><\/a><\/p>\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>Ta lekcja koncentruje si\u0119 na tym, jak wspiera\u0107 t\u0142umaczenie tekst\u00f3w w naszym bloku Gutenberga. U\u017cywamy WP-CLI do generowania wymaganych plik\u00f3w JSON dla WordPress.<\/p>\n","protected":false},"author":1,"featured_media":153241,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,940,940,897,1110,805,805,815,845,845,866,866,815],"tags":[1169],"class_list":{"0":"post-233470","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-kod","8":"category-gutenberg-7","11":"category-n-a","12":"category-php-7","14":"category-wtyczki","15":"category-samouczki","17":"category-wordpress-7","20":"tag-affiai-pl"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233470","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=233470"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233470\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/153241"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}