{"id":233695,"date":"2023-02-20T18:19:00","date_gmt":"2023-02-20T15:19:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233695"},"modified":"2022-11-11T08:55:22","modified_gmt":"2022-11-11T05:55:22","slug":"utworz-niestandardowy-blok-gutenberga-czesc-10-pobieranie-postow-i-komponentow-wyzszego-rzedu","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/utworz-niestandardowy-blok-gutenberga-czesc-10-pobieranie-postow-i-komponentow-wyzszego-rzedu\/","title":{"rendered":"Utw\u00f3rz niestandardowy blok Gutenberga &#8211; Cz\u0119\u015b\u0107 10: Pobieranie post\u00f3w i komponent\u00f3w wy\u017cszego rz\u0119du"},"content":{"rendered":"\n<p>W tej ostatniej cz\u0119\u015bci serii samouczk\u00f3w dotycz\u0105cych blok\u00f3w niestandardowych Gutenberga dowiemy si\u0119, jak u\u017cywa\u0107 komponent\u00f3w wy\u017cszego rz\u0119du do wykorzystywania komponent\u00f3w WordPress do wykonywania zapyta\u0144 o posty i innych podstawowych informacji WordPress.<\/p>\n<p>W poprzedniej cz\u0119\u015bci dowiedzieli\u015bmy si\u0119 o blokach dynamicznych i zako\u0144czyli\u015bmy implementacj\u0119 funkcjonalno\u015bci do wpisywania identyfikatora posta i u\u017cywania PHP do dynamicznego pobierania posta i renderowania go w trybie frontendu i podgl\u0105du. R\u0119czne wpisywanie identyfikatora posta nie jest intuicyjne ani przyjazne dla u\u017cytkownika. O wiele lepiej jest zapewni\u0107 u\u017cytkownikowi mo\u017cliwo\u015b\u0107 wybierania lub wyszukiwania post\u00f3w wed\u0142ug tytu\u0142u posta i klikania na co\u015b, aby wybra\u0107 jeden.<\/p>\n<p>Jedna cz\u0119\u015b\u0107 rozwi\u0105zania tego problemu jest do\u015b\u0107 \u0142atwa; jak wyszukiwa\u0107 posty z <code>edit<\/code>funkcji Twojego bloku. Mamy na to kilka opcji, a najlepsz\u0105 opcj\u0105 jest u\u017cycie niekt\u00f3rych tak zwanych <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">komponent\u00f3w wy\u017cszego rz\u0119du<\/a> z WordPressa. Mo\u017cesz r\u00f3wnie\u017c u\u017cy\u0107 metod przegl\u0105darki JavaScript, aby wykona\u0107 wywo\u0142anie AJAX w kierunku interfejsu API REST WordPress, na przyk\u0142ad <code>[fetch](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Fetch_API)<\/code>lub axios. WordPress faktycznie udost\u0119pnia w\u0142asn\u0105 wersj\u0119 <code>fetch<\/code>: <code>apiFetch()<\/code>.<\/p>\n<p>Druga cz\u0119\u015b\u0107 rozwi\u0105zania tego problemu zale\u017cy od ciebie; czyli jak przedstawi\u0107 list\u0119 lub wyb\u00f3r w naszym bloku. Jak zamierzasz zaprezentowa\u0107 list\u0119 post\u00f3w do wyboru? Na li\u015bcie wyboru, na li\u015bcie p\u00f3l wyboru lub przycisk\u00f3w radiowych? A mo\u017ce chcesz zaoferowa\u0107 mo\u017cliwo\u015b\u0107 wyszukiwania, a tym samym wdro\u017cy\u0107 rozwi\u0105zanie autouzupe\u0142niania lub rozwi\u0105zanie filtruj\u0105ce? Czy zezwoli\u0107 na wybieranie wielu post\u00f3w, czy tylko jednego? Zwykle mo\u017cesz rozwi\u0105za\u0107 ten problem, u\u017cywaj\u0105c r\u00f3\u017cnych komponent\u00f3w WordPress, ale musisz zdecydowa\u0107, kt\u00f3re rozwi\u0105zanie chcesz wdro\u017cy\u0107.<\/p>\n<p>Nauczmy si\u0119 najpierw troch\u0119 o komponentach wy\u017cszego rz\u0119du i module danych WordPress, zanim przyjrzymy si\u0119, jak mo\u017cemy wykonywa\u0107 zapytania post w naszym bloku.<\/p>\n<h2>Modu\u0142 WordPress Core Data i komponenty wy\u017cszego rz\u0119du<\/h2>\n<p>Podczas pracy z Reactem cz\u0119sto b\u0119dziesz musia\u0142 przekaza\u0107 stan do komponent\u00f3w potomnych lub w g\u00f3r\u0119 do wsp\u00f3lnego komponentu rodzicielskiego, aby wszystkie inne komponenty potomne mia\u0142y do \u200b\u200bnich dost\u0119p. Rozwi\u0105zaniem problemu centralizacji stanu aplikacji jest u\u017cycie <a href=\"https:\/\/redux.js.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Redux<\/a>. Dzi\u0119ki Redux mo\u017cesz budowa\u0107 sklepy \u2014 czyli obiekty, kt\u00f3re przechowuj\u0105 stan i informacje o aplikacji.<\/p>\n<p>Modu\u0142 <a href=\"https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-data\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">danych WordPress<\/a> jest centrum r\u00f3\u017cnych sklep\u00f3w i zapewnia funkcje zarz\u0105dzania danymi mi\u0119dzy r\u00f3\u017cnymi modu\u0142ami. Jest zbudowany na bazie Redux \u2013 ale nie pomyl go jako Redux dla WordPressa, poniewa\u017c istnieje kilka r\u00f3\u017cnic. Mo\u017cesz zarejestrowa\u0107 w\u0142asne sklepy w WordPressie lub, co wa\u017cniejsze, uzyska\u0107 dost\u0119p do zarejestrowanych sklep\u00f3w WordPress.<\/p>\n<p>Oto przegl\u0105d <a href=\"https:\/\/developer.wordpress.org\/block-editor\/data\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dost\u0119pnych sklep\u00f3w<\/a> w module danych WordPress (prawdopodobnie z czasem si\u0119 zmieni). Wszystkie sklepy WordPressa zawarte s\u0105 w <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/core-data\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">module Core Data<\/a>. Na przyk\u0142ad s\u0105 sklepy przechowuj\u0105ce dane edytora (<code>core\/editor<\/code>), uwagi (<code>core\/notices<\/code>), dane blok\u00f3w (<code>core\/blocks<\/code>), informacje o rzutni (<code>core\/viewport<\/code>) i wreszcie sam g\u0142\u00f3wny sklep \u2013 <code>core<\/code>.<\/p>\n<p>Aby uzyska\u0107 dost\u0119p do danych ze sklep\u00f3w, musisz u\u017cy\u0107 selektor\u00f3w. WordPress ma selektor w <code>wp.data<\/code>pakiecie; <code>[select](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-data\/#select)()<\/code>. Mo\u017cesz tak\u017ce manipulowa\u0107 sklepami za pomoc\u0105 programu <code>dispatch<\/code>, ale nie jest to om\u00f3wione w tej serii samouczk\u00f3w. Mo\u017cesz naprawd\u0119 \u0142atwo wypr\u00f3bowa\u0107 selektor, aby zobaczy\u0107, co jest dost\u0119pne w sklepach WordPress.<\/p>\n<h3>Wypr\u00f3bowanie selektora<\/h3>\n<p>Otw\u00f3rz edytor Gutenberg w Chrome i otw\u00f3rz narz\u0119dzie do debugowania konsoli. Wpisz:<\/p>\n<pre><code>wp.data.select('core')<\/code><\/pre>\n<p>I naci\u015bnij Enter. Powiniene\u015b otrzyma\u0107 obiekt jako odpowied\u017a ze wszystkimi selektorami (funkcjami), kt\u00f3rych mo\u017cesz u\u017cy\u0107. Jako przyk\u0142ady znajdziesz funkcje takie jak <code>getMedia<\/code>, <code>getTaxonomy<\/code>, <code>getAuthors<\/code>i tak dalej. Ten, kt\u00f3rego u\u017cyjemy do zapytania o posty, r\u00f3wnie\u017c tam jest, ale nie ma intuicyjnej nazwy; to si\u0119 nazywa <code>getEntityRecords<\/code>. W tej chwili niekt\u00f3re z tych funkcji s\u0105 <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/core-data#selectors\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">udokumentowane<\/a>, ale wi\u0119kszo\u015b\u0107 niestety nie.<\/p>\n<p>Wypr\u00f3buj tak\u017ce inne sklepy ni\u017c <code>core<\/code>, na przyk\u0142ad:<\/p>\n<pre><code>wp.data.select('core\/editor').getBlocks()<\/code><\/pre>\n<p>Spowoduje to zwr\u00f3cenie wszystkich informacji o wszystkich blokach znajduj\u0105cych si\u0119 obecnie w Twoim po\u015bcie. Mo\u017cesz pobawi\u0107 si\u0119 tym w debugerze konsoli Chrome i spr\u00f3bowa\u0107 wywo\u0142a\u0107 niekt\u00f3re funkcje, aby zobaczy\u0107, co otrzymasz w odpowiedzi. Niekt\u00f3re wymagaj\u0105 parametr\u00f3w, a inne nie.<\/p>\n<p>Aby korzysta\u0107 z selektor\u00f3w i dost\u0119pu do sklep\u00f3w, musimy ich u\u017cywa\u0107 w komponentach wy\u017cszego rz\u0119du. Komponenty wy\u017cszego rz\u0119du to po prostu wz\u00f3r robienia czego\u015b w React. Przekazujemy komponent do funkcji (lub komponentu), kt\u00f3ra mo\u017ce doda\u0107 jakie\u015b w\u0142a\u015bciwo\u015bci, a nast\u0119pnie zwracamy nowy komponent.<\/p>\n<p>Wewn\u0105trz modu\u0142u danych WordPress znajdujemy <code>[withSelect](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-data\/#withSelect)<\/code>; komponent wy\u017cszego rz\u0119du, kt\u00f3ry mo\u017cna wykorzysta\u0107 do wstrzykiwania rekwizyt\u00f3w za pomoc\u0105 zarejestrowanych selektor\u00f3w. Innymi s\u0142owy; wewn\u0105trz <code>withSelect<\/code>mamy dost\u0119p do selektora <code>select()<\/code>i mo\u017cemy go u\u017cywa\u0107 do wykonywania po\u0142\u0105cze\u0144. Wynikiem selektora b\u0119d\u0105 w\u0142a\u015bciwo\u015bci komponentu, do kt\u00f3rego przekazujemy <code>withSelect<\/code>. Je\u015bli potrzebujesz po\u0142\u0105czy\u0107 wiele komponent\u00f3w wy\u017cszego rz\u0119du, modu\u0142 danych WordPress oferuje t\u0119 <code>compose<\/code>funkcj\u0119, ale jest to poza zakresem tego samouczka. U\u017cyjemy tylko jednego komponentu wy\u017cszego rz\u0119du; <code>withSelect<\/code>.<\/p>\n<p>To by\u0142o du\u017co teorii, wi\u0119c zacznijmy przygl\u0105da\u0107 si\u0119 kodowi i praktycznym przyk\u0142adom.<\/p>\n<h2>Pobieranie post\u00f3w za pomoc\u0105 withSelect, select and getEntityRecords<\/h2>\n<p>Podsumowuj\u0105c powy\u017csze, musimy ustawi\u0107 komponent wy\u017cszego rz\u0119du <code>withSelect<\/code>dla naszego bloku. Wewn\u0105trz tego mo\u017cemy u\u017cy\u0107 selektor\u00f3w, aby uzyska\u0107 dost\u0119p do sklep\u00f3w WordPressa, kt\u00f3re b\u0119d\u0105 rekwizytami dla komponentu, do kt\u00f3rego przekazujemy <code>withSelect<\/code>. Wykorzystamy <code>core<\/code>sklep i selektor <code>getEntityRecords<\/code>do wyszukiwania post\u00f3w.<\/p>\n<p>Funkcja <code>getEntityRecords<\/code>ta jest niestety w tej chwili <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/core-data#getEntityRecords\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ma\u0142o udokumentowana .<\/a> Ale nauczy\u0142em si\u0119, \u017ce mo\u017cemy przekaza\u0107 <code>postType<\/code>jako pierwszy parametr (rodzaj encji), a nast\u0119pnie jako drugi parametr typ posta (np. &#8217; <code>post<\/code>&#8217; lub &#8217; <code>page<\/code>&#8217;). Trzeci parametr jest opcjonalny i mo\u017ce by\u0107 obiektem z argumentami zapytania. Trzeciemu parametrowi przyjrzymy si\u0119 p\u00f3\u017aniej.<\/p>\n<p>Je\u015bli post\u0119powa\u0142e\u015b zgodnie z t\u0105 seri\u0105 samouczk\u00f3w z poprzedniej cz\u0119\u015bci, mia\u0142by\u015b niestandardowy blok, kt\u00f3ry akceptuje r\u0119cznie wpisywany identyfikator posta we wprowadzaniu tekstu. Blok u\u017cywa PHP do dynamicznego renderowania posta w interfejsie u\u017cytkownika (oraz w trybie podgl\u0105du). Usu\u0144my wym\u00f3g r\u0119cznego wpisywania identyfikatora posta i zast\u0105pmy go czym\u015b bardziej intuicyjnym. Jak wspomniano wcze\u015bniej, musisz sam zdecydowa\u0107, jak prezentowa\u0107 list\u0119 post\u00f3w i jak najlepiej pozwoli\u0107 u\u017cytkownikowi wybra\u0107 post. Dla uproszczenia dodamy do wyboru wszystkie tytu\u0142y post\u00f3w.<\/p>\n<h3>Kodowanie<code>withSelect<\/code><\/h3>\n<p>Zacznijmy to kodowa\u0107. Najpierw musimy zdestrukturyzowa\u0107 to, czego potrzebujemy z pakietu danych;<\/p>\n<pre><code>const { withSelect, select } = wp.data;<\/code><\/pre>\n<p>Nast\u0119pnie u\u017cywamy <code>withSelect<\/code>w naszym bloku <code>edit<\/code>funkcji i przekazujemy nasz komponent edycji; <code>FirstBlockEdit<\/code>. Wewn\u0105trz <code>withSelect<\/code>destrukturyzujemy <code>select<\/code>jako parametr i u\u017cywamy selektora <code>select()<\/code>do zapytania o posty za pomoc\u0105 <code>getEntityRecords<\/code>. Zwracamy obiekt z jedn\u0105 w\u0142a\u015bciwo\u015bci\u0105, kt\u00f3r\u0105 wywo\u0142ujemy <code>posts<\/code>, kt\u00f3ra przechowuje wynik <code>select()<\/code>wywo\u0142ania.<\/p>\n<pre><code>...\nedit: withSelect(select =&gt; {\n    return {\n        posts: select('core').getEntityRecords('postType', 'post')\n    }\n})(FirstBlockEdit),\nsave:() =&gt; { return null }\n...<\/code><\/pre>\n<p>Z kodem powy\u017cej naszego komponentu, <code>FirstBlockEdit<\/code>, b\u0119dzie mia\u0142 teraz now\u0105 w\u0142a\u015bciwo\u015b\u0107; <code>posts<\/code>. Cokolwiek zwr\u00f3cimy wewn\u0105trz <code>withSelect<\/code>komponentu wy\u017cszego rz\u0119du, b\u0119dzie dost\u0119pne jako rekwizyty dla komponentu, kt\u00f3ry przekazujemy (w nawiasie na samym ko\u0144cu).<\/p>\n<h3>Obs\u0142uga post\u00f3w z selektora<\/h3>\n<p>Mo\u017cemy teraz przej\u015b\u0107 do naszego komponentu <code>FirstBlockEdit<\/code>i przyjrze\u0107 si\u0119 nowemu <code>props.posts<\/code>. Poniewa\u017c nasz komponent jest komponentem opartym na klasach, musimy odwo\u0142a\u0107 si\u0119 do props za pomoc\u0105 <code>this<\/code>. Wylogujmy to w konsoli wewn\u0105trz <code>render()<\/code>funkcji w <code>FirstBlockEdit<\/code>:<\/p>\n<pre><code>render() {\n    const { attributes, setAttributes } = this.props;\n    console.log(this.props.posts);\n    ...\n}<\/code><\/pre>\n<p>Miej oko na debugger konsoli. Mo\u017cesz zauwa\u017cy\u0107, \u017ce zostanie to zarejestrowane dwukrotnie; najpierw <code>null<\/code>, a potem jaki\u015b czas p\u00f3\u017aniej rejestruje tablic\u0119 post\u00f3w. Dzieje si\u0119 tak, poniewa\u017c zapytania o posty s\u0105 wykonywane asynchronicznie. Nasz komponent jest najpierw renderowany przed odpowiedzi\u0105, w kt\u00f3rym to czasie <code>props.posts<\/code>jest <code>null<\/code>. Gdy otrzymamy odpowied\u017a, nasz komponent jest ponownie renderowany z wype\u0142nion\u0105 propozycj\u0105. Nale\u017cy zawsze pami\u0119ta\u0107 o przystosowaniu si\u0119 do tego niewielkiego czasu bez danych w kodzie.<\/p>\n<h3>Dodanie wyboru, aby wy\u015bwietli\u0107 posty<\/h3>\n<p>Przygotujmy si\u0119 do wype\u0142nienia selekcji zwr\u00f3conymi postami, a do tego u\u017cyjemy komponentu WordPress <code>SelectControl<\/code>. Komponent <code>SelectControl<\/code>akceptuje tablic\u0119 wybor\u00f3w, gdzie ka\u017cdy wyb\u00f3r jest obiektem z w\u0142a\u015bciwo\u015bciami <code>value<\/code>i <code>label<\/code>.<\/p>\n<p>Je\u015bli spojrzysz na zarejestrowan\u0105 w konsoli (drug\u0105) odpowied\u017a, zobaczysz, \u017ce otrzymujemy tablic\u0119 obiekt\u00f3w post\u00f3w. Ka\u017cdy post zawiera wi\u0119kszo\u015b\u0107 informacji o po\u015bcie, ale w przypadku opcji wyboru interesuje nas tylko identyfikator posta jako warto\u015b\u0107 i tytu\u0142 posta jako etykieta. Przejdziemy wi\u0119c przez w\u0142a\u015bciwo\u015b\u0107 <code>posts<\/code>i wype\u0142nimy zmienn\u0105 tablicow\u0105, do kt\u00f3rej przeka\u017cemy <code>SelectControl<\/code>. Nie zapomnij zaj\u0105\u0107 si\u0119 ma\u0142ymi ramami czasowymi, w kt\u00f3rych znajduje si\u0119 <code>posts<\/code>rekwizyt <code>null<\/code>. W takim przypadku wype\u0142nimy tablic\u0119 wyboru jedn\u0105 opcj\u0105, kt\u00f3ra ma etykiet\u0119 \u201e\u0141adowanie\u2026&quot;.<\/p>\n<pre><code>let choices = [];\nif (this.props.posts) {\n    choices.push({ value: 0, label: __('Select a post', 'awhitepixel') });\n    this.props.posts.forEach(post =&gt; {\n        choices.push({ value: post.id, label: post.title.rendered });\n    });\n} else {\n    choices.push({ value: 0, label: __('Loading...', 'awhitepixel') })\n}<\/code><\/pre>\n<p>Pami\u0119taj, \u017ce musimy odnie\u015b\u0107 si\u0119 do tytu\u0142u posta jako <code>post.title.rendered<\/code>. Mo\u017cesz poszuka\u0107 siebie w zalogowanej konsoli <code>posts<\/code>i zobaczy\u0107 struktur\u0119 informacji dla ka\u017cdego postu.<\/p>\n<p>Po tym wystarczy doda\u0107, <code>SelectControl<\/code>gdzie chcemy. Mo\u017ce znajdowa\u0107 si\u0119 wewn\u0105trz samego bloku (najlepiej w kodzie trybu edycji) lub wewn\u0105trz Inspectora.<\/p>\n<pre><code>&lt;SelectControl\n    label={__('Selected Post', 'awhitepixel')}\n    options={choices}\n    value={attributes.selectedPostId}\n    onChange={(newval) =&gt; setAttributes({ selectedPostId: parseInt(newval) })}\n\/&gt;<\/code><\/pre>\n<p>Ustawiamy, <code>SelectControl<\/code>aby odnosi\u0142o si\u0119 do atrybutu <code>selectedPostId<\/code>, kt\u00f3ry zdefiniowali\u015bmy w poprzednim kroku. Ustawiamy zapisan\u0105 warto\u015b\u0107 w rekwizycie <code>value<\/code>i zajmujemy si\u0119 aktualizacj\u0105 w <code>onChange<\/code>rekwizycie \u2013 tak jak robili\u015bmy to kilka razy wcze\u015bniej. Zapewniamy, \u017ce numer jest przechowywany przy u\u017cyciu, <code>parseInt()<\/code>poniewa\u017c <code>selectedPostId<\/code>ma typ <code>number<\/code>. I przekazujemy wygenerowan\u0105 tablic\u0119 wybor\u00f3w w prop <code>options<\/code>.<\/p>\n<p>To naprawd\u0119 wszystko! Je\u015bli pod\u0105\u017ca\u0142e\u015b za kodem z poprzedniego kroku, powiniene\u015b ju\u017c mie\u0107 kod, kt\u00f3ry odczytuje zapisany identyfikator posta i wy\u015bwietla go!<\/p>\n<p>Oczywi\u015bcie radz\u0119 zaimplementowa\u0107 list\u0119 i wyb\u00f3r post\u00f3w w inny spos\u00f3b ni\u017c zwyk\u0142y wyb\u00f3r. Nie jest to \u0142adne ani przyjazne rozwi\u0105zanie, zw\u0142aszcza w przypadku witryn z du\u017c\u0105 ilo\u015bci\u0105 post\u00f3w. M\u00f3wi\u0105c o liczbie post\u00f3w, czy zauwa\u017cy\u0142e\u015b, \u017ce selektor getEntityRecords zwraca maksymalnie 10 ostatnich post\u00f3w? Jest to domy\u015blne zachowanie getEntityRecords, ale mo\u017cemy zmodyfikowa\u0107 zapytanie post, przekazuj\u0105c trzeci parametr.<\/p>\n<h3>Zmodyfikuj zapytanie dla getEntityRecords<\/h3>\n<p>Przekazuj\u0105c obiekt jako trzeci parametr do getEntityRecords mo\u017cemy zmodyfikowa\u0107 zapytanie post. Jak wspomniano wcze\u015bniej, niestety <code>getEntityRecords<\/code>brakuje dokumentacji. Ale czytaj\u0105c w ca\u0142ej sieci, zebra\u0142em list\u0119 mo\u017cliwych argument\u00f3w zapytania;<\/p>\n<ul>\n<li><code>per_page<\/code>: Ustaw liczb\u0119, aby ograniczy\u0107 liczb\u0119 post\u00f3w. Ustaw, <code>-1<\/code>aby pobra\u0107 maksymalnie 100. Domy\u015blnie <code>10<\/code>.<\/li>\n<li><code>exclude<\/code>: Wyklucz niekt\u00f3re posty z zapytania. Ustaw identyfikator posta lub tablic\u0119 liczb dla wielu identyfikator\u00f3w post\u00f3w.<\/li>\n<li><code>parent_exclude<\/code>: Wyklucz niekt\u00f3re posty nadrz\u0119dne. Ustaw na identyfikator posta lub tablic\u0119 wielu identyfikator\u00f3w posta.<\/li>\n<li><code>orderby<\/code>: Zdecyduj kolejno\u015b\u0107 post\u00f3w. Najprawdopodobniej mo\u017cesz u\u017cy\u0107 tych samych parametr\u00f3w, co w <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#order-orderby-parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zam\u00f3wieniu WP_Queryby<\/a>. Mo\u017ce by\u0107 np. \u201e <code>menu_order<\/code>&#8222;.<\/li>\n<li><code>order<\/code>: Albo <code>'asc'<\/code>lub &#8217; <code>desc'<\/code>dla porz\u0105dku rosn\u0105cego lub malej\u0105cego.<\/li>\n<li><code>status<\/code>: Filtruj wed\u0142ug statusu posta. Mo\u017ce by\u0107 ci\u0105giem, ci\u0105giem znak\u00f3w z wieloma statusami oddzielonymi przecinkiem lub tablic\u0105 ci\u0105g\u00f3w statusu. Np <code>['publish', 'draft']<\/code>. do zapytania zar\u00f3wno opublikowanych, jak i przygotowanych post\u00f3w.<\/li>\n<li><code>categories<\/code>: Filtruj posty wed\u0142ug okre\u015blonych kategorii. Podaj identyfikator kategorii lub tablic\u0119 identyfikator\u00f3w kategorii. Uwa\u017cam, \u017ce dzia\u0142a to tylko w przypadku kategorii post\u00f3w, a nie innych niestandardowych taksonomii.<\/li>\n<li><code>tags<\/code>: Filtruj posty wed\u0142ug okre\u015blonych tag\u00f3w. Podaj identyfikator tagu lub tablic\u0119 identyfikator\u00f3w tag\u00f3w. Dzia\u0142a tylko w przypadku tag\u00f3w post\u00f3w, a nie innych niestandardowych taksonomii.<\/li>\n<li><code>search<\/code>: Dodaj zapytanie wyszukiwania (ci\u0105g).<\/li>\n<\/ul>\n<p>Uwaga: to nie jest wyczerpuj\u0105ca lista i r\u00f3wnie\u017c mo\u017ce ulec zmianie!<\/p>\n<p>Zmodyfikujmy nasze zapytanie. Chcemy zrobi\u0107 dwie rzeczy; najpierw chcemy pobra\u0107 wszystkie posty, a nie tylko 10 ostatnich. W tym celu <code>-1<\/code>zapewniamy <code>per_page<\/code>. Po drugie, chcemy wykluczy\u0107 bie\u017c\u0105cy post z listy post\u00f3w, podaj\u0105c identyfikator aktualnego posta do <code>exclude<\/code>. Cz\u0119sto nie ma sensu pokazywa\u0107 skr\u00f3tu do wpisu lub podgl\u0105du samego bie\u017c\u0105cego wpisu.<\/p>\n<p>Mo\u017cesz pomy\u015ble\u0107; poczekaj, jak otrzymamy aktualny identyfikator posta? Nie zapominaj, \u017ce w ramach komponentu wy\u017cszego rz\u0119du <code>withSelect<\/code>i za pomoc\u0105 <code>select<\/code>selektora mo\u017cemy uzyska\u0107 dost\u0119p do wszystkich baz danych WordPressa. Obecny identyfikator posta to naturalna rzecz do przechowywania w jednym z g\u0142\u00f3wnych sklep\u00f3w WordPress. Wewn\u0105trz <code>core\/editor<\/code>znajdujemy funkcj\u0119 <code>getCurrentPostId()<\/code>.<\/p>\n<p>Zmodyfikujmy <code>withSelect<\/code>powr\u00f3t do czego\u015b takiego:<\/p>\n<pre><code>edit: withSelect(select =&gt; {\n    const currentPostId = select('core\/editor').getCurrentPostId();\n    const query = {\n        per_page: -1,\n        exclude: currentPostId\n    }\n    return {\n        posts: select('core').getEntityRecords('postType', 'post', query)\n    }\n})(FirstBlockEdit),<\/code><\/pre>\n<p>Powy\u017csza zmiana jest do\u015b\u0107 oczywista. Generujemy obiekt zapytania z w\u0142a\u015bciwo\u015bciami <code>per_page<\/code>i <code>exclude<\/code>przekazujemy go jako trzeci parametr do <code>getEntityRecords()<\/code>. Teraz nasz <code>props.posts<\/code>komponent <code>FirstBlockEdit<\/code>powinien zawiera\u0107 list\u0119 wszystkich post\u00f3w, ale wykluczy\u0107 bie\u017c\u0105cy post.<\/p>\n<h2>Wniosek<\/h2>\n<p>Ten post ko\u0144czy seri\u0119 samouczk\u00f3w Jak tworzy\u0107 niestandardowe bloki Gutenberga. Seria mia\u0142a na celu zapoznanie si\u0119 z podstawami tworzenia w\u0142asnych niestandardowych blok\u00f3w, zapewniaj\u0105c punkt wyj\u015bcia do tworzenia w\u0142asnych i bardziej z\u0142o\u017conych blok\u00f3w. Zdecydowanie miej oko na wi\u0119cej <a href=\"https:\/\/awhitepixel.com\/blog\/category\/gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">samouczk\u00f3w zwi\u0105zanych z Gutenbergiem tutaj<\/a>. Mo\u017ce znajdziesz samouczek bardziej szczeg\u00f3\u0142owo wyja\u015bniaj\u0105cy co\u015b, co chcia\u0142e\u015b zrobi\u0107 sam!<\/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>W tej cz\u0119\u015bci samouczka dotycz\u0105cego blok\u00f3w niestandardowych Gutenberga dowiemy si\u0119, jak u\u017cywa\u0107 komponent\u00f3w wy\u017cszego rz\u0119du, aby u\u017cywa\u0107 komponent\u00f3w WordPress do wykonywania zapyta\u0144 post.<\/p>\n","protected":false},"author":1,"featured_media":152565,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,721,721,940,940,919,897,919,1110,815,836,836,845,845,866,866,815],"tags":[1169],"class_list":{"0":"post-233695","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-kod","8":"category-deweloper","10":"category-gutenberg-7","12":"category-inny","15":"category-n-a","16":"category-wtyczki","17":"category-przewodnik-dla-poczatkujacych","19":"category-samouczki","21":"category-wordpress-7","24":"tag-affiai-pl"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233695","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=233695"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233695\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/152565"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233695"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233695"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}