{"id":6612,"date":"2021-06-15T11:20:01","date_gmt":"1999-01-01T00:00:00","guid":{"rendered":"https:\/\/pomoc.dhosting.pl\/?p=6612"},"modified":"2022-09-14T12:44:12","modified_gmt":"2022-09-14T10:44:12","slug":"headless-cms-wordpress","status":"publish","type":"post","link":"https:\/\/dhosting.pl\/pomoc\/headless-cms-wordpress\/","title":{"rendered":"Headless CMS \u2013 WordPress jako backend Twojego serwisu"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"photo-border wp-image-7158 size-full aligncenter\" src=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/DOBRYheadlessCMS_baner.png\" alt=\"headless CMS grafika przewodnia\" width=\"945\" height=\"400\" title=\"\" srcset=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/DOBRYheadlessCMS_baner.png 945w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/DOBRYheadlessCMS_baner-300x127.png 300w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/DOBRYheadlessCMS_baner-768x325.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/p>\n<p>Headless CMS to poj\u0119cie, kt\u00f3re w ostatnim czasie zyskuje na popularno\u015bci, zw\u0142aszcza w\u015br\u00f3d os\u00f3b zajmuj\u0105cych si\u0119 frontendem. Dlaczego tak si\u0119 dzieje i czym jest headless CMS?<\/p>\n<p>W skr\u00f3cie \u2013 Headless CMS polega na odseparowaniu od siebie backendu (<span class=\"code-short-format\">body<\/span>) i frontendu (<span class=\"code-short-format\">head<\/span>) aplikacji. Mianem <span class=\"code-short-format\">body<\/span> okre\u015bla si\u0119 CMS dostarczaj\u0105cy narz\u0119dzi do tworzenia i zarz\u0105dzania tre\u015bci\u0105, kt\u00f3ra jest udost\u0119pniana przez interfejs API. Warstw\u0119 prezentacji nazywamy <span class=\"code-short-format\">head<\/span>. Head to, na przyk\u0142ad, strona WWW, sklep internetowy, aplikacja mobilna i tym podobne. Dzi\u0119ki oddzieleniu <span class=\"code-short-format\">head<\/span> od <span class=\"code-short-format\">body<\/span> zyskujesz wyra\u017anie odseparowan\u0105 warstw\u0119 backendow\u0105 od frontendowej. Taka architektura umo\u017cliwia programistom frontend tworzenie zaawansowanych stron bez znajomo\u015bci technologii backendowych.<\/p>\n<p>Przeciwie\u0144stwem headless CMS jest, na przyk\u0142ad, WordPress, w kt\u00f3rym backend i frontend s\u0105 integraln\u0105 cz\u0119\u015bci\u0105. Cz\u0119sto okre\u015bla si\u0119 takie CMSy monolitami. W tradycyjnym podej\u015bciu CMSy, takie jak WordPress, dostarczaj\u0105 narz\u0119dzi do tworzenia i zarz\u0105dzania tre\u015bci\u0105 oraz, w przeciwie\u0144stwie do headless, warstw\u0119 frontendow\u0105. Tworz\u0105c stron\u0119 w oparciu o WordPressa programista musi dysponowa\u0107 zar\u00f3wno wiedz\u0105 z technologii backendowych jak i frontendowych.<\/p>\n<p>Istnieje jednak mo\u017cliwo\u015b\u0107, aby u\u017cy\u0107 WordPressa jako headless CMSa. W ramach tego poradnika dowiesz si\u0119, jak to zrobi\u0107 buduj\u0105c sw\u00f3j blog, kt\u00f3ry b\u0119dziesz rozwija\u0107 wy\u0142\u0105cznie w technologiach frontendowych. Wszystko to b\u0119dzie mo\u017cliwe dzi\u0119ki WordPress REST API.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Do_kogo_kierowany_jest_ten_poradnik\"><\/span>Do kogo kierowany jest ten poradnik?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Poradnik kierowany jest do os\u00f3b, kt\u00f3re poszukuj\u0105 backendu dla swoich projekt\u00f3w i maj\u0105 do\u015bwiadczenie z technologiami frontendowymi oraz posiadaj\u0105 podstawowe do\u015bwiadczenie w pracy z frameworkami JavaScript, np. Vue.js, React.js, Svelte. Przydatna mo\u017ce okaza\u0107 si\u0119 r\u00f3wnie\u017c wiedza na temat REST API i GraphQL.<\/p>\n<div id=\"dhost-1208755920\" class=\"dhost-inpost dhost-entity-placement\"><a href=\"https:\/\/dhosting.pl\/opieka-stron.html?utm_source=pomoc&utm_medium=artykul&utm_campaign=pomoc\" target=\"_blank\">\r\n\t<img decoding=\"async\" src=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2025\/01\/baner-opieka.png\" alt=\"opieka stron www\">\r\n<\/a>\r\n<br \/>\r\n<br \/><\/div><h2><span class=\"ez-toc-section\" id=\"Czego_potrzebujesz\"><\/span>Czego potrzebujesz?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>Strony WWW opartej o WordPressa, z kt\u00f3r\u0105 b\u0119dziesz si\u0119 integrowa\u0107.<\/li>\n<li>Zainstalowanych wtyczek Advanced Custom Fields i ACF to REST API.<\/li>\n<li>Zainstalowanego Node.js i terminala (konsoli).<\/li>\n<li>Edytora kodu. Ja korzystam z WebStorm, ale mo\u017cesz wybra\u0107 dowolny edytor. Je\u017celi nie masz w\u0142asnych preferencji, mo\u017cesz skorzysta\u0107 z darmowego Visual Code Studio.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Czego_sie_nauczysz\"><\/span>Czego si\u0119 nauczysz?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Dzi\u0119ki niniejszemu poradnikowi dowiesz si\u0119, czym jest headless CMS oraz JAMstack. Poznasz wady i zalety headless CMS oraz zbudujesz sw\u00f3j pierwszy JAMstackowy blog korzystaj\u0105c z WordPressa jako backendu. W poradniku nie b\u0119d\u0105 poruszane zagadnienia zwi\u0105zane z CSS i HTML.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"WordPress_jako_headless_CMS\"><\/span>WordPress jako headless CMS<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>WordPressa mo\u017cemy zalicza\u0107 do headless CMS dopiero od wersji 4.7. Wtedy dodane zosta\u0142o REST API, kt\u00f3re jest niezb\u0119dne do stworzenia architektury headless.<\/p>\n<p>WordPress REST API po instalacji WordPressa jest domy\u015blnie w\u0142\u0105czone. \u017beby zobaczy\u0107, co zwraca API, wystarczy otworzy\u0107 dowolny endpoint, np. <span class=\"code-short-format\">twoja-strona.pl\/wp-json\/wp\/v2\/posts<\/span>. Wy\u015bwietlone dane to JSON z wpisami w Twoim WordPressie.<\/p>\n<div class=\"info-alert-format\">\n<p>Warto zainstalowa\u0107 w swojej przegl\u0105darce rozszerzenie JSON Formatter, kt\u00f3re pokoloruje kod i sprawi, \u017ce zwr\u00f3cony JSON b\u0119dzie bardziej czytelny.<\/p>\n<\/div>\n<p>Dodanie do WordPress REST API pozwoli\u0142o jego tw\u00f3rcom wykorzysta\u0107 architektur\u0119 headless na potrzeby samego CMSa. W wersji 5.0 edytor WYSIWYG Gutenberg zosta\u0142 napisany w React.js i wykorzystuje API. Przyk\u0142ad ten pokazuje, \u017ce headless CMSy mo\u017cemy wykorzystywa\u0107 nie tylko do budowy stron WWW, ale te\u017c korzysta\u0107 z cz\u0119\u015bci danych do rozszerzenia ju\u017c istniej\u0105cych projekt\u00f3w.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Zalety_headless_CMS\"><\/span>Zalety headless CMS<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Dzi\u0119ki architekturze oddzielamy w ca\u0142o\u015bci PHPowy kod CMSa od warstwy prezentacji umo\u017cliwiaj\u0105c, np. skorzystanie z dowolnego frameworka JavaScript do stworzenia strony. WordPress jako backend sprawdzi si\u0119 te\u017c jako \u017ar\u00f3d\u0142o danych nie tylko dla strony WWW, ale te\u017c, np. dla aplikacji mobilnej czy wsp\u00f3\u0142dzielenia naszych tre\u015bci z innymi stronami w formie widget\u00f3w. Rozdzielenie backendu i frontendu b\u0119dzie te\u017c mia\u0142o pozytywny wp\u0142yw na bezpiecze\u0144stwo naszego projektu oraz jego skalowalno\u015b\u0107 w rozproszonej infrastrukturze.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Wady_headless_CMS\"><\/span>Wady headless CMS<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Niestety headless CMS to nie tylko same pozytywy. Korzystaj\u0105c z REST API dostajesz dane pozbawione kontekstu wizualnego. W przypadku WordPressa utracisz mo\u017cliwo\u015b\u0107 korzystania z wtyczek typu visual builder czy samego Gutenberga. Generalnie mo\u017cemy za\u0142o\u017cy\u0107, \u017ce wszystkie wtyczki, kt\u00f3re dzia\u0142aj\u0105 poza kokpitem WordPressa stan\u0105 si\u0119 bezwarto\u015bciowe. Dzia\u0142a\u0107 powinny natomiast wszystkie wtyczki rozszerzaj\u0105ce mo\u017cliwo\u015bci tworzenia i edytowania tre\u015bci jak na przyk\u0142ad Advanced Custom Fields.<\/p>\n<div class=\"info-alert-format\">\n<p>Korzystaj\u0105c z headless CMS przenosisz ca\u0142\u0105 odpowiedzialno\u015b\u0107 za funkcjonowanie strony na programist\u0119. Funkcje, kt\u00f3re do tej pory mo\u017cliwe by\u0142y do skonfigurowania przy pomocy wtyczek, b\u0119d\u0105 musia\u0142y zosta\u0107 zakodowane.<\/p>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Wykorzystanie_JAMstack\"><\/span>Wykorzystanie JAMstack<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>JAMstack to idealne dope\u0142nienie headless CMS, dlatego w ramach tego poradnika stworzysz JAMstackowego bloga przy u\u017cyciu Gridsome.<\/p>\n<p>JAMstack jest architektur\u0105, kt\u00f3ra bazuje na <strong>J<\/strong>avaScript po stronie klienta, reu\u017cywalnym <strong>A<\/strong>PI i wst\u0119pnie wyrenderowanym <strong>M<\/strong>arkupie. \u0179r\u00f3d\u0142em danych dla JAMstackowych stron mog\u0105 by\u0107, np. headless CMS, pliki Markdown czy tabele AirTable. Architektura ta pozwala na tworzenie szybszych i bezpieczniejszych stron.<\/p>\n<p>Gridsome to JAMstackowy framework dla Vue.js. Umo\u017cliwia szybkie tworzenie statycznie generowanych stron WWW. W poradniku korzystam z Vue.js. Je\u017celi React.js jest Ci bli\u017cszy, mo\u017cesz skorzysta\u0107 z Gatsby. Oba narz\u0119dzia dzia\u0142aj\u0105 w zbli\u017cony spos\u00f3b, r\u00f3\u017cni je tylko framework JavaScript, w kt\u00f3rym programujesz. Rozwi\u0105za\u0144 jest wiele, wspomniane dwa maj\u0105 dobr\u0105 dokumentacj\u0119 i du\u017c\u0105 spo\u0142eczno\u015b\u0107, co mo\u017ce by\u0107 pomocne w razie problem\u00f3w.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Krok_0_%E2%80%93_instalacja_Gridsome_CLI\"><\/span>Krok 0 \u2013 instalacja Gridsome CLI<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Przed rozpocz\u0119cie pracy z Gridsome musisz zainstalowa\u0107 Gridsome CLI (ang. <em>command-line interface<\/em>). Otw\u00f3rz terminal i wpisz polecenie:<\/p>\n<pre><code class=\"language-bash\" data-line=\"\">$ npm install --global @gridsome\/cli<\/code><\/pre>\n<p>Po zainstalowaniu CLI sprawd\u017a, czy wszystko przebieg\u0142o poprawnie wpisuj\u0105c polecenie:<\/p>\n<pre><code class=\"language-bash\" data-line=\"\">$ gridsome --version<\/code><\/pre>\n<p>W terminalu powinna zosta\u0107 wy\u015bwietlona aktualna wersja CLI, np.:<\/p>\n<pre><code class=\"language-bash\" data-line=\"\">@gridsome\/cli v0.3.4<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Krok_1_%E2%80%93_nowy_projekt_w_Gridsome\"><\/span>Krok 1 \u2013 nowy projekt w Gridsome<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Dzi\u0119ki narz\u0119dziom CLI dla Gridsome jeste\u015b w stanie w prosty spos\u00f3b stworzy\u0107 nowy projekt. Otw\u00f3rz terminal i wprowad\u017a polecenie:<\/p>\n<pre><code class=\"language-bash\" data-line=\"\">$ gridsome create my-gridsome-site<\/code><\/pre>\n<p>W efekcie uzyskasz folder <span class=\"code-short-format\">my-gridsome-site<\/span> z gotowym do uruchomienia projektem. Po utworzeniu projektu, mo\u017cesz uruchomi\u0107 lokalny serwer Gridsome wpisuj\u0105c w terminalu komend\u0119:<\/p>\n<pre><code class=\"language-bash\" data-line=\"\">$ gridsome develop<\/code><\/pre>\n<p>Serwer po uruchomieniu b\u0119dzie dost\u0119pny pod adresem URL <span class=\"code-short-format\">localhost:8080<\/span>. Wprowad\u017a go w przegl\u0105darce, a po zalogowaniu zobaczysz stron\u0119 g\u0142\u00f3wn\u0105 swojego bloga.<\/p>\n<p><a href=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001.png\"><img loading=\"lazy\" decoding=\"async\" class=\"photo-border aligncenter wp-image-6631\" src=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001.png\" alt=\"gridsome hello world\" width=\"800\" height=\"331\" title=\"\" srcset=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001.png 2188w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001-300x124.png 300w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001-1024x424.png 1024w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001-768x318.png 768w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001-1536x636.png 1536w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/001-2048x848.png 2048w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<h3>Struktura projektu<\/h3>\n<p>Dzi\u0119ki poleceniu <span class=\"code-short-format\">$ gridsome create<\/span> utworzony zosta\u0142 folder zawieraj\u0105cy kompletn\u0105 struktur\u0119 projektu.<\/p>\n<p><a href=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/002.png\"><img loading=\"lazy\" decoding=\"async\" class=\"photo-border aligncenter wp-image-6633 size-full\" src=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/002.png\" alt=\"gridsome struktura projektu\" width=\"362\" height=\"396\" title=\"\" srcset=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/002.png 362w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/002-274x300.png 274w\" sizes=\"auto, (max-width: 362px) 100vw, 362px\" \/><\/a><\/p>\n<p>Najwa\u017cniejsze foldery znajdziesz wewn\u0105trz folderu <span class=\"code-short-format\">src<\/span> (ang. <em>source code<\/em>). Pierwsza rzecz, na kt\u00f3r\u0105 warto zwr\u00f3ci\u0107 uwag\u0119, to pliki <span class=\"code-short-format\">README.md<\/span> w podfolderach. Zawieraj\u0105 one kr\u00f3tki opis odpowiedzialno\u015bci danego folderu wraz z linkiem do dokumentacji.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Krok_2_%E2%80%93_integracja_z_WordPressem\"><\/span>Krok 2 \u2013 integracja z WordPressem<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Utworzony projekt nie posiada obecnie \u017cadnego backendu. Mo\u017cesz jedynie tworzy\u0107 nowe komponenty i budowa\u0107 statyczne podstrony. Gridsome to framework, kt\u00f3ry umo\u017cliwia integracj\u0119 danych z r\u00f3\u017cnych \u017ar\u00f3de\u0142 w tym WordPress REST API. W celu instalacji integracji z WordPressem otw\u00f3rz terminal i wprowad\u017a polecenie:<\/p>\n<pre><code class=\"language-bash\" data-line=\"\">$ npm install @gridsome\/source-wordpress<\/code><\/pre>\n<p>Zainstalowanie wtyczki nie wystarczy. Musisz j\u0105 jeszcze skonfigurowa\u0107. W celu konfiguracji wtyczki <span class=\"code-short-format\">source-wordpress<\/span>, znajd\u017a w folderze g\u0142\u00f3wnym plik <span class=\"code-short-format\">gridsome.config.js<\/span> i otw\u00f3rz go przy u\u017cyciu edytora kodu.<\/p>\n<p>W pliku <span class=\"code-short-format\">gridsome.config.js<\/span> odszukaj definicj\u0119 <span class=\"code-short-format\">plugins<\/span> i dodaj ustawienia <span class=\"code-short-format\">source-wordpress<\/span>:<\/p>\n<pre><code class=\"language-javascript\" data-line=\"\">plugins: [\n    {\n      use: &#039;@gridsome\/source-wordpress&#039;,\n      options: {\n        baseUrl: &#039;ADRES_URL&#039;,\n      }\n    }\n],<\/code><\/pre>\n<p>W polu <span class=\"code-short-format\">baseUrl<\/span> podaj adres, pod kt\u00f3rym dost\u0119pny jest Tw\u00f3j WordPress. Na potrzeby poradnika skorzystam z WordPressa <span class=\"code-short-format\">dhosting.pl\/pomoc\/pomoc<\/span>. Dodatkowe opcje pluginu <span class=\"code-short-format\">source-wordpress<\/span> znajdziesz na <a target=\"_blank\" href=\"https:\/\/gridsome.org\/plugins\/@gridsome\/source-wordpress\" rel=\"noopener\">tej stronie<\/a>.<\/p>\n<div class=\"success-alert-format\">\n<p>Dzi\u0119ki Headless CMS z \u0142atwo\u015bci\u0105 oddzielisz warstw\u0119 frontendow\u0105 od backendowej, czyli head od body. To bardzo korzystne rozwi\u0105zanie, daj\u0105ce wiele mo\u017cliwo\u015bci. Je\u015bli jednak chodzi o wyb\u00f3r hostingu lepiej nie traci\u0107 g\u0142owy i zapewni\u0107 sobie spok\u00f3j ducha.<\/p>\n<p>Zagwarantuje Ci to Elastyczny Web Hosting \u2013 innowacyjne rozwi\u0105zanie automatycznie dopasowuj\u0105ce zasoby do potrzeb Twoich stron. Dzi\u0119ki temu zachowaj\u0105 one p\u0142ynno\u015b\u0107 dzia\u0142ania niezale\u017cnie od obci\u0105\u017cenia, a Ty nie musisz si\u0119 niczym przejmowa\u0107.<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/dhosting.pl\/pp-fach\" rel=\"noopener\"><strong>WYPR\u00d3BUJ HOSTING<\/strong><\/a><\/p>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Krok_3_%E2%80%93_dodawanie_listy_wpisow_na_stronie_glownej\"><\/span>Krok 3 \u2013 dodawanie listy wpis\u00f3w na stronie g\u0142\u00f3wnej<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Gridsome do obs\u0142ugi danych z API korzysta z j\u0119zyka zapyta\u0144 GraphQL. Je\u017celi widzisz t\u0119 nazw\u0119 pierwszy raz, nie przejmuj si\u0119. W dalszej cz\u0119\u015bci poradnika dowiesz si\u0119, czym jest GraphQL.<\/p>\n<p>W celu wy\u015bwietlenia listy wpis\u00f3w na stronie g\u0142\u00f3wnej otw\u00f3rz plik <span class=\"code-short-format\">Index.vue<\/span>, kt\u00f3ry znajdziesz w folderze <span class=\"code-short-format\">src\/pages<\/span> i podmie\u0144 jego zawarto\u015b\u0107 na t\u0119 widoczn\u0105 poni\u017cej:<\/p>\n<pre><code class=\"language-markup\" data-line=\"\">&lt;template&gt;\n &lt;div&gt;\n   &lt;div v-for=&quot;edge in $page.posts.edges&quot; :key=&quot;edge.node.id&quot;&gt;\n     &lt;h2&gt;{{ edge.node.title }}&lt;\/h2&gt;\n     &lt;div v-html=&quot;edge.node.excerpt&quot;&gt;&lt;\/div&gt;\n   &lt;\/div&gt;\n &lt;\/div&gt;\n&lt;\/template&gt;\n\n&lt;page-query&gt;\nquery {\n posts: allWordPressPost {\n   edges {\n     node {\n       id\n       title\n       excerpt\n     }\n   }\n }\n}\n&lt;\/page-query&gt;\n<\/code><\/pre>\n<p>Warto zwr\u00f3ci\u0107 uwag\u0119 na tag <span class=\"code-short-format\">&lt;page-query&gt;<\/span>. Wewn\u0105trz tego tagu znajduje si\u0119 zapytanie GraphQLowe, kt\u00f3re pobiera dane zebrane z WordPress REST API. Wewn\u0105trz <span class=\"code-short-format\">node<\/span> definiujesz, kt\u00f3re elementy wpis\u00f3w Ci\u0119 interesuj\u0105. W tym przypadku jest to <span class=\"code-short-format\">id<\/span>, <span class=\"code-short-format\">tytu\u0142<\/span> i <span class=\"code-short-format\">fragment<\/span>.<\/p>\n<p><a href=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004.png\"><img loading=\"lazy\" decoding=\"async\" class=\"photo-border aligncenter wp-image-6639\" src=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004.png\" alt=\"lista wpis\u00f3w\" width=\"800\" height=\"501\" title=\"\" srcset=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004.png 2256w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004-300x188.png 300w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004-1024x642.png 1024w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004-768x481.png 768w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004-1536x963.png 1536w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/004-2048x1284.png 2048w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<div class=\"success-alert-format\">\n<p>Zatrzymaj si\u0119 chwil\u0119 na tym kroku i spr\u00f3buj doda\u0107 wi\u0119cej element\u00f3w do wpisu jak, np. <span class=\"code-short-format\">lista tag\u00f3w<\/span> czy <span class=\"code-short-format\">autor<\/span>.<\/p>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Krok_4_%E2%80%93_dodawanie_widoku_pojedynczego_wpisu\"><\/span>Krok 4 \u2013 dodawanie widoku pojedynczego wpisu<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Maj\u0105c dost\u0119p do listy wpis\u00f3w, mo\u017cesz zaj\u0105\u0107 si\u0119 obs\u0142ug\u0105 pojedynczego wpisu. W tym celu otw\u00f3rz ponownie plik <span class=\"code-short-format\">gridsome.config.js<\/span> i dodaj w nim opcj\u0119 <span class=\"code-short-format\">templates<\/span>:<\/p>\n<pre><code class=\"language-javascript\" data-line=\"\">templates: {\n  WordPressPost: &#039;\/:slug&#039;\n}<\/code><\/pre>\n<p>Dla dhosting.pl\/pomoc\/pomoc b\u0119dzie to po prostu <span class=\"code-short-format\">slug<\/span>. Je\u017celi Tw\u00f3j adres pojedynczego wpisu zawiera wi\u0119cej p\u00f3l ni\u017c <span class=\"code-short-format\">slug<\/span>, musisz je uwzgl\u0119dni\u0107 w ustawieniach, np.:<\/p>\n<pre><code class=\"language-javascript\" data-line=\"\">templates: {\n  WordPressPost: &#039;\/:year\/:slug&#039;\n}<\/code><\/pre>\n<p>Otw\u00f3rz plik <span class=\"code-short-format\">Index.vue<\/span>, kt\u00f3ry znajdziesz w folderze <span class=\"code-short-format\">src\/pages<\/span> i dodaj do zapytania parametr <span class=\"code-short-format\">path<\/span>:<\/p>\n<pre><code class=\"language-javascript\" data-line=\"\">&lt;page-query&gt;\nquery {\n posts: allWordPressPost {\n   edges {\n     node {\n       id\n       title\n       excerpt\n       path\n     }\n   }\n }\n}\n&lt;\/page-query&gt;<\/code><\/pre>\n<p>Wykorzystaj parametr <span class=\"code-short-format\">path<\/span> do przekszta\u0142cenia nag\u0142\u00f3wka <span class=\"code-short-format\">&lt;h2&gt;<\/span> w link:<\/p>\n<pre><code class=\"language-markup\" data-line=\"\">&lt;h2&gt;\n &lt;g-link :to=&quot;edge.node.path&quot;&gt;{{ edge.node.title }}&lt;\/g-link&gt;\n&lt;\/h2&gt;<\/code><\/pre>\n<p>W folderze <span class=\"code-short-format\">src\/templates<\/span> utw\u00f3rz plik <span class=\"code-short-format\">WordPressPost.vue<\/span>. Nazwa musi by\u0107 zgodna z <span class=\"code-short-format\">template<\/span> utworzonym w pliku <span class=\"code-short-format\">gridsome.config.js<\/span>:<\/p>\n<pre><code class=\"language-markup\" data-line=\"\">&lt;template&gt;\n &lt;div&gt;\n   &lt;h1&gt;{{$page.post.title}}&lt;\/h1&gt;\n   &lt;div v-html=&quot;$page.post.content&quot;&gt;&lt;\/div&gt;\n &lt;\/div&gt;\n&lt;\/template&gt;\n\n&lt;page-query&gt;\nquery ($id: ID!) {\n post: wordPressPost(id: $id) {\n   title\n   content\n }\n}\n&lt;\/page-query&gt;<\/code><\/pre>\n<p>W efekcie otrzymasz stron\u0119 wpis, np. \u201eJak za\u0142o\u017cy\u0107 bloga? Kompletny przewodnik instalacji WordPressa dla pocz\u0105tkuj\u0105cych\u201d.<\/p>\n<p><a href=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005.png\"><img loading=\"lazy\" decoding=\"async\" class=\"photo-border aligncenter wp-image-6644\" src=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005.png\" alt=\"pobrany artykul\" width=\"800\" height=\"490\" title=\"\" srcset=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005.png 2296w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005-300x184.png 300w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005-1024x627.png 1024w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005-768x470.png 768w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005-1536x941.png 1536w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/005-2048x1254.png 2048w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<div class=\"success-alert-format\">\n<p>Zatrzymaj si\u0119 chwil\u0119 na tym kroku i spr\u00f3buj doda\u0107 wi\u0119cej element\u00f3w do wpisu jak, np. <span class=\"code-short-format\">lista tag\u00f3w<\/span> czy <span class=\"code-short-format\">autor<\/span>.<\/p>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Krok_5_%E2%80%93_integracja_z_Advanced_Custom_Fields\"><\/span>Krok 5 \u2013 integracja z Advanced Custom Fields<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Je\u017celi masz styczno\u015b\u0107 z WordPressem, to prawdopodobnie znasz wtyczk\u0119 Advanced Custom Fields. Umo\u017cliwia ona dodawanie dodatkowych p\u00f3l do stron, wpis\u00f3w, kategorii, a nawet menu. W przypadku headless ta wtyczka r\u00f3wnie\u017c b\u0119dzie bardzo przydatna.<\/p>\n<p>Niestety Advanced Custom Fields nie integruje si\u0119 z WordPress REST API. Mo\u017cesz to naprawi\u0107 korzystaj\u0105c z wtyczki ACF to REST API. Po zainstalowaniu wtyczki w WordPressie pola ACF powinny by\u0107 dost\u0119pne w Gridsome.<\/p>\n<p>Dodatkowo, w celu optymalizacji, Gridsome zaleca dodanie filtra w WordPressie, kt\u00f3ry z endpoint\u00f3w AFC b\u0119dzie zwraca\u0142 tylko <span class=\"code-short-format\">post_type<\/span> i <span class=\"code-short-format\">id<\/span>.<\/p>\n<pre><code class=\"language-php\" data-line=\"\">add_filter( &#039;acf\/format_value&#039;, function ( $value ) {\n  if ( $value instanceof WP_Post ) {\n    return [\n      &#039;post_type&#039; =&gt; $value-&gt;post_type,\n      &#039;id&#039;        =&gt; $value-&gt;ID,\n    ];\n  }\n\n  return $value;\n}, 100 );<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Krok_6_%E2%80%93_zapytania_w_GraphQL\"><\/span>Krok 6 \u2013 zapytania w GraphQL<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Gridsome integruje si\u0119 z WordPress REST API, a nast\u0119pnie pozwala programi\u015bcie obs\u0142ugiwa\u0107 pozyskane dane przy u\u017cyciu GraphQL. GraphQL to j\u0119zyk zapyta\u0144, kt\u00f3ry pozwala w jednym zapytaniu zwr\u00f3ci\u0107 wszystkie potrzebne programi\u015bcie informacje, o czym zapewne przekona\u0142y Ci\u0119 kroki 3 i 4.<\/p>\n<p>Je\u017celi masz ju\u017c do\u015bwiadczenie z WordPress REST API, to wiesz, \u017ce pozyskanie informacji o wpisie, jego kategorii, danych autora i miniaturce, mo\u017ce wymaga\u0107 kilku zapyta\u0144. W przypadku GraphQL wystarczy okre\u015bli\u0107, co chcesz uzyska\u0107 i jakie dane Ci\u0119 interesuj\u0105, \u017ceby nast\u0119pnie je otrzyma\u0107. Tak samo jak ma to miejsce z list\u0105 wpis\u00f3w z kroku 3.<\/p>\n<p><a href=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006.png\"><img loading=\"lazy\" decoding=\"async\" class=\"photo-border aligncenter wp-image-6646\" src=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006.png\" alt=\"graphql\" width=\"800\" height=\"504\" title=\"\" srcset=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006.png 2238w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006-300x189.png 300w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006-1024x645.png 1024w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006-768x484.png 768w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006-1536x968.png 1536w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/006-2048x1290.png 2048w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>Gridsome wraz z serwerem developerskim uruchamia tak\u017ce narz\u0119dzie dla GraphQL u\u0142atwiaj\u0105ce tworzenie i testowanie zapyta\u0144. Narz\u0119dzie dost\u0119pne jest pod adresem:<br \/>\n<span class=\"code-short-format\">http:\/\/localhost:8080\/___explore<\/span>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Krok_7_%E2%80%93_publikacja\"><\/span>Krok 7 \u2013 publikacja<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Przed opublikowaniem strony musisz zbudowa\u0107 sw\u00f3j projekt. W tym celu w terminalu wpisz polecenie:<\/p>\n<pre><code class=\"language-bash\" data-line=\"\">$ gridsome build<\/code><\/pre>\n<p>W efekcie w projekcie powinien pojawi\u0107 si\u0119 folder <span class=\"code-short-format\">dist<\/span> zawieraj\u0105cy statyczne pliki ze stron\u0105 WWW gotow\u0105 do publikacji.<\/p>\n<p><a href=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/007.png\"><img loading=\"lazy\" decoding=\"async\" class=\"photo-border aligncenter wp-image-6648 size-medium\" src=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/007-300x244.png\" alt=\"folder dist\" width=\"300\" height=\"244\" title=\"\" srcset=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/007-300x244.png 300w, https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/007.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Zalet\u0105 plik\u00f3w statycznych jest mo\u017cliwo\u015b\u0107 opublikowania ich na dowolnym serwerze oraz skorzystania z takich us\u0142ug jak, np. GitHub Pages.<\/p>\n<p>Wad\u0105 naszego bloga jest to, \u017ce z ka\u017cdym nowym wpisem konieczne jest uruchomienie polecenia <span class=\"code-short-format\">build<\/span>. Mo\u017cna to zrobi\u0107 r\u0119cznie lub wykorzysta\u0107 takie narz\u0119dzia jak, np. GitHub Actions i wtyczk\u0119 WP Webhooks do zautomatyzowania tego procesu.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Podsumowanie\"><\/span>Podsumowanie<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Headless CMS to rozwi\u0105zanie, kt\u00f3re powinno zainteresowa\u0107 ka\u017cdego programist\u0119 frontendu. Umo\u017cliwia zar\u00f3wno tworzenie zaawansowanych stron internetowych w architekturze JAMstack jak i ponowne u\u017cycie danych z CMSa na innych platformach ko\u0144cowych jak, np. aplikacje mobilne.<\/p>\n<p>Mam nadziej\u0119, \u017ce znaj\u0105c wady i zalety Headless CMSa zechcesz wykorzysta\u0107 go w swoim nast\u0119pnym projekcie. Pami\u0119taj, \u017ce blog zaprezentowany w powy\u017cszym poradniku to tylko u\u0142amek mo\u017cliwo\u015bci, jakie niesie za sob\u0105 architektura headless oraz framework Gridsome.<\/p>\n<div class=\"author-format\">\n<div class=\"author-format-photo\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 2px solid #e8e8e8;\" src=\"http:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2021\/06\/przemyslaw-spaczek.png\" alt=\"Przemyslaw Spaczek\" width=\"200\" height=\"200\" title=\"\"><\/div>\n<div class=\"author-format-desc\">\n<h3><span style=\"font-weight: 400;\">Autor artyku\u0142u:<\/span> Przemys\u0142aw Spaczek<\/h3>\n<p>Senior Frontend Developer \u2013 obecnie tworzy zaawansowane strony WWW i aplikacje w Vue.js. W wybranych projektach nadal z sentymentem si\u0119ga po WordPress jako backend, g\u0142\u00f3wnie jako headless CMS. Ch\u0119tnie dzieli si\u0119 swoj\u0105 wiedz\u0105 w internecie i na meetupach.<\/p>\n<ul class=\"author-icons\">\n<li class=\"author-social\"><a target=\"_blank\" href=\"https:\/\/github.com\/pspaczek\" rel=\"noopener\"><i class=\"fab fa-github\"><\/i> GitHub<\/a><\/li>\n<li class=\"author-social\"><a target=\"_blank\" href=\"https:\/\/www.linkedin.com\/in\/przemyslaw-spaczek\/\" rel=\"noopener\"><i class=\"fab fa-linkedin-in\"><\/i> LinkedIn<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Headless CMS to poj\u0119cie, kt\u00f3re w ostatnim czasie zyskuje na popularno\u015bci, zw\u0142aszcza w\u015br\u00f3d os\u00f3b zajmuj\u0105cych si\u0119 frontendem. Dlaczego tak si\u0119 dzieje i czym jest headless CMS? W skr\u00f3cie \u2013 Headless CMS polega na odseparowaniu od siebie backendu (body) i frontendu (head) aplikacji. Mianem body okre\u015bla si\u0119 CMS dostarczaj\u0105cy narz\u0119dzi do tworzenia i zarz\u0105dzania tre\u015bci\u0105, kt\u00f3ra [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":10957,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[1883,631],"class_list":["post-6612","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fachowe-poradniki","tag-headlesscms","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/posts\/6612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/comments?post=6612"}],"version-history":[{"count":0,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/posts\/6612\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/media\/10957"}],"wp:attachment":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/media?parent=6612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/categories?post=6612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/tags?post=6612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}