{"id":230447,"date":"2022-12-13T13:35:00","date_gmt":"2022-12-13T10:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230447"},"modified":"2022-12-13T13:37:32","modified_gmt":"2022-12-13T10:37:32","slug":"widzety-wordpress-podejscie-obiektowe","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-podejscie-obiektowe\/","title":{"rendered":"Wid\u017cety WordPress: podej\u015bcie obiektowe"},"content":{"rendered":"\n<p>Wiele lat temu stworzy\u0142em <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong>, kt\u00f3ry mia\u0142 by\u0107 nast\u0119puj\u0105cy:<\/p>\n<blockquote>\n<p>Zorganizowany, \u0142atwy w utrzymaniu schemat do tworzenia wid\u017cet\u00f3w przy u\u017cyciu najlepszych praktyk WordPressa.<\/p>\n<\/blockquote>\n<p>Od tego czasu niewiele si\u0119 zmieni\u0142o w odniesieniu do <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API<\/a><\/strong> (kt\u00f3remu przyjrzymy si\u0119 w dalszej cz\u0119\u015bci tego postu), ale zmieni\u0142o si\u0119 to, co uwa\u017cam za \u201enajlepsze praktyki&quot;. przyk\u0142ad wprowadzaj\u0105cego programowania obiektowego w WordPressie jest wysoki.<\/p>\n<p>Nie dlatego, \u017ce u\u017cywa wielu zasad zorientowanych obiektowo, nie dlatego, \u017ce u\u017cywa nowoczesnych standard\u00f3w (przynajmniej je\u015bli chodzi o wsp\u00f3\u0142czesne PHP), ale dlatego, \u017ce u\u017cywa kilku rzeczy, kt\u00f3re pomagaj\u0105 nam rozpozna\u0107 kilka, powiedzmy, sygna\u0142y dotycz\u0105ce programowania obiektowego w WordPressie.<\/p>\n<p>I to jest co\u015b, czego nie nale\u017cy lekcewa\u017cy\u0107: je\u015bli szukasz przyk\u0142ad\u00f3w programowania obiektowego w WordPressie, poszukaj interfejs\u00f3w API, kt\u00f3re go wykorzystuj\u0105.<\/p>\n<p>Co wi\u0119cej, je\u015bli szukasz sposob\u00f3w na ocen\u0119 w\u0142asnego poziomu oceny fragmentu kodu (nie m\u00f3wi\u0105c ju\u017c o bazie kodu) pod k\u0105tem u\u017cycia klas i niekt\u00f3rych bardziej zaawansowanych funkcji OOP, to dlaczego nie mie\u0107 jakiego\u015b papierku lakmusowego, aby zobaczy\u0107, jak si\u0119 masz?<\/p>\n<\/p>\n<p>A Widgets API w\u0142a\u015bnie to robi.<\/p>\n<h2>Wid\u017cety WordPress: wprowadzenie<\/h2>\n<p>Wi\u0119c w mniejszej serii ni\u017c moja ostatnia, zamierzam przyjrze\u0107 si\u0119 API Widgets i zrobi\u0107 kilka rzeczy:<\/p>\n<ol>\n<li>pokaza\u0107 podstawowy szkielet wid\u017cetu i dlaczego jest zorientowany obiektowo,<\/li>\n<li>przedyskutuj, jakie rzeczy powiniene\u015b by\u0107 w stanie zauwa\u017cy\u0107 i dlaczego,<\/li>\n<li>najpierw zaktualizuj Widget Boilerplate bezpo\u015brednio na tej stronie, a nast\u0119pnie wy\u015blij go do GitHub,<\/li>\n<li>zbuduj widget wykorzystuj\u0105c API z boilerplate jako fundament naszej pracy.<\/li>\n<\/ol>\n<p>W tym po\u015bcie zaczniemy od pierwszego punktu powy\u017cej.<\/p>\n<h3>Ale najpierw\u2026<\/h3>\n<p>Zanim przejd\u0119 do tego postu, polecam przeczytanie nast\u0119puj\u0105cych post\u00f3w:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 1 z 2\">Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 1 z 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/drugie-dwa-filary-oop\/\" title=\"Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 2 z 2\">Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 2 z 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/klasy-abstrakcyjne-czesc-1-zachowanie-abstrakcji\/\" title=\"Klasy abstrakcyjne, cz\u0119\u015b\u0107 1 \u2013 zachowanie abstrakcji\">Klasy abstrakcyjne, cz\u0119\u015b\u0107 1 \u2013 zachowanie abstrakcji<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/klasy-abstrakcyjne-czesc-2-klasy-abstrakcyjne-i-interfejsy\/\" title=\"Klasy abstrakcyjne, cz\u0119\u015b\u0107 2 \u2013 Klasy abstrakcyjne i interfejsy\">Klasy abstrakcyjne, cz\u0119\u015b\u0107 2 \u2013 Klasy abstrakcyjne i interfejsy<\/a><\/strong><\/li>\n<\/ol>\n<p>Po zako\u0144czeniu (lub je\u015bli czujesz, \u017ce ju\u017c znasz tematy), jeste\u015bmy gotowi do pracy.<\/p>\n<p>[ogranicz p\u0142atne=&#8221;prawda&#8221;]<\/p>\n<h2>Podstawy API wid\u017cet\u00f3w<\/h2>\n<p>Je\u015bli przeczytasz stron\u0119 podr\u0119cznika na temat wid\u017cet\u00f3w, zobaczysz du\u017co tre\u015bci. To dobra rzecz, ale nie zawsze jest to najlepszy ruch, gdy pr\u00f3bujesz destylowa\u0107 tre\u015b\u0107 do odbiorc\u00f3w takich jak ty, gdy szukasz praktycznych, zorientowanych na przedmiot porady.<\/p>\n<p>Wybior\u0119 wi\u0119c odpowiednie cz\u0119\u015bci z dokumentacji API, a nast\u0119pnie zastosuj\u0119 je do dostarczonego przez nas kodu.<\/p>\n<h3>Co to jest wid\u017cet?<\/h3>\n<p>My\u015bl\u0119, \u017ce wi\u0119kszo\u015b\u0107 z nas, kt\u00f3rzy pracuj\u0105 z WordPressem, wie, czym jest wid\u017cet, ale wa\u017cne jest, aby zdefiniowa\u0107 ten termin, wi\u0119c wszyscy pracujemy nad tym samym pomys\u0142em. <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">W podr\u0119czniku czytamy:<\/a><\/strong><\/p>\n<blockquote>\n<p>Wid\u017cet to obiekt PHP, kt\u00f3ry generuje kod HTML. Ten sam rodzaj wid\u017cetu mo\u017ce by\u0107 u\u017cywany wielokrotnie na tej samej stronie (np. wid\u017cet tekstowy). Widgety mog\u0105 zapisywa\u0107 dane w bazie danych (w tabeli opcji).<\/p>\n<\/blockquote>\n<p>Maj\u0105c to na miejscu, sp\u00f3jrzmy na kod niestandardowego wid\u017cetu, przynajmniej jego fragment, i zobaczmy, co mo\u017cemy zebra\u0107, je\u015bli chodzi o jego obiektow\u0105 natur\u0119.<\/p>\n<h3>Klasa wid\u017cet\u00f3w<\/h3>\n<p>Zanim jeszcze spojrzymy na kod, wiemy, \u017ce b\u0119dzie pewien poziom programowania obiektowego, poniewa\u017c dokumentacja m\u00f3wi nam, aby\u015bmy zrobili trzy rzeczy:<\/p>\n<ol>\n<li>Utw\u00f3rz klas\u0119 wid\u017cetu, rozszerzaj\u0105c standardow\u0105 klas\u0119 <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a> i niekt\u00f3re z jej funkcji.<\/li>\n<li>Zarejestruj wid\u017cet, aby by\u0142 dost\u0119pny na ekranie <strong>Wid\u017cety<\/strong>.<\/li>\n<li>Upewnij si\u0119, \u017ce Tw\u00f3j motyw ma co najmniej jeden <strong><a href=\"https:\/\/make.wordpress.org\/docs\/theme-developer-handbook\/theme-functionality\/sidebars\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">obszar wid\u017cet\u00f3w,<\/a><\/strong> w kt\u00f3rym mo\u017cna je doda\u0107.<\/li>\n<\/ol>\n<p>W tym po\u015bcie skupi\u0119 si\u0119 na pierwszym punkcie (chocia\u017c w ko\u0144cu dowiemy si\u0119, jak wprowadzamy nasze wid\u017cety do motywu przed zako\u0144czeniem serii).<\/p>\n<p>U\u0142\u00f3\u017cmy wi\u0119c <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kod<\/a><\/strong> tak, jak jest przedstawiony w dokumentacji i porozmawiajmy o tym, czego mo\u017cemy si\u0119 z niego nauczy\u0107:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Po pierwsze, zauwa\u017camy, \u017ce chocia\u017c zdefiniowali\u015bmy klas\u0119 (kt\u00f3r\u0105 mo\u017cemy nazwa\u0107 jak tylko chcemy, na sw\u00f3j spos\u00f3b), musi ona rozszerza\u0107 <strong>WP_Widget<\/strong>. Oznacza to, \u017ce w rdzeniu WordPressa znajduje si\u0119 klasa <strong>WP_Widget<\/strong>. Na tej stronie mo\u017cesz zobaczy\u0107 dobrze zorganizowany podzia\u0142 kodu \u017ar\u00f3d\u0142owego <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-widget.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">.<\/a><\/strong><\/p>\n<p>Po drugie, s\u0142owo kluczowe <strong>extends<\/strong> wskazuje, \u017ce u\u017cywamy <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dziedziczenia PHP<\/a><\/strong>, kt\u00f3re jest podstawowym filarem programowania obiektowego.<\/p>\n<p>Po trzecie, s\u0105 cztery funkcje, kt\u00f3re musimy zaimplementowa\u0107, z kt\u00f3rych dwie wymagaj\u0105 argument\u00f3w. Funkcje, kt\u00f3re musimy zaimplementowa\u0107 to:<\/p>\n<ul>\n<li><strong>__construct()<\/strong>, kt\u00f3ry jest podstawowym konstruktorem klasy. W tym miejscu musimy upewni\u0107 si\u0119, \u017ce wywo\u0142any zostanie konstruktor klasy nadrz\u0119dnej, je\u015bli taki istnieje, a nast\u0119pnie zainicjowa\u0107 wszystkie w\u0142a\u015bciwo\u015bci, kt\u00f3re uznamy za niezb\u0119dne dla naszego wid\u017cetu. Przyjrzymy si\u0119 temu w dalszej cz\u0119\u015bci serii.<\/li>\n<li><strong>widget()<\/strong> odpowiada za wy\u015bwietlanie zawarto\u015bci wid\u017cetu udost\u0119pnianego przez u\u017cytkownika za pomoc\u0105 interfejsu w obszarze administracyjnym. Przyjmuje dwa parametry \u2014 <strong>$args<\/strong> i <strong>$instance.<\/strong> Parametr <strong>$args<\/strong> to informacje, kt\u00f3re maj\u0105 by\u0107 renderowane na stronie, a <strong>$instance<\/strong> to odwo\u0142anie do instancji wid\u017cetu (poniewa\u017c wiele wid\u017cet\u00f3w mo\u017ce by\u0107 renderowanych na stronie).<\/li>\n<li><strong>form()<\/strong> wy\u015bwietla interfejs administracyjny, z kt\u00f3rym u\u017cytkownik wchodzi w interakcj\u0119, aby kierowa\u0107 tym, co jest wy\u015bwietlane w interfejsie witryny. Wymaga r\u00f3wnie\u017c argumentu <strong>$instance<\/strong>, wi\u0119c podane informacje dotycz\u0105 rzeczywistego wid\u017cetu, z kt\u00f3rym pracuje u\u017cytkownik (w przeciwie\u0144stwie do wszystkich wyst\u0105pie\u0144 wid\u017cetu).<\/li>\n<li><strong>update()<\/strong> s\u0142u\u017cy do zapisywania warto\u015bci w bie\u017c\u0105cej instancji wid\u017cetu. Przyjmuje dwa argumenty. Pierwszym z nich jest nowa instancja wid\u017cetu z warto\u015bciami aktualizacji, kt\u00f3re poda\u0142 u\u017cytkownik (pomy\u015bl o aktualizacji warto\u015bci aktywnego wid\u017cetu tekstowego), a drugim argumentem jest stara instancja wid\u017cetu lub mo\u017ce poprzednia instancja, a mo\u017ce \u201e instancja, kt\u00f3ra posiada\u0142a poprzednie warto\u015bci&#8221;.<\/li>\n<\/ul>\n<p>Te cztery funkcje s\u0105 wymagane do zaimplementowania jako cz\u0119\u015b\u0107 Widget API, jako cz\u0119\u015b\u0107 dziedziczenia funkcji z rozszerzonego interfejsu oraz do stworzenia podstawowej funkcjonalno\u015bci widgetu.<\/p>\n<p>Nie oznacza to, \u017ce nie mo\u017cna doda\u0107 wi\u0119cej, ale w dobrym zorientowaniu obiektowym prawdopodobnie najlepiej by\u0142oby przenie\u015b\u0107 to zachowanie do innych klas. Ale przyjrzymy si\u0119 temu w dalszej cz\u0119\u015bci serii, kiedy tworzymy w\u0142asny wid\u017cet.<\/p>\n<h3>Jakie s\u0105 kluczowe dania na wynos?<\/h3>\n<p>Aby upewni\u0107 si\u0119, \u017ce mam jasno\u015b\u0107 co do tego, co zostanie zrozumiane z tego postu, oto:<\/p>\n<ul>\n<li>Widgets API jest zorientowany obiektowo. Jest nie tylko zorientowany obiektowo, poniewa\u017c u\u017cywa klasy (cho\u0107 jest to z pewno\u015bci\u0105 dobry punkt wyj\u015bcia), ale tak\u017ce dlatego, \u017ce dziedziczy funkcjonalno\u015b\u0107 wbudowanej w istniej\u0105c\u0105 wcze\u015bniej klas\u0119 bazow\u0105.<\/li>\n<li>Ilekro\u0107 dziedziczymy zachowanie z klasy bazowej lub klasy nadrz\u0119dnej, otrzymujemy wst\u0119pnie opracowan\u0105 funkcjonalno\u015b\u0107 za darmo. To naprawd\u0119 \u015bwietna rzecz w programowaniu obiektowym, poniewa\u017c pozwala nam skupi\u0107 si\u0119 konkretnie na logice programowania, kt\u00f3r\u0105 chcemy zaimplementowa\u0107.<\/li>\n<\/ul>\n<p>Wyobra\u017a sobie przez chwil\u0119, \u017ce chcesz stworzy\u0107 wid\u017cet, ale za ka\u017cdym razem, gdy to robisz, musisz napisa\u0107 wszystkie funkcje, aby podpi\u0105\u0107 si\u0119 do WordPressa, aby wykona\u0107 t\u0119 sam\u0105, powtarzaln\u0105 funkcjonalno\u015b\u0107 szablonow\u0105.<\/p>\n<p>W tym miejscu w gr\u0119 wchodzi dziedziczenie i programowanie obiektowe. Powtarzaj\u0105cy si\u0119 kod jest abstrahowany do klasy bazowej, wi\u0119c jest pisany tylko raz, a nast\u0119pnie kod, na kt\u00f3rym chcemy si\u0119 skupi\u0107, pozostawiamy do zaimplementowania.<\/p>\n<p>Wszystko powy\u017csze nale\u017cy rozumie\u0107, czytaj\u0105c ten wst\u0119pny fragment w kodzie \u017ar\u00f3d\u0142owym podstawowego, obiektowego interfejsu API w WordPress.<\/p>\n<h2>Co dalej?<\/h2>\n<p>W nast\u0119pnym po\u015bcie z tej serii przyjrzymy si\u0119 obiektowej naturze API wid\u017cet\u00f3w i tym, jakie rzeczy powiniene\u015b by\u0107 w stanie natychmiast wykry\u0107, czytaj\u0105c kod.<\/p>\n<p>Dzieje si\u0119 tak, poniewa\u017c wa\u017cne jest, aby w praktyce rozpozna\u0107 pewne zasady zorientowane obiektowo i jest to dobry spos\u00f3b, aby oceni\u0107, czy jeste\u015b w stanie to zrobi\u0107, czy nie. Je\u015bli tak, to \u015bwietnie! Wtedy b\u0119dzie nadal pomaga\u0142 rozwija\u0107 ten mi\u0119sie\u0144. Je\u015bli nie, nie martw si\u0119 \u2013 to i tak pomaga ci rozwija\u0107 mi\u0119\u015bnie.<\/p>\n<p>I b\u0119dzie ci to dobrze s\u0142u\u017cy\u0107, poniewa\u017c nadal b\u0119dziemy coraz bardziej anga\u017cowa\u0107 si\u0119 w programowanie obiektowe WordPress za pomoc\u0105 praktycznych \u015brodk\u00f3w.<\/p>\n<p>Niezb\u0119dna teoria zosta\u0142a om\u00f3wiona. Zacznijmy wi\u0119c od praktycznego zastosowania tego.<\/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>WordPress Widgets API pomaga zapewni\u0107 solidny test lakmusowy i przyk\u0142ad, jak rozpocz\u0105\u0107 programowanie obiektowe w WordPressie.<\/p>\n","protected":false},"author":1,"featured_media":236133,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,866],"tags":[1169],"class_list":["post-230447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230447","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=230447"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230447\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236133"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}