{"id":231479,"date":"2023-01-08T09:59:00","date_gmt":"2023-01-08T06:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231479"},"modified":"2023-01-08T10:00:47","modified_gmt":"2023-01-08T07:00:47","slug":"korzystanie-z-rejestru-subskrybentow-i-uslug-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/korzystanie-z-rejestru-subskrybentow-i-uslug-w-wordpress\/","title":{"rendered":"Korzystanie z rejestru, subskrybent\u00f3w i us\u0142ug w WordPress"},"content":{"rendered":"\n<p><strong>TL; DR:<\/strong> Uwa\u017cam, \u017ce korzystanie z rejestru, subskrybent\u00f3w i us\u0142ug jest bardzo przydatne podczas tworzenia wtyczek i narz\u0119dzi dla WordPressa zorientowanych na backend. Ten post pokazuje, jak to zrobi\u0107.<\/p>\n<hr \/>\n<p>Po latach pracy z wzorcami projektowymi, programowaniem obiektowym i WordPressem z pewno\u015bci\u0105 pojawi\u0105 si\u0119 powszechne sposoby rozwi\u0105zywania problem\u00f3w.<\/p>\n<p>W ten spos\u00f3b na pocz\u0105tku otrzymali\u015bmy wzorce projektowe zorientowane obiektowo, wi\u0119c mo\u017ce jest to odmiana zorientowana na WordPressa.<\/p>\n<p>Chocia\u017c pisa\u0142em o takich rzeczach, jak rejestry w poprzednich artyku\u0142ach (i tych, kt\u00f3re nie s\u0105 <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/korzystanie-z-wzorca-rejestru-w-wordpress\/\" title=\"nawet tak stare\">nawet tak stare<\/a> ), nigdy nie jest z\u0142ym pomys\u0142em, aby wr\u00f3ci\u0107 do tego samego tematu, zw\u0142aszcza gdy jest co\u015b do dodania do poprzedniego uj\u0119cia.<\/p>\n<h2>Rejestr, subskrybenci i us\u0142ugi<\/h2>\n<p>Wszystko opisane poni\u017cej nale\u017cy rozumie\u0107 w kontek\u015bcie wtyczki WordPress. Oznacza to, \u017ce nie nale\u017cy tego odczytywa\u0107 jako sposobu pracy z innymi frameworkami, j\u0119zykami, aplikacjami lub u\u017cywania go z innymi wzorcami.<\/p>\n<p>Pami\u0119taj o tym czytaj\u0105c to.<\/p>\n<hr \/>\n<p>W ka\u017cdym razie og\u00f3lna idea po\u0142\u0105czenia tych typ\u00f3w obiekt\u00f3w jest nast\u0119puj\u0105ca:<\/p>\n<ol>\n<li>Rejestr obs\u0142uguje wszystkich subskrybent\u00f3w,<\/li>\n<li>Subskrybenci nas\u0142uchuj\u0105 haczyk\u00f3w w WordPressie (tych, kt\u00f3re istniej\u0105, a nawet niestandardowych haczyk\u00f3w),<\/li>\n<li>Us\u0142ugi wykonuj\u0105 rzeczywist\u0105 prac\u0119, gdy subskrybent je wysy\u0142a.<\/li>\n<\/ol>\n<p>Celem jest jedno miejsce do rejestracji klas odpowiedzialnych za wysy\u0142anie pracy. Ot\u00f3\u017c \u200b\u200bto.<\/p>\n<p>Co wi\u0119cej, u\u0142atwia to r\u00f3wnie\u017c oddzielenie rzeczy, dzi\u0119ki czemu je\u015bli chcesz testowa\u0107 swoje us\u0142ugi w izolacji, jest to znacznie \u0142atwiejsze, poniewa\u017c niekoniecznie s\u0105 one \u015bci\u015ble powi\u0105zane z WordPress. A je\u015bli tak, to mo\u017cesz zakpi\u0107 dane, kt\u00f3re nale\u017cy przekaza\u0107 do danej funkcji, a nast\u0119pnie oceni\u0107 wynik.<\/p>\n<p>Nie jest to jednak artyku\u0142 o testowaniu, wi\u0119c wr\u00f3\u0107my do samych klas.<\/p>\n<h3>Rejestr<\/h3>\n<p>Z definicji celem rejestru jest \u015bledzenie rzeczy. Je\u015bli chodzi o implementacj\u0119 tego wzorca w WordPressie, chodzi o to, aby rejestr m\u00f3g\u0142 \u015bledzi\u0107 subskrybent\u00f3w (co zdefiniuj\u0119 w dalszej cz\u0119\u015bci tego artyku\u0142u).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dacccb19c.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-158242-61e6dacccb19c.png\" alt=\"Korzystanie z rejestru, subskrybent\u00f3w i us\u0142ug w WordPress\"><\/a><\/p>\n<p>Zdj\u0119cie: <a href=\"https:\/\/unsplash.com\/@redaquamedia?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Denny M\u00fcller<\/a> na <a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Co wi\u0119cej, chodzi o to, \u017ce gdy nadejdzie czas, kt\u00f3ry prawdopodobnie b\u0119dzie inny, niezale\u017cnie od struktury wtyczki, wszyscy subskrybenci b\u0119d\u0105 instancjami. Do tego momentu prawdopodobnie b\u0119dziesz chcia\u0142 to zrobi\u0107 na pocz\u0105tku cyklu \u017cycia WordPressa.<\/p>\n<p>To powiedziawszy, oto przyk\u0142ad kodu do rejestracji subskrybent\u00f3w:<\/p>\n<pre><code>private $subscribers = [\n    AssetSubscriber::class,\n    \/\/ ...\n    DeletedUserSubscriber::class,\n];<\/code><\/pre>\n<p>Poni\u017cej znajduje si\u0119 funkcja tworzenia instancji subskrybent\u00f3w.<\/p>\n<pre><code>public function run()\n{\n    array_map(\n        function ($subscriber) {\n            (new $subscriber())-&gt;subscribe();\n        },\n        $this-&gt;subscribers\n    );\n}<\/code><\/pre>\n<p>Bloki te mog\u0105 by\u0107 cz\u0119\u015bci\u0105 tej samej funkcji lub mog\u0105 by\u0107 oddzielne w zale\u017cno\u015bci od potrzeb.<\/p>\n<h3>Subskrybenci<\/h3>\n<p>Jak wspomniano, subskrybenci s\u0105 sposobem na:<\/p>\n<ol>\n<li>Pos\u0142uchaj pewnego haka w WordPress<\/li>\n<li>Dispatch a Service, aby wykona\u0142 jak\u0105kolwiek prac\u0119 przewidzian\u0105 dla danego hooka.<\/li>\n<\/ol>\n<p>Za\u0142\u00f3\u017cmy wi\u0119c na chwil\u0119, \u017ce chcesz co\u015b zrobi\u0107 po usuni\u0119ciu u\u017cytkownika. Chcesz utworzy\u0107 wyst\u0105pienie us\u0142ugi za po\u015brednictwem subskrybenta za ka\u017cdym razem, gdy nast\u0105pi to przechwycenie.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dad44a26f.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-158242-61e6dad44a26f.png\" alt=\"Korzystanie z rejestru, subskrybent\u00f3w i us\u0142ug w WordPress\"><\/a><\/p>\n<p>Zdj\u0119cie autorstwa <a href=\"https:\/\/unsplash.com\/@leecampbell?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lee Campbella<\/a> na <a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Jako przyk\u0142ad:<\/p>\n<pre><code>class DeletedUserSubscriber\n{\n    public function subscribe()\n    {\n        (new DeletedUserService())-&gt;add('delete_user');\n    }\n}<\/code><\/pre>\n<p>Zauwa\u017c, \u017ce subskrybent jest \u015bwiadomy us\u0142ugi (chocia\u017c nie jest od niej uzale\u017cniony, poniewa\u017c jest po prostu po\u015brednikiem mi\u0119dzy WordPressem a us\u0142ug\u0105) i okre\u015bla podpi\u0119cie do us\u0142ugi, kt\u00f3rej instancj\u0119 tworzy.<\/p>\n<h3>Us\u0142ugi<\/h3>\n<p>Wreszcie, us\u0142ugi to obiekty, kt\u00f3re wykonuj\u0105 wszystkie ci\u0119\u017ckie operacje we wtyczce. Oznacza to, \u017ce je\u015bli musz\u0105 czyta\u0107 lub zapisywa\u0107 do bazy danych, systemu plik\u00f3w, sieci, danych procesowych itp., wszystko dzieje si\u0119 w ich kontek\u015bcie.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dadba8851.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-158242-61e6dadba8851.png\" alt=\"Korzystanie z rejestru, subskrybent\u00f3w i us\u0142ug w WordPress\"><\/a><\/p>\n<p>Zdj\u0119cie autorstwa <a href=\"https:\/\/unsplash.com\/@introspectivedsgn?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Erika<\/a> Mcleana \u00a0na <a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Mog\u0105 by\u0107 \u015bwiadomi innych klas, mog\u0105 nie by\u0107. Mog\u0105 implementowa\u0107 interfejs lub klas\u0119 abstrakcyjn\u0105 lub nie. To naprawd\u0119 wykracza poza zakres tego postu. Ale chodzi o to, \u017ce u\u017cywaj\u0105c haka z g\u00f3ry jako przyk\u0142adu, je\u015bli chcesz co\u015b zrobi\u0107 po usuni\u0119ciu u\u017cytkownika, robisz to w ramach us\u0142ugi.<\/p>\n<p>Na przyk\u0142ad:<\/p>\n<pre><code>class DeletedUserService\n{\n    public function add(string $hook)\n    {\n        add_action($hook, [$this, 'deletedUser'], 99, 1);\n    }\n\n    public function deletedUser(int $userId)\n    {\n        $user = get_userdata($userId);\n        if (false === $user) {\n            return;\n        }\n\n        \/\/ Do work with the user that's being deleted.   \n    }\n}<\/code><\/pre>\n<p>I to koniec. Po uruchomieniu us\u0142ugi kontrola zostanie zwr\u00f3cona do WordPress, a aplikacja b\u0119dzie kontynuowa\u0107 normalne dzia\u0142anie.<\/p>\n<h3>Teraz wszyscy razem<\/h3>\n<p>Zak\u0142adaj\u0105c, \u017ce masz plik \u0142aduj\u0105cy dla swojej wtyczki, kt\u00f3ry wi\u0119kszo\u015b\u0107 robi w tym miejscu, gdzie jest zdefiniowana wymagana wtyczka, wymagany jest autoloader i nast\u0119puje instancja samej wtyczki.<\/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>Korzystanie z rejestru, subskrybent\u00f3w i us\u0142ug jest przydatne podczas tworzenia wtyczek i narz\u0119dzi opartych na zapleczu WordPress. Ten post pokazuje, jak to zrobi\u0107.<\/p>\n","protected":false},"author":1,"featured_media":158243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,836,845,866],"tags":[1169],"class_list":["post-231479","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231479","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=231479"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231479\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/158243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=231479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=231479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=231479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}