{"id":230805,"date":"2022-12-20T18:21:00","date_gmt":"2022-12-20T15:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230805"},"modified":"2022-12-07T10:15:43","modified_gmt":"2022-12-07T07:15:43","slug":"widzety-wordpress-refaktoryzacja-czesc-12","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-refaktoryzacja-czesc-12\/","title":{"rendered":"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 12"},"content":{"rendered":"\n<p>Je\u015bli chodzi o refaktoryzacj\u0119 WordPress Widget Boilerplate \u2013 zw\u0142aszcza bior\u0105c pod uwag\u0119, jak daleko zaszli\u015bmy od pocz\u0105tku projektu osiem lat temu \u2013 wykonali\u015bmy du\u017co pracy.<\/p>\n<p>Podnie\u015bli\u015bmy go do znacznie bardziej nowoczesnego standardu i znacznie u\u0142atwiamy prac\u0119 z nim, dzi\u0119ki czemu tworzenie przysz\u0142ych wid\u017cet\u00f3w powinno by\u0107 \u0142atwiejsze. I to nie tylko ze standardu wzorcowego, ale ze standardu zorientowanego obiektowo, dzi\u0119ki czemu obs\u0142uga i jako\u015b\u0107 kodu jest wy\u017csza.<\/p>\n<p>W ostatnim po\u015bcie zako\u0144czyli\u015bmy wi\u0119kszo\u015b\u0107 pracy w obszarze administracyjnym i jeste\u015bmy gotowi do rozpocz\u0119cia pracy nad kodem dla front-endu.<\/p>\n<p>Powiedzieli\u015bmy:<\/p>\n<blockquote>\n<p>Nast\u0119pnie przyjrzymy si\u0119 renderowaniu tre\u015bci na interfejsie u\u017cytkownika. Zbli\u017camy si\u0119 do ko\u0144ca refaktoryzacji Boilerplate, ale jest jeszcze troch\u0119 do zrobienia, zanim b\u0119dziemy gotowi do scalenia go z g\u0142\u00f3wn\u0105 ga\u0142\u0119zi\u0105 bazy kodu.<\/p>\n<\/blockquote>\n<p>Wi\u0119c w tym po\u015bcie zamierzamy tam odebra\u0107. Teraz, je\u015bli pod\u0105\u017ca\u0142e\u015b do tego momentu, powiniene\u015b mie\u0107 wszystko, czego potrzebujesz z ga\u0142\u0119zi deweloperskiej.<\/p>\n<p>Je\u015bli nie, pami\u0119taj, aby go wyci\u0105gn\u0105\u0107, poniewa\u017c to w\u0142a\u015bnie tam zamierzamy odebra\u0107 w pozosta\u0142ej cz\u0119\u015bci posta.<\/p>\n<h2>WordPress Widget Boilerplate: Refaktoryzacja Cz\u0119\u015b\u0107 12<\/h2>\n<p>Teraz, je\u015bli chodzi o front-end, \u0142atwo jest my\u015ble\u0107 o nim jako o wszystkim, co u\u017cytkownik widzi przed sob\u0105, niezale\u017cnie od tego, czy znajduje si\u0119 w obszarze administracyjnym, czy nie.<\/p>\n<p>Jednak z tej serii jasno wynika, \u017ce \u200b\u200bdzielimy to, co widzi u\u017cytkownik, mi\u0119dzy obszar administracyjny i publiczny obszar witryny.<\/p>\n<p>Zamierzamy wi\u0119c pracowa\u0107 nad obszarem kodu, kt\u00f3ry renderuje informacje dla u\u017cytkownika w publicznym obszarze witryny. Zaczniemy od prostego przeczytania informacji i wy\u015bwietlenia ich.<\/p>\n<p>Nast\u0119pnie w nast\u0119pnym po\u015bcie przyjrzymy si\u0119 pracy z logik\u0105 warunkow\u0105 w odniesieniu do niekt\u00f3rych opcji, aby sprawdzi\u0107, czy jest co\u015b, co musimy zrobi\u0107.<\/p>\n<p>Powiedziawszy to, przejd\u017amy do kodu.<\/p>\n<h3>O danych, kt\u00f3re b\u0119dziemy wy\u015bwietla\u0107<\/h3>\n<p>Pami\u0119taj, \u017ce w tym momencie wid\u017cet ma trzy rzeczy, kt\u00f3re wp\u0142ywaj\u0105 na jego wy\u015bwietlanie:<\/p>\n<ol>\n<li>tytu\u0142 wid\u017cetu,<\/li>\n<li>zawarto\u015b\u0107 wid\u017cetu,<\/li>\n<li>prze\u0142\u0105cznik okre\u015blaj\u0105cy, czy powinni\u015bmy wy\u015bwietla\u0107 tytu\u0142<\/li>\n<\/ol>\n<p>Trzecia opcja to przede wszystkim pokazanie, jak u\u017cywa\u0107 innego typu elementu. Poniewa\u017c, technicznie rzecz bior\u0105c, je\u015bli nie chcieliby\u015bmy pokazywa\u0107 tytu\u0142u wid\u017cetu, po prostu nie umie\u015bciliby\u015bmy niczego w wid\u017cecie.<\/p>\n<p>Ale my\u015bl\u0119, \u017ce pomaga pokaza\u0107, jak u\u017cywa\u0107 r\u00f3\u017cnych typ\u00f3w element\u00f3w i ich warto\u015bci w praktyczny (lub p\u00f3\u0142praktyczny) spos\u00f3b.<\/p>\n<p>W ka\u017cdym razie, maj\u0105c to na uwadze, wiemy, \u017ce dla ka\u017cdego wyst\u0105pienia wid\u017cetu dane s\u0105 przechowywane wraz z <strong>tytu\u0142em<\/strong>, <strong>tre\u015bci\u0105<\/strong> oraz\u00a0 nazw\u0105 <strong>wy\u015bwietlanego tytu\u0142u<\/strong> i identyfikatorami dostarczonymi przez WordPress.<\/p>\n<p>W zwi\u0105zku z tym b\u0119dziemy u\u017cywa\u0107 ich w naszym kodzie frontonu do wy\u015bwietlania warto\u015bci.<\/p>\n<h3>Przygotowanie funkcji wy\u015bwietlania<\/h3>\n<p>Zazwyczaj\u00a0 funkcja <strong>wid\u017cetu<\/strong> odpowiada za wy\u015bwietlanie danych wyj\u015bciowych wid\u017cetu. Ale jedn\u0105 z rzeczy, kt\u00f3re starali\u015bmy si\u0119 zrobi\u0107, jest oddzielenie problem\u00f3w naszego wid\u017cetu na bardziej skoncentrowany zestaw klas i funkcji.<\/p>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 chcemy zrobi\u0107, to napisa\u0107\u00a0 klas\u0119 <strong>WidgetDisplay<\/strong>, kt\u00f3ra b\u0119dzie odpowiedzialna za, jak na pewno wida\u0107, wy\u015bwietlanie zawarto\u015bci wid\u017cetu.<\/p>\n<p>Na razie b\u0119dzie to bezwarunkowo zawiera\u0107 tytu\u0142, tre\u015b\u0107 i warto\u015b\u0107, czy tytu\u0142 ma by\u0107 uwzgl\u0119dniony. WordPress udost\u0119pnia r\u00f3wnie\u017c pewne tre\u015bci, takie jak znaczniki, kt\u00f3re powinny pojawia\u0107 si\u0119 przed wid\u017cetem i po wid\u017cecie, wi\u0119c upewnimy si\u0119, \u017ce r\u00f3wnie\u017c je uwzgl\u0119dnimy.<\/p>\n<p>Ale najpierw po prostu <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-00-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">odetnijmy klas\u0119<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplateWordPress;\n\nclass WidgetDisplay\n{\n  private $widgetSlug;\n\n  public function __construct(string $widgetSlug)\n  {\n      $this-&gt;widgetSlug = $widgetSlug;\n  }\n\n  public function show($args, $instance)\n  {\n    \/\/ More to come\n  }\n}\n<\/code><\/pre>\n<p>Nast\u0119pnie musimy si\u0119 upewni\u0107, \u017ce zapisujemy to r\u00f3wnie\u017c innym klasom. Najpierw upewnimy si\u0119, \u017ce umie\u015bcimy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-01-widget-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">go w naszej klasie Widget<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function widget($args, $instance)\n{\n    return $this-&gt;widgetDisplay-&gt;show($args, $instance);\n}<\/code><\/pre>\n<p>A potem <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-02-widget-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dodamy go do klasy WidgetAdmin<\/a> (poniewa\u017c tutaj znajduj\u0105 si\u0119 podstawowe funkcje Widget API \u2013 po prostu deleguje odpowiedzialno\u015b\u0107 do odpowiedniej klasy):<\/p>\n<pre><code>&lt;?php\n\npublic function __construct($widgetSlug)\n{\n    parent::__construct($widgetSlug);\n    $this-&gt;widgetSerializer = new WidgetSerializer($this-&gt;getWidgetSlug());\n    $this-&gt;widgetDisplay = new WidgetDisplay($this-&gt;getWidgetSlug());\n}<\/code><\/pre>\n<p>W tej chwili nie wy\u015bwietlamy jeszcze niczego. Jeste\u015bmy blisko i wkr\u00f3tce si\u0119 na tym skupimy.<\/p>\n<h3>Wy\u015bwietlanie danych<\/h3>\n<p>Zak\u0142adaj\u0105c, \u017ce jeste\u015b w stanie doda\u0107 powy\u017cszy kod bez b\u0142\u0119d\u00f3w, czas wy\u015bwietli\u0107 zawarto\u015b\u0107 wid\u017cetu.<\/p>\n<p>Mo\u017cemy to zrobi\u0107 na wiele sposob\u00f3w, od prostego <strong>var_dump<\/strong> do rzeczywistej pracy nad wy\u015bwietlaniem tre\u015bci w bardziej przyjazny dla u\u017cytkownika spos\u00f3b. A ja jestem o wiele bardziej fanem tego drugiego.<\/p>\n<p>Wi\u0119c zr\u00f3bmy to.<\/p>\n<p>W\u00a0 funkcji <strong>show<\/strong> swojej\u00a0 klasy <strong>WidgetDisplay<\/strong> dodaj <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-04-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nast\u0119puj\u0105cy kod<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function show($args, $instance)\n{\n    include_once 'Views\/Widget.php';\n}<\/code><\/pre>\n<p>A potem widok szablonu mo\u017ce by\u0107 tak prosty <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jak ten<\/a> :<\/p>\n<pre><code>&lt;div id=\"&lt;?php echo $args['id']; ?&gt;\"&gt;\n    &lt;h3 class=\"widget-title\"&gt;&lt;?php echo $instance['title']; ?&gt;&lt;\/h3&gt;\n    &lt;p&gt;&lt;?php echo $instance['content']; ?&gt;&lt;\/p&gt;\n    &lt;pre&gt;&lt;?php echo $instance['display-title']; ?&gt;&lt;\/pre&gt;\n&lt;\/div&gt;&lt;!-- #&lt;?php echo $args['id']; ?&gt;--&gt;<\/code><\/pre>\n<p>Zapewni to prawid\u0142owe renderowanie wszystkich tre\u015bci poprzedzaj\u0105cych wid\u017cet, tre\u015bci wid\u017cetu i tre\u015bci.<\/p>\n<p>Ponownie, pami\u0119taj, \u017ce wy\u015bwietlamy niekt\u00f3re tre\u015bci, kt\u00f3re nie b\u0119d\u0105 w ostatecznej wersji tego, ale jeste\u015bmy blisko i zajmiemy si\u0119 tym w nast\u0119pnym po\u015bcie.<\/p>\n<p>Polecam bawi\u0107 si\u0119\u00a0 opcj\u0105 <strong>Wy\u015bwietl tytu\u0142<\/strong>, aby zobaczy\u0107, jak renderuje si\u0119 na interfejsie u\u017cytkownika, bior\u0105c pod uwag\u0119 dostarczone przez nas znaczniki.<\/p>\n<p>Na razie wyj\u015bcie wid\u017cetu powinno wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160763-61e7125f80aab.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-160763-61e7125f80aab.png\" alt=\"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 12\" ><\/a><\/p>\n<p>Ale to wszystko, co mo\u017cna om\u00f3wi\u0107 w tym po\u015bcie.<\/p>\n<h2>Do ostatecznego refaktora<\/h2>\n<p>Ostatni\u0105 rzecz\u0105, na kt\u00f3r\u0105 spojrzymy po tym, jest zaostrzenie niekt\u00f3rych logiki warunkowej wraz ze s\u0142owem o buforowaniu danych (poniewa\u017c robili\u015bmy ju\u017c troch\u0119 tego we wcze\u015bniejszych postach).<\/p>\n<p>Na razie jednak mo\u017cesz swobodnie bawi\u0107 si\u0119 tym, co mamy tutaj, wraz z kodem, kt\u00f3rego nie uwzgl\u0119dnili\u015bmy (na przyk\u0142ad tym, co mo\u017ce by\u0107 wy\u015bwietlane przed lub po wid\u017cecie.<\/p>\n<p>Zosta\u0142y one celowo pomini\u0119te w tym przyk\u0142adzie, ale nie zawsze mog\u0105 zosta\u0107 pomini\u0119te w zale\u017cno\u015bci od pracy, kt\u00f3r\u0105 wykonujesz.<\/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>Zamierzamy pracowa\u0107 nad obszarem kodu, kt\u00f3ry wy\u015bwietla informacje dla u\u017cytkownika w publicznym obszarze witryny.<\/p>\n","protected":false},"author":1,"featured_media":234984,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,845,866],"tags":[1169],"class_list":["post-230805","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230805","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=230805"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230805\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/234984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}