{"id":230867,"date":"2022-12-22T18:22:00","date_gmt":"2022-12-22T15:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230867"},"modified":"2022-12-22T18:26:17","modified_gmt":"2022-12-22T15:26:17","slug":"widzety-wordpress-refaktoryzacja-czesc-13","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-refaktoryzacja-czesc-13\/","title":{"rendered":"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 13"},"content":{"rendered":"\n<p>W ko\u0144cu jeste\u015bmy w ostatnim po\u015bcie z serii o refaktoryzacji WordPress Widget Boilerplate. Pod koniec tego posta b\u0119dziemy mie\u0107 sko\u0144czon\u0105 ga\u0142\u0105\u017a dewelopersk\u0105 naszego kodu i b\u0119dziemy gotowi do scalenia wszystkiego w ga\u0142\u0105\u017a master.<\/p>\n<p>Jest jednak jeszcze troch\u0119 do zrobienia. <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-refaktoryzacja-czesc-12\/\" title=\"Mianowicie\">Mianowicie<\/a> :<\/p>\n<blockquote>\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<\/blockquote>\n<p>To s\u0105 dwie rzeczy, kt\u00f3rym b\u0119dziemy si\u0119 przygl\u0105da\u0107 w tym po\u015bcie. W szczeg\u00f3lno\u015bci przyjrzymy si\u0119 obs\u0142udze logiki warunkowej dla frontonu, a nast\u0119pnie jak zaimplementowa\u0107 podstawowe buforowanie.<\/p>\n<h2>Szablon WordPress Widget: Refaktoryzacja, cz\u0119\u015b\u0107 13<\/h2>\n<p>Zanim przejdziemy do ostatniej rundy szczeg\u00f3\u0142\u00f3w, chc\u0119 si\u0119 upewni\u0107, \u017ce korzystasz <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z najnowszej wersji kodu<\/a>, poniewa\u017c jest to jedyny raz, kiedy uwa\u017cam, \u017ce konieczne jest przygotowanie kodu do ostatniej rundy zmian.<\/p>\n<p>Wi\u0119c je\u015bli nie masz kodu uruchomionego na swoim komputerze, nadszed\u0142 czas. Ostatni fragment kodu, nad kt\u00f3rym musimy popracowa\u0107, jest do\u015b\u0107 ma\u0142y.<\/p>\n<p>Ale wa\u017cne jest, aby upewni\u0107 si\u0119, \u017ce korzystasz z najnowszej wersji. Wi\u0119c kiedy ju\u017c zrobisz pobranie najnowszego kodu, jeste\u015bmy gotowi, aby to zako\u0144czy\u0107.<\/p>\n<h3>1 Renderowanie front-endu<\/h3>\n<p>Przypomnijmy w poprzednim po\u015bcie, \u017ce wyrenderowali\u015bmy og\u00f3lne informacje o wid\u017cecie \u2013 tytu\u0142, tre\u015b\u0107 i czy tytu\u0142 powinien by\u0107 wy\u015bwietlany \u2013 po prostu wy\u015bwietlaj\u0105c warto\u015bci na interfejsie u\u017cytkownika.<\/p>\n<p>Ale teraz nadszed\u0142 czas, aby skonfigurowa\u0107 informacje, aby upewni\u0107 si\u0119, \u017ce nie tylko b\u0119dziemy renderowa\u0107 informacje na podstawie opcji w obszarze administracyjnym wid\u017cetu, ale tak\u017ce czy w og\u00f3le s\u0105 jakie\u015b informacje.<\/p>\n<p>Zaczniemy wi\u0119c od najprostszej opcji: opcji, kt\u00f3ra pozwala nam prze\u0142\u0105cza\u0107, czy tytu\u0142 jest wy\u015bwietlany. Innymi s\u0142owy, za\u0142o\u017cymy, \u017ce warto\u015bci s\u0105 wype\u0142nione, a opcja jest zaznaczona w backendzie.<\/p>\n<p>Przypomnijmy,\u00a0 plik <strong>Widget.php<\/strong> obecnie wygl\u0105da <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f6bbe19253188596f804a7c211d9cd5#file-00-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n?&gt;\n&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;\n<\/code><\/pre>\n<p>Wi\u0119c najpierw dokonamy refaktoryzacji tej cz\u0119\u015bci. Oczywi\u015bcie jest to stosunkowo \u0142atwe do wprowadzenia, prawda? Oznacza to, \u017ce logika wygl\u0105da tak:<\/p>\n<ul>\n<li>Je\u015bli zaznaczona jest opcja wy\u015bwietlania tytu\u0142u, pokazujemy tytu\u0142; w przeciwnym razie nie.<\/li>\n<\/ul>\n<p>Mo\u017cna si\u0119 z tym upora\u0107 za pomoc\u0105 prostej\u00a0 instrukcji <strong>if<\/strong>, oceniaj\u0105c warto\u015b\u0107 opcji <strong>display-title<\/strong>, kt\u00f3r\u0105 mamy. Ze wzgl\u0119du na spos\u00f3b, w jaki zbudowali\u015bmy t\u0119 funkcj\u0119 w tej serii, je\u015bli ta opcja jest zaznaczona, ma ona opcj\u0119 <strong>on<\/strong> ; w przeciwnym razie jest pusty.<\/p>\n<p>Oznacza to, \u017ce mo\u017cemy ustawi\u0107 taki warunek w tym samym kodzie, kt\u00f3ry <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f6bbe19253188596f804a7c211d9cd5#file-01-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">udost\u0119pnili\u015bmy powy\u017cej<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n?&gt;\n&lt;div id=\"&lt;?php echo $args['id']; ?&gt;\"&gt;\n  &lt;?php if (isset($instance['display-title']) &amp;&amp; 'on' === $instance['display-title']): ?&gt;\n        &lt;h3 class=\"widget-title\"&gt;&lt;?php echo $instance['title']; ?&gt;&lt;\/h3&gt;\n    &lt;?php endif; ?&gt;\n    &lt;p&gt;&lt;?php echo $instance['content']; ?&gt;&lt;\/p&gt;\n&lt;\/div&gt;&lt;!-- #&lt;?php echo $args['id']; ?&gt;--&gt;\n<\/code><\/pre>\n<p>W ten spos\u00f3b, je\u015bli opcja jest zaznaczona, tytu\u0142 zostanie wy\u015bwietlony.<\/p>\n<h3>Nast\u0119pstwem tego<\/h3>\n<p>My\u015bl\u0119, \u017ce warto wspomnie\u0107 o tym, \u017ce czasami ludzie mog\u0105 aktywowa\u0107 wid\u017cety, ale nie chc\u0105 mie\u0107 \u017cadnych tre\u015bci. Jasne, mo\u017cesz argumentowa\u0107, \u017ce je\u015bli to robi\u0105, to ich wina.<\/p>\n<p>Jest w tym prawda.<\/p>\n<p>Ale my\u015bl\u0119 te\u017c, \u017ce dbanie o u\u017cytkownik\u00f3w, kt\u00f3rzy mog\u0105 co\u015b rozgry\u017a\u0107 lub kt\u00f3rzy przypadkowo zrobili co\u015b, o czym nie wiedzieli, \u017ce mog\u0105 im pom\u00f3c. By\u0107 mo\u017ce czyni nas to odpowiedzialnymi programistami (a mo\u017ce czyni nas bardziej agresywnymi \u2013 wybieraj, ja jestem z tym pierwszym).<\/p>\n<p>My\u015bl\u0119 wi\u0119c, \u017ce w tym przypadku warto upewni\u0107 si\u0119, \u017ce tytu\u0142 i tre\u015b\u0107 nie s\u0105 puste. Je\u015bli tak, nie renderuj niczego.<\/p>\n<p>Kod wygl\u0105da wtedy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f6bbe19253188596f804a7c211d9cd5#file-02-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n?&gt;\n\n&lt;?php if (empty($instance['title']) &amp;&amp; empty($instance['content'])): return;\nendif; ?&gt;\n\n&lt;div id=\"&lt;?php echo $args['id']; ?&gt;\"&gt;\n    &lt;?php if (isset($instance['display-title']) &amp;&amp; 'on' === $instance['display-title']): ?&gt;\n        &lt;h3 class=\"widget-title\"&gt;&lt;?php echo $instance['title']; ?&gt;&lt;\/h3&gt;\n    &lt;?php endif; ?&gt;\n    &lt;p&gt;&lt;?php echo $instance['content']; ?&gt;&lt;\/p&gt;\n&lt;\/div&gt;&lt;!-- #&lt;?php echo $args['id']; ?&gt;--&gt;\n<\/code><\/pre>\n<p>I to b\u0119dzie koniec, je\u015bli chodzi o front-end. Ale co z buforowaniem, o kt\u00f3rym m\u00f3wili\u015bmy we wcze\u015bniejszym po\u015bcie?<\/p>\n<h3>2 Przedstawiamy buforowanie<\/h3>\n<p>Buforowanie, dla takiego wid\u017cetu, jest czym\u015b, co uwa\u017cam za opcjonalne, ale poniewa\u017c wbudowali\u015bmy podstawow\u0105 funkcjonalno\u015b\u0107 w Boilerplate do opr\u00f3\u017cniania pami\u0119ci podr\u0119cznej, logicznie rzecz bior\u0105c, nale\u017cy wprowadzi\u0107 funkcj\u0119 buforowania danych, prawda?<\/p>\n<p>Wi\u0119c zr\u00f3bmy to. To te\u017c nie powinno by\u0107 trudne. W rzeczywisto\u015bci po prostu bierzemy tytu\u0142, tre\u015b\u0107 i pole wyboru i buforujemy warto\u015bci dla danej instancji wid\u017cetu.<\/p>\n<p>Aby to zrobi\u0107, musimy zlokalizowa\u0107 funkcj\u0119 <strong>wid\u017cetu<\/strong>, a nast\u0119pnie wykona\u0107 nast\u0119puj\u0105ce czynno\u015bci:<\/p>\n<p>Najpierw przedstawimy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f6bbe19253188596f804a7c211d9cd5#file-03-cache-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funkcj\u0119 buforowania wid\u017cetu<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Caches the values for the instance of this widget.\n *\n * @param array $args     argument provided by WordPress that may be useful in rendering the widget\n * @param array $instance the values of the widget\n *\/\nprivate function cacheWidget($args, $instance)\n{\n    $cache = [];\n    $cache['widget_id'] = $args['widget_id'];\n    $cache['title'] = empty($instance['title'])? '': $instance['title'];\n    $cache['content'] = empty($instance['content'])? '': $instance['content'];\n\n    $instance['display-title'] = isset($instance['display-title'])? $instance['display-title']: '';\n    $cache['display-title'] = $instance['display-title'];\n\n    wp_cache_set($this-&gt;getWidgetSlug(), $cache, 'widget');\n}<\/code><\/pre>\n<p>Nast\u0119pnie wprowadzimy funkcj\u0119 do pobierania <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f6bbe19253188596f804a7c211d9cd5#file-04-get-cached-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wersji wid\u017cetu z pami\u0119ci podr\u0119cznej<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return array the cached instance of this widget if it's not empty\n *\/\nprivate function getCachedWidget()\n{\n    $cache = wp_cache_get($this-&gt;getWidgetSlug(), 'widget');\n    if (!empty($cache)) {\n        return $cache;\n    }\n    return [];\n}<\/code><\/pre>\n<p>Nast\u0119pnie wracamy do oryginalnej funkcji, aby upewni\u0107 si\u0119, \u017ce wy\u015bwietlamy to, co jest potrzebne. Je\u015bli pami\u0119\u0107 podr\u0119czna jest pusta, nie robimy nic poza wy\u015bwietlaniem warto\u015bci <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f6bbe19253188596f804a7c211d9cd5#file-05-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">bez zmian<\/a>.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Displays the widget based on the contents of the included template.\n *\n * @param array $args     argument provided by WordPress that may be useful in rendering the widget\n * @param array $instance the values of the widget\n *\/\npublic function widget($args, $instance)\n{\n    \/\/ Get a cached version of the widget. If it's empty, cache what we have.\n    $cache = $this-&gt;getCachedWidget();\n    if (empty($cache)) {\n        $this-&gt;cacheWidget($args, $instance);\n    }\n\n    return $this-&gt;widgetDisplay-&gt;show($args, $instance);\n}<\/code><\/pre>\n<p>I to ko\u0144czy funkcjonalno\u015b\u0107 ca\u0142kowicie zrefaktoryzowanej p\u0142yty Widget Boilerplate.<\/p>\n<h2>Koniec<\/h2>\n<p>Ta powa\u017cna sprawa trwa ju\u017c od dawna. Osobi\u015bcie naprawd\u0119 dobrze by\u0142o ponownie odwiedzi\u0107 WordPress Widget Boilerplate i dostosowa\u0107 go do bardziej nowoczesnych standard\u00f3w.<\/p>\n<p>Jest jeszcze kilka rzeczy, kt\u00f3re musz\u0119 zrobi\u0107, jak zaktualizowa\u0107 plik README, a nast\u0119pnie poda\u0107 kilka dodatkowych instrukcji, zanim scal\u0119 go z\u00a0 ga\u0142\u0119zi\u0105 <strong>master<\/strong>, ale je\u015bli \u015bledzi\u0142e\u015b ca\u0142\u0105 t\u0119 seri\u0119, prawdopodobnie jeste\u015b na pok\u0142adzie ze wszystkim. Co wi\u0119cej, doceniam Tw\u00f3j czas sp\u0119dzony z tym i mam nadziej\u0119, \u017ce na niekt\u00f3rych poziomach by\u0142o to dla Ciebie korzystne.<\/p>\n<p>Maj\u0105c to na uwadze, b\u0119d\u0119 chcia\u0142 przej\u015b\u0107 do tre\u015bci premium o kr\u00f3tszej formie, poniewa\u017c ta i ostatnia seria by\u0142y do\u015b\u0107 d\u0142ugie. Jak zwykle zawsze mo\u017cesz si\u0119 ze mn\u0105 skontaktowa\u0107 lub w razie potrzeby zaoferowa\u0107 pull request \u2013 jest to oprogramowanie typu open source i mile widziane ulepszenia.<\/p>\n<p>Na razie jednak to zamyka t\u0119 seri\u0119.<\/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>Tutaj finalizujemy zaktualizowan\u0105 wersj\u0119 WordPress Widget Boilerplate, aktualizuj\u0105c to, co u\u017cytkownicy widz\u0105 na interfejsie u\u017cytkownika i pracuj\u0105c z buforowaniem.<\/p>\n","protected":false},"author":1,"featured_media":236089,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845,866],"tags":[1169],"class_list":["post-230867","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230867","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=230867"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230867\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236089"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230867"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}