{"id":230671,"date":"2022-12-17T09:48:00","date_gmt":"2022-12-17T06:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230671"},"modified":"2022-12-07T11:44:07","modified_gmt":"2022-12-07T08:44:07","slug":"widzety-wordpress-refaktoryzacja-czesc-5","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-refaktoryzacja-czesc-5\/","title":{"rendered":"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 5"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">W poprzednim po\u015bcie<\/a><\/strong> stworzyli\u015bmy Rejestr, kt\u00f3ry b\u0119dzie s\u0142u\u017cy\u0142 do przechowywania wszystkich r\u00f3\u017cnych klas odpowiedzialnych za nadanie funkcjonalno\u015bci naszemu wid\u017cetowi.<\/p>\n<p>Aby to zrobi\u0107, zostanie wprowadzonych wiele innych klas, ale zanim tam przejdziemy, musimy doda\u0107 Rejestr do programu startowego wtyczki (nie m\u00f3wi\u0105c ju\u017c o utworzeniu programu startowego dla wtyczki).<\/p>\n<p>W szczeg\u00f3lno\u015bci tutaj zako\u0144czyli\u015bmy:<\/p>\n<blockquote>\n<p>Jak wspomniano wcze\u015bniej w po\u015bcie, musimy doda\u0107 to do \u0142adowania pocz\u0105tkowego wtyczki. Aby to zrobi\u0107, musimy jednak zdefiniowa\u0107 w\u0142asny filtr, dzi\u0119ki czemu b\u0119dziemy mogli \u0142atwo omin\u0105\u0107 rejestr z reszt\u0105 wtyczki (gdy nadejdzie na to czas).<\/p>\n<\/blockquote>\n<p>W tym po\u015bcie skupimy si\u0119 w\u0142a\u015bnie na tym.<\/p>\n<h2>WordPress Widget Boilerplate: Refaktoryzacja, cz\u0119\u015b\u0107 5<\/h2>\n<p>Je\u015bli \u015bledzi\u0142e\u015b seri\u0119 do tego momentu, powiniene\u015b by\u0107 w dobrej sytuacji, aby doda\u0107 Rejestr, aby\u015bmy mieli do niego dost\u0119p przez ca\u0142\u0105 wtyczk\u0119.<\/p>\n<p>Aby to zrobi\u0107, za\u0142\u00f3\u017c jednak, \u017ce wiesz, jak zdefiniowa\u0107 filtry. W WordPressie <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ca\u0142y czas u\u017cywamy akcji i filtr\u00f3w<\/a>.<\/p>\n<p>Rzecz w tych hakach polega na tym, \u017ce s\u0105 ju\u017c zdefiniowane. Jak wi\u0119c zdefiniowa\u0107 nasz filtr?<\/p>\n<p>Przyjrzyjmy si\u0119 dok\u0142adnie temu.<\/p>\n<h3>1 Definiowanie naszego filtra<\/h3>\n<p>Najpierw musimy zrozumie\u0107 kilka poj\u0119\u0107:<\/p>\n<ul>\n<li>co to jest filtr,<\/li>\n<li>jak doda\u0107 filtr,<\/li>\n<li>jak wprowadzi\u0107 nasz rejestr do filtra<\/li>\n<li>jak pobra\u0107 klas\u0119 z filtra.<\/li>\n<\/ul>\n<p>Na szcz\u0119\u015bcie wszystko to jest \u0142atwe do wyja\u015bnienia.<\/p>\n<h4>Co to jest filtr?<\/h4>\n<p>M\u00f3wi\u0105c najpro\u015bciej, haki pozwalaj\u0105 nam wywo\u0142ywa\u0107 WordPress w okre\u015blonych momentach podczas wykonywania programu. Dzia\u0142ania s\u0105 zwykle zarezerwowane dla zachowania; Filtry s\u0105 zarezerwowane dla danych.<\/p>\n<p>Co wi\u0119cej, filtry pozwalaj\u0105 nam pracowa\u0107 z okre\u015blonymi danymi w aplikacji \u2013 mog\u0105 to by\u0107 dane ju\u017c istniej\u0105ce, a nawet nowe. W naszym przypadku b\u0119dzie to klasa Registry, kt\u00f3ra zawiera odniesienia do innych danych.<\/p>\n<h4>Dodawanie filtra<\/h4>\n<p>Dodanie filtra jest \u0142atwe. Sk\u0142ada si\u0119 z trzech cz\u0119\u015bci:<\/p>\n<ol>\n<li>wywo\u0142anie <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">add_filter<\/a> ,<\/li>\n<li>zdefiniowanie unikalnego identyfikatora dla filtra,<\/li>\n<li>przekazywanie informacji do filtra, kt\u00f3re mog\u0105 by\u0107 zwracane przy ka\u017cdym wywo\u0142aniu.<\/li>\n<\/ol>\n<p>Dla nas zamierzam zidentyfikowa\u0107 nasz rejestr jako filtr <strong>wpWidgetRegistry<\/strong>. Pami\u0119taj jednak, \u017ce wa\u017cne jest, aby wybra\u0107 unikaln\u0105 nazw\u0119 dla swojej implementacji, poniewa\u017c je\u015bli tego nie zrobisz, mo\u017cesz sko\u0144czy\u0107 z kolizj\u0105 z innymi danymi, je\u015bli inna wtyczka u\u017cyje tego samego zidentyfikowanego.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc432bb7.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-161108-61e71bc432bb7.png\" alt=\"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 5\" ><\/a><\/p>\n<p>W ka\u017cdym razie dodanie filtra wykonuje proste zadanie:<\/p>\n<blockquote>\n<p>Pod\u0142\u0105cz funkcj\u0119 lub metod\u0119 do okre\u015blonej akcji filtrowania.<\/p>\n<\/blockquote>\n<p>Oznacza to, \u017ce musimy zdefiniowa\u0107 metod\u0119 z naszym ID. Ze wzgl\u0119du na natur\u0119 PHP nie musimy u\u017cywa\u0107 osobnej funkcji.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc81c90d.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-161108-61e71bc81c90d.png\" alt=\"Wid\u017cety WordPress: Refaktoryzacja, cz\u0119\u015b\u0107 5\" ><\/a><\/p>\n<p>Zamiast tego mo\u017cemy u\u017cy\u0107 <a href=\"https:\/\/secure.php.net\/manual\/en\/functions.anonymous.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funkcji anonimowej<\/a>.<\/p>\n<blockquote>\n<p>Funkcje anonimowe, zwane r\u00f3wnie\u017c domkni\u0119ciami, umo\u017cliwiaj\u0105 tworzenie funkcji, kt\u00f3re nie maj\u0105 okre\u015blonej nazwy. S\u0105 najbardziej przydatne jako warto\u015b\u0107 parametr\u00f3w wywo\u0142a\u0144 zwrotnych, ale maj\u0105 wiele innych zastosowa\u0144.<\/p>\n<\/blockquote>\n<p>Anonimowa funkcja, kt\u00f3r\u0105 zamierzamy zdefiniowa\u0107, zaakceptuje odwo\u0142anie do wtyczki jako argument, a nast\u0119pnie zwr\u00f3ci j\u0105 za ka\u017cdym razem, gdy zostanie wywo\u0142any filtr (co zostanie pokazane w dalszej cz\u0119\u015bci tego artyku\u0142u).<\/p>\n<h4>Przekazywanie informacji do naszego filtra<\/h4>\n<p>Teraz, gdy mamy ju\u017c to wszystko pokryte, mo\u017cemy przej\u015b\u0107 przez proces tworzenia instancji naszego Rejestru, definiowania filtra, a nast\u0119pnie dodawania rejestru, aby by\u0142 dost\u0119pny w ca\u0142ej aplikacji.<\/p>\n<p>Tak wi\u0119c w g\u0142\u00f3wnym pliku wtyczki, czyli pliku <strong>wordpress-widget-boilerplate.php<\/strong>, dodajemy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-00-bootstrap-namespace-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nast\u0119puj\u0105ce wiersze kodu<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\n\n\/\/ More to come...\n<\/code><\/pre>\n<p>Powy\u017csze deklaruje przestrze\u0144 nazw, w kt\u00f3rej znajduje si\u0119 Rejestr. Nast\u0119pnie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-01-bootstrap-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dodajemy nast\u0119puj\u0105cy blok kodu pod autoloaderem:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpWidgetRegistry', function() use ($registry) {\n    return $registry;\n});\n<\/code><\/pre>\n<p>Zwr\u00f3\u0107 uwag\u0119, \u017ce gdy zamierzasz aktywowa\u0107 wtyczk\u0119, nie zostanie ona aktywowana i zg\u0142osi b\u0142\u0105d. Wynika to z braku autoloadera, o kt\u00f3rym b\u0119dzie mowa w nast\u0119pnym po\u015bcie.<\/p>\n<h3>2 Odzyskiwanie naszego rejestru<\/h3>\n<p>Poniewa\u017c rejestr jest zdefiniowany w programie pocz\u0105tkowym wtyczki i odbywa si\u0119 to za pomoc\u0105 filtra, mo\u017cemy uzyska\u0107 dost\u0119p do rejestru w dowolnym miejscu wtyczki, wywo\u0142uj\u0105c nasz filtr niestandardowy.<\/p>\n<p>Za\u0142\u00f3\u017cmy na przyk\u0142ad, \u017ce jeste\u015bmy w innej klasie i musimy uzyska\u0107 odwo\u0142anie do rejestru. W tym celu <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-02-retrieve-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mo\u017cemy wykona\u0107 to wywo\u0142anie<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Retrieve the registry anywhere in the plugin.\n$registry = apply_filters('wpWidgetRegistry', null);\n<\/code><\/pre>\n<p>I to wszystko. \u0141atwe, prawda? Dop\u00f3ki wszystko zostanie poprawnie dodane do rejestru \u2013 co wkr\u00f3tce om\u00f3wimy \u2013 b\u0119dziemy mogli uzyska\u0107 do nich dost\u0119p za pomoc\u0105 unikalnych identyfikator\u00f3w, kt\u00f3rych u\u017cyli\u015bmy w <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">poprzednim po\u015bcie.<\/a><\/p>\n<h2>Autoloader<\/h2>\n<p>Teraz zaczynamy u\u017cywa\u0107 przestrzeni nazw i innych klas. Oznacza to, \u017ce b\u0119dziemy musieli u\u017cy\u0107 autoloader\u00f3w.<\/p>\n<p>Wi\u0119c zanim przejdziemy do refaktoryzacji ca\u0142ej klasy w obecnej formie, zrobimy ma\u0142y spacer do niekt\u00f3rych funkcji Composera, aby zobaczy\u0107, jak jest on u\u017cywany do generowania automatycznego \u0142adowania (opr\u00f3cz rzeczy, kt\u00f3rymi ju\u017c jeste\u015bmy u\u017cywanie go do obs\u0142ugi jako\u015bci naszego kodu \u017ar\u00f3d\u0142owego).<\/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>Gdy ju\u017c mamy Rejestr, musimy mie\u0107 do niego dost\u0119p w ca\u0142ej naszej wtyczce i robimy to za pomoc\u0105 niestandardowych hak\u00f3w.<\/p>\n","protected":false},"author":1,"featured_media":236152,"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-230671","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\/230671","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=230671"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230671\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236152"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}