{"id":230698,"date":"2022-12-18T14:12:00","date_gmt":"2022-12-18T11:12:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230698"},"modified":"2022-12-18T14:13:29","modified_gmt":"2022-12-18T11:13:29","slug":"widzety-wordpress-refaktoryzacja-czesc-6","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-refaktoryzacja-czesc-6\/","title":{"rendered":"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 6"},"content":{"rendered":"\n<p>Powiniene\u015b by\u0107 dobrze zorientowany w refaktoryzacji, kt\u00f3r\u0105 robimy w odniesieniu do WordPress Widget Boilerplate. Je\u015bli nie, to polecam nadrobi\u0107 dotychczasowe zaleg\u0142o\u015bci w serii o:<\/p>\n<ul>\n<li>czytanie <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-5\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">poprzedniego posta<\/a> ,<\/li>\n<li>lub przeczytanie <a href=\"https:\/\/tommcfarlin.com\/tag\/wordpress-widgets-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ca\u0142ej serii<\/a> do tego momentu,<\/li>\n<li>i przygl\u0105daj\u0105c <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">si\u0119 ga\u0142\u0119zi deweloperskiej projektu<\/a> na GitHub.<\/li>\n<\/ul>\n<p>Je\u015bli chodzi o baz\u0119 kodu, jeste\u015bmy teraz w dobrym miejscu. Zacz\u0119li\u015bmy refaktoryzowa\u0107 wi\u0119kszo\u015b\u0107 kodu do mniejszych, bardziej skoncentrowanych klas. W\u0142a\u015bnie skonfigurowali\u015bmy Rejestr, aby\u015bmy mogli rozpocz\u0105\u0107 prac\u0119 z instancjami obiekt\u00f3w w ca\u0142ej wtyczce bez potrzeby zbytniego \u0142\u0105czenia.<\/p>\n<p>Ale wci\u0105\u017c istnieje problem, z kt\u00f3rym si\u0119 borykamy i dotyczy on przestrzeni nazw i automatycznego \u0142adowania. M\u00f3wi\u0142em o tym <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/przestrzenie-nazw-i-automatyczne-ladowanie-w-wordpress\/\" title=\"troch\u0119 kilka lat temu\">troch\u0119 kilka lat temu<\/a>, ale nie w odniesieniu do Composera.<\/p>\n<p>I w\u0142a\u015bnie temu przyjrzymy si\u0119 w tym po\u015bcie.<\/p>\n<h2>Szablon WordPress Widget: Refaktoryzacja, cz\u0119\u015b\u0107 6<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-refaktoryzacja-czesc-2\/\" title=\"W drugim po\u015bcie z tej serii\">W drugim po\u015bcie z tej serii<\/a> zacz\u0119li\u015bmy rozmawia\u0107 o Composerze. Je\u015bli zapytasz wi\u0119kszo\u015b\u0107 programist\u00f3w PHP (w tym tych, kt\u00f3rzy pracuj\u0105 na WordPressie), prawdopodobnie us\u0142yszysz, \u017ce Composer jest mened\u017cerem pakiet\u00f3w lub mened\u017cerem zale\u017cno\u015bci.<\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, jest to dla nas spos\u00f3b na wprowadzenie bibliotek innych firm do naszego projektu, a nast\u0119pnie wykorzystanie ich funkcji (wi\u0119c nie musimy pisa\u0107 w\u0142asnego kodu, aby to zrobi\u0107).<\/p>\n<p>Ale jest jeszcze jedna funkcja oferowana przez Composer, kt\u00f3ra jest niezwykle u\u017cyteczna, zw\u0142aszcza gdy u\u017cywasz wielu klas i <strong>nie<\/strong> chcesz u\u017cywa\u0107 instrukcji require_once w ca\u0142ym kodzie.<\/p>\n<p>I to jest autoloader.<\/p>\n<h3>Definicja autoloadera<\/h3>\n<p>Prosto z <a href=\"https:\/\/getcomposer.org\/doc\/01-basic-usage.md#autoloading\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instrukcji:<\/a><\/p>\n<blockquote>\n<p>W przypadku bibliotek, kt\u00f3re okre\u015blaj\u0105 informacje o automatycznym \u0142adowaniu, Composer generuje <code>vendor\/autoload.php<\/code>plik. Mo\u017cesz po prostu do\u0142\u0105czy\u0107 ten plik i zacz\u0105\u0107 korzysta\u0107 z klas dostarczanych przez te biblioteki bez dodatkowej pracy:<\/p>\n<\/blockquote>\n<p>Je\u015bli do tej pory \u015bledzi\u0142e\u015b ten kod, zobaczysz, \u017ce faktycznie u\u017cywamy ju\u017c autoloadera wygenerowanego przez Composer.<\/p>\n<p>Najpierw zdefiniowali\u015bmy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">niezb\u0119dn\u0105 konfiguracj\u0119<\/a> :<\/p>\n<pre><code>{\n    \"name\": \"wordpress-widget-boilerplate\/wordpress-widget-boilerplate\",\n    \"description\": \"An organized, maintainable boilerplate for building widgets using WordPress best practices.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"homepage\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@pressware.co\",\n        \"homepage\": \"https:\/\/pressware.co\"\n      }\n    ],\n    \"support\": {\n      \"issues\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/issues\"\n    },\n    \"config\": {\n      \"preferred-install\": \"dist\",\n      \"platform\": {\n          \"php\": \"7.1\"\n      }\n    },\n    \"repositories\": [\n      {\n        \"type\": \"composer\",\n        \"url\": \"https:\/\/wpackagist.org\"\n      }\n    ],\n    \"require\": {\n      \"php\": \"7.1\",\n      \"composer\/installers\": \"^1.4\"\n    },\n    \"require-dev\": {\n        \"friendsofphp\/php-cs-fixer\": \"^2.13.1\",\n        \"jakub-onderka\/php-parallel-lint\": \"^1.0.0\",\n        \"phpmd\/phpmd\": \"^v2.6.0\",\n        \"nikic\/php-parser\": \"^4.0\",\n        \"ocramius\/proxy-manager\": \"^2.0.0\",\n        \"phpro\/grumphp\": \"^0.13.1\"\n    },\n    \"scripts\": {\n      \"test\": [\n        \".\/vendor\/bin\/grumphp run\"\n      ]\n    },\n    \"minimum-stability\": \"stable\"\n  }<\/code><\/pre>\n<p>Nast\u0119pnie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-01-plugin-boostrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zacz\u0119li\u015bmy do\u0142\u0105cza\u0107 go do programu startowego wtyczki<\/a> (kt\u00f3ry doko\u0144czymy dzisiaj):<\/p>\n<pre><code>&lt;?php\n\n\/\/ Include the autoloader.\n\/\/ TODO: Note this has not yet been defined.\nrequire_once __DIR__. '\/inc\/autoload.php';\n<\/code><\/pre>\n<p>Ale tutaj pojawia si\u0119 problem: jak za\u0142adowa\u0107 tylko te klasy, kt\u00f3rych potrzebujemy do dystrybucji?<\/p>\n<p>Innymi s\u0142owy: istnieje wiele bibliotek, kt\u00f3rych u\u017cywamy w fazie rozwoju, aby zapewni\u0107 pisanie wysokiej jako\u015bci kodu zgodnego ze standardami. Ale nie chcemy udost\u0119pnia\u0107 10 MB danych tym, kt\u00f3rzy korzystaj\u0105 z naszego projektu.<\/p>\n<p>Zamiast tego musimy uwzgl\u0119dni\u0107 tylko te pliki, kt\u00f3re s\u0105 wymagane, prawda? Aby to zrobi\u0107, musimy upewni\u0107 si\u0119, \u017ce generujemy autoloader, kt\u00f3ry mo\u017cemy do\u0142\u0105czy\u0107, a kt\u00f3ry w\u0142a\u015bnie to robi.<\/p>\n<p>Najpierw poka\u017c\u0119 ci <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-02-composer-distribution-command-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">polecenie<\/a>, a nast\u0119pnie wyja\u015bni\u0119, co robi:<\/p>\n<pre><code>$ composer install --no-dev --no-ansi --no-interaction --optimize-autoloader --no-progress --prefer-dist<\/code><\/pre>\n<p>To wygeneruje dok\u0142adnie to, czego potrzebujemy, aby nasz projekt dzia\u0142a\u0142 w \u015brodowisku produkcyjnym. Oto, co robi ka\u017cda flaga:<\/p>\n<ul>\n<li><strong>instalacja kompozytora<\/strong>. To po prostu instaluje wszystkie zale\u017cno\u015bci. Je\u015bli masz ju\u017c kilka z nich w katalogu dostawc\u00f3w, usunie to wszystkie opr\u00f3cz tych, kt\u00f3re s\u0105 wymagane.<\/li>\n<li><strong>bez-dev<\/strong>. Uniemo\u017cliwi to Composerowi instalowanie pakiet\u00f3w w sekcji required <strong>-dev<\/strong> swoich plik\u00f3w konfiguracyjnych (mianowicie zale\u017cno\u015bci, kt\u00f3rych u\u017cywamy z GrumPHP).<\/li>\n<li><strong>nie ansi.<\/strong> Zapobiega to wyst\u0119powaniu jakichkolwiek danych wyj\u015bciowych ANSI. Mo\u017cesz nie mie\u0107 ochoty na to, czy nie. Je\u015bli zdecydujesz si\u0119 na jaki\u015b rodzaj automatycznego wdro\u017cenia, u\u017cyj go; w przeciwnym razie mo\u017cna go pomin\u0105\u0107 w poleceniu.<\/li>\n<li><strong>brak interakcji<\/strong>. Jest to kolejna flaga u\u017cywana specjalnie w \u015brodowiskach, w kt\u00f3rych chcesz automatycznie budowa\u0107 projekt i nie musisz anga\u017cowa\u0107 si\u0119 w \u017cadne pytania, wyniki i tym podobne.<\/li>\n<li><strong>zoptymalizuj-autoloader<\/strong>. Kr\u00f3tko m\u00f3wi\u0105c, generuje to szybszy autoloader. Uruchomienie mo\u017ce troch\u0119 potrwa\u0107 w zale\u017cno\u015bci od rozmiaru projektu, ale op\u0142aca si\u0119 to po uruchomieniu pracy.<\/li>\n<li><strong>brak post\u0119pu<\/strong>. Dzi\u0119ki temu pasek post\u0119pu nie b\u0119dzie widoczny w terminalu. Mo\u017cesz naprawd\u0119 chcie\u0107 to zobaczy\u0107, a je\u015bli tak, to \u015bwietnie; jednak niekt\u00f3re \u015brodowiska mog\u0105 nie obs\u0142ugiwa\u0107 dobrze niekt\u00f3rych znak\u00f3w (takich jak Backspace).<\/li>\n<li><strong>preferowana odleg\u0142o\u015b\u0107<\/strong>. Zapewni to, \u017ce pakiety, kt\u00f3re s\u0105 instalowane, s\u0105 wykonywane przy u\u017cyciu wersji dystrybucyjnej (w przeciwie\u0144stwie do czego\u015b, co jest mniej stabilne).<\/li>\n<\/ul>\n<h4>Nadal jeste\u015b zainteresowany?<\/h4>\n<p>Je\u015bli naprawd\u0119 interesuje Ci\u0119 optymalizacja autoloadera dla projekt\u00f3w spoza tego postu, to polecam przeczytanie <a href=\"https:\/\/getcomposer.org\/doc\/articles\/autoloader-optimization.md\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tej strony<\/a> w dokumentacji Composera. To wykracza poza zakres tego, co tutaj robimy, ale mo\u017ce si\u0119 przyda\u0107 w przypadku innej pracy, kt\u00f3r\u0105 wykonujesz teraz lub kt\u00f3r\u0105 wykonujesz w przysz\u0142o\u015bci.<\/p>\n<h2>Jak to wygl\u0105da na p\u0142ycie kot\u0142owej?<\/h2>\n<p>Je\u015bli pracujesz na Boilerplate na lokalnym komputerze, mo\u017cesz zobaczy\u0107 co\u015b takiego:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161015-61e719e23bf2d.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-161015-61e719e23bf2d.png\" alt=\"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 6\"><\/a><\/p>\n<p>Ale je\u015bli uruchomisz powy\u017csze polecenie, zobaczysz co\u015b takiego:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161015-61e719e5afd5a.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-161015-61e719e5afd5a.png\" alt=\"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 6\"><\/a><\/p>\n<p>To du\u017ca r\u00f3\u017cnica, a to ma\u0142y projekt. Wyobra\u017a sobie, \u017ce robisz co\u015b znacznie wi\u0119kszego, co b\u0119dzie dzia\u0142a\u0107 w \u015brodowisku produkcyjnym.<\/p>\n<p>M\u00f3wi\u0105c z do\u015bwiadczenia, mog\u0119 powiedzie\u0107, \u017ce projekty mog\u0105 szybko osi\u0105gn\u0105\u0107 20 MB lub wi\u0119cej zale\u017cno\u015bci, je\u015bli u\u017cywasz r\u00f3\u017cnych bibliotek innych firm do takich rzeczy, jak rejestrowanie, \u017c\u0105dania HTTP i narz\u0119dzia do jako\u015bci kodu.<\/p>\n<h2>Czy uwzgl\u0119dnimy w naszym katalogu dostawc\u00f3w?<\/h2>\n<p>Ludzie cz\u0119sto m\u00f3wi\u0105, \u017ce nie nale\u017cy uwzgl\u0119dnia\u0107 katalogu dostawc\u00f3w w kontroli \u017ar\u00f3de\u0142 i nie bez powodu: mo\u017ce by\u0107 ogromny.<\/p>\n<p>Nawet dokumentacja Composera <a href=\"https:\/\/getcomposer.org\/doc\/faqs\/should-i-commit-the-dependencies-in-my-vendor-directory.md\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m\u00f3wi o tym:<\/a><\/p>\n<blockquote>\n<p>Najlepsz\u0105 praktyk\u0105 jest, aby wszyscy programi\u015bci u\u017cywali Composera do instalowania zale\u017cno\u015bci. Podobnie serwer kompilacji, CI, narz\u0119dzia wdro\u017ceniowe itp. powinny by\u0107 przystosowane do uruchamiania Composera w ramach \u0142adowania pocz\u0105tkowego projektu.<\/p>\n<\/blockquote>\n<p>Wi\u0119c co mamy zrobi\u0107? Potrzebujemy autoloadera i potrzebujemy pewnych zale\u017cno\u015bci, poniewa\u017c nasi u\u017cytkownicy nie b\u0119d\u0105 wiedzie\u0107, jak uruchomi\u0107 (ani nie powinni uruchamia\u0107!) Composera za ka\u017cdym razem, gdy pobieraj\u0105 nasz\u0105 prac\u0119.<\/p>\n<p>Ze wzgl\u0119du na natur\u0119 WordPressa i prac\u0119, kt\u00f3r\u0105 wykonujemy, b\u0119dziemy musieli zatwierdzi\u0107 katalog dostawc\u00f3w, ale tylko z bardzo okre\u015blonymi wymaganiami.<\/p>\n<ol>\n<li>Stworzymy ga\u0142\u0105\u017a, kt\u00f3ra b\u0119dzie u\u017cywana do wydania (tw\u00f3rczo nazwiemy go <strong>wydaniem<\/strong> i mo\u017cemy w razie potrzeby scali\u0107 z nim development)<strong>.<\/strong><\/li>\n<li>Upewnimy si\u0119, \u017ce katalog dostawcy nie jest cz\u0119\u015bci\u0105 pliku gitignore; jednak upewnimy si\u0119, \u017ce katalogi .git w katalogu dostawcy s\u0105 ignorowane (co nadal mo\u017ce zajmowa\u0107 du\u017co miejsca).<\/li>\n<\/ol>\n<p>Zr\u00f3bmy wi\u0119c ka\u017cdy krok i zobaczmy, jak wygl\u0105da, kiedy sko\u0144czymy.<\/p>\n<h3>Tworzenie ga\u0142\u0119zi wydania<\/h3>\n<p>Aby utworzy\u0107 now\u0105 ga\u0142\u0105\u017a z poziomu terminala, wprowad\u017a <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-03-create-a-branch-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nast\u0119puj\u0105ce polecenie<\/a> :<\/p>\n<pre><code>$ git checkout -b release<\/code><\/pre>\n<p>Spowoduje to zabranie ca\u0142ego kodu, nad kt\u00f3rym pracujemy, a nast\u0119pnie utworzenie z nim nowej ga\u0142\u0119zi. Poniewa\u017c b\u0119dzie to ga\u0142\u0105\u017a, kt\u00f3rej u\u017cywamy do dzia\u0142ania jako to, czego b\u0119d\u0105 u\u017cywa\u0107 nasi u\u017cytkownicy (o masterze porozmawiamy <strong>w<\/strong> przysz\u0142ym po\u015bcie).<\/p>\n<p>Najpierw przejrzyj sw\u00f3j plik composer.json i upewnij si\u0119, \u017ce zawiera on nast\u0119puj\u0105ce elementy:<\/p>\n<pre><code>\"autoload\": {\n    \"psr-4\": {\n        \"WordPressWidgetBoilerplate\": \"src\/\",\n        \"WordPressWidgetBoilerplateSubscriber\": \"src\/Subscriber\/\",\n        \"WordPressWidgetBoilerplateUtilities\": \"src\/Utilities\/\",\n        \"WordPressWidgetBoilerplateViews\": \"src\/Views\/\"\n    }\n},<\/code><\/pre>\n<p>Teraz musimy upewni\u0107 si\u0119, \u017ce uruchamiamy powy\u017csze polecenie Composer, aby upewni\u0107 si\u0119, \u017ce nic poza tym, czego potrzebujemy, nie znajduje si\u0119 w\u00a0 katalogu <strong>dostawcy<\/strong>.<\/p>\n<pre><code>$ composer install --no-dev --no-ansi --no-interaction --optimize-autoloader --no-progress --prefer-dist<\/code><\/pre>\n<p>Teraz musimy zaktualizowa\u0107 gitignore.<\/p>\n<h3>Aktualizacja tego, co ignorujemy<\/h3>\n<p>A je\u015bli \u015bledzi\u0142e\u015b zar\u00f3wno seri\u0119, jak i post do tej pory, wiesz, \u017ce b\u0119dzie to wygl\u0105da\u0142o mniej wi\u0119cej tak (mo\u017ce zawiera\u0107 mniej wi\u0119cej, ale powinno zawiera\u0107 przynajmniej to).<\/p>\n<p>Dla mnie wygl\u0105da to <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-05-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>*.DS_Store\n*.log\nwp-config.php\nwp-content\/advanced-cache.php\nwp-content\/backup-db\/\nwp-content\/backups\/\nwp-content\/blogs.dir\/\nwp-content\/cache\/\nwp-content\/upgrade\/\nwp-content\/uploads\/\nwp-content\/mu-plugins\/\nwp-content\/wp-cache-config.php\nwp-content\/plugins\/hello.php\n\n\/.htaccess\n\/license.txt\n\/readme.html\n\/sitemap.xml\n\/sitemap.xml.gz\n\n\/vendor\/**\/.git\n\/vendor\/bin\ncomposer.lock\n<\/code><\/pre>\n<p>W zale\u017cno\u015bci od tego, czy u\u017cywasz terminala, czy klienta, zobaczysz, \u017ce s\u0105 nowe pliki do zatwierdzenia (w szczeg\u00f3lno\u015bci z katalogu dostawcy). Wi\u0119c dodaj je do swojej ga\u0142\u0119zi.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-06-pushing-a-new-branch-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Nast\u0119pnie zatwierd\u017a swoje zmiany<\/a>. Je\u015bli pracujesz w terminalu, mo\u017ce by\u0107 konieczne okre\u015blenie nast\u0119puj\u0105cych danych:<\/p>\n<pre><code>$ git push --set-upstream origin release<\/code><\/pre>\n<p>A dzi\u0119ki temu Tw\u00f3j kod powinien dzia\u0142a\u0107 i by\u0107 dost\u0119pny w GitHub (lub dowolnej us\u0142udze kontroli \u017ar\u00f3d\u0142a, z kt\u00f3rej korzystasz). Mo\u017cesz zobaczy\u0107, co mam dost\u0119pne <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/release\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tutaj<\/a>.<\/p>\n<h2>Dodawanie funkcjonalno\u015bci<\/h2>\n<p>Teraz, gdy mamy ju\u017c wszystkie niezb\u0119dne elementy, nadszed\u0142 czas, aby zacz\u0105\u0107 u\u017cywa\u0107 Composer, autoloadera, naszych klas abstrakcyjnych i naszego rejestru, aby rozpocz\u0105\u0107 dodawanie podstawowych funkcji do WordPress Widget Boilerplate, aby\u015bmy mieli co\u015b do pokazania w naszej pracy .<\/p>\n<p>Dla tych, kt\u00f3rzy s\u0105 ciekawi, w tej chwili planuj\u0119 uporz\u0105dkowanie oddzia\u0142\u00f3w w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li><strong>master<\/strong> b\u0119dzie dost\u0119pny dla ka\u017cdego i ka\u017cdego, kto chce zbudowa\u0107 widget WordPress,<\/li>\n<li><strong>development<\/strong> jest przeznaczony wy\u0142\u0105cznie dla programist\u00f3w, w tym tych, kt\u00f3rzy wiedz\u0105, jak korzysta\u0107 z Composera i temat\u00f3w poruszanych w tym po\u015bcie,<\/li>\n<li><strong>wydanie<\/strong> jest tym, co zostanie u\u017cyte do udost\u0119pnienia dzia\u0142aj\u0105cego demo.<\/li>\n<\/ul>\n<p>Na razie jednak przejrzyj, co jest om\u00f3wione w tym po\u015bcie, a wznowimy to w nast\u0119pnym po\u015bcie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mamy problem z przestrzeniami nazw i automatycznym \u0142adowaniem i w\u0142a\u015bnie temu zajmiemy si\u0119 w tym po\u015bcie.<\/p>\n","protected":false},"author":1,"featured_media":223641,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721],"tags":[1169],"class_list":["post-230698","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230698","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=230698"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230698\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223641"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}