{"id":228423,"date":"2022-10-22T10:04:00","date_gmt":"2022-10-22T07:04:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228423"},"modified":"2022-11-09T02:22:20","modified_gmt":"2022-11-08T23:22:20","slug":"zatrzymaj-wykonywanie-wtyczki-bez-zaleznosci","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/zatrzymaj-wykonywanie-wtyczki-bez-zaleznosci\/","title":{"rendered":"Zatrzymaj wykonywanie wtyczki bez zale\u017cno\u015bci"},"content":{"rendered":"\n<p>Je\u015bli podchodzisz do tworzenia wtyczek do WordPressa z perspektywy obiektowej, to w ko\u0144cu dojdziesz do punktu, w kt\u00f3rym nie b\u0119dziesz komunikowa\u0107 si\u0119 bezpo\u015brednio z samym rdzeniem WordPressa.<\/p>\n<p>I moim zdaniem to dobra rzecz. To znak architektury, \u017ce w\u0142a\u015bciwie budujesz sw\u00f3j kod. To znaczy:<\/p>\n<ol>\n<li>Masz WordPressa siedz\u0105cego na poziomie podstawowym,<\/li>\n<li>Masz zestaw klas, kt\u00f3re siedz\u0105 tu\u017c nad WordPress, odpowiedzialne za wysy\u0142anie informacji do i z WordPressa pomi\u0119dzy wtyczk\u0105,<\/li>\n<li>I masz reszt\u0119 kodu, kt\u00f3ra obejmuje pozosta\u0142\u0105 cz\u0119\u015b\u0107 funkcjonalno\u015bci.<\/li>\n<\/ol>\n<p>Spos\u00f3b, w jaki to jest zaimplementowane, mo\u017ce si\u0119 r\u00f3\u017cni\u0107, ale og\u00f3lnie wyobra\u017cam sobie to w ten sam spos\u00f3b, w jaki my\u015bl\u0119 o standardowej aplikacji <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multitier_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">N-warstwowej<\/a>, w kt\u00f3rej masz warstw\u0119 danych, warstw\u0119 aplikacji i front-end.<\/p>\n<p>Poza tym razem masz WordPressa, warstw\u0119 do komunikacji z WordPressem i reszt\u0105 kodu, a tak\u017ce, wiesz, z reszt\u0105 kodu.<\/p>\n<p>Jak mo\u017cna zorganizowa\u0107 wtyczk\u0119.<\/p>\n<p>Co si\u0119 dzieje, gdy chcesz zatrzyma\u0107 wykonywanie wtyczki, gdy musi ona wchodzi\u0107 w interakcje z zale\u017cno\u015bci\u0105 innej firmy i powinna by\u0107 wykonywana tylko wtedy, gdy ta zale\u017cno\u015b\u0107 jest obecna?<\/p>\n<h2>Zatrzymaj wykonywanie wtyczki<\/h2>\n<p>Ze wzgl\u0119du na natur\u0119 PHP i WordPressa mo\u017cna to zrobi\u0107 na kilka sposob\u00f3w. Kod, kt\u00f3ry zamierzam udost\u0119pni\u0107, nie okre\u015bla sposobu, w jaki to zrobi\u0107.<\/p>\n<p>Zamiast tego jest to spos\u00f3b na zrobienie tego (kt\u00f3ry zosta\u0142 wyci\u0105gni\u0119ty z czego\u015b, co jest w fazie rozwoju). Ponadto poka\u017c\u0119, jak wsp\u00f3\u0142dzia\u0142a z kilkoma innymi sk\u0142adnikami wtyczek.<\/p>\n<h3>1 Konstruktor<\/h3>\n<p>Je\u015bli przeczytasz wystarczaj\u0105co du\u017co artyku\u0142\u00f3w o WordPressie i programowaniu obiektowym, prawdopodobnie odkryjesz, \u017ce konstruktor\u00f3w nie nale\u017cy u\u017cywa\u0107 do definiowania hook\u00f3w. I zgadzam si\u0119.<\/p>\n<p>Tworzy niepotrzebny poziom sprz\u0119\u017cenia i utrudnia testowanie. Jaki jest zatem cel konstruktora w kodzie opartym na WordPressie?<\/p>\n<p>U\u017cywam go z tych samych powod\u00f3w, kt\u00f3rych mo\u017cna oczekiwa\u0107 w ka\u017cdym innym j\u0119zyku: Aby zainicjowa\u0107 w\u0142a\u015bciwo\u015bci klasy. W poni\u017cszym kodzie zobaczysz trzy rzeczy:<\/p>\n<ol>\n<li>inicjuj\u0119 w\u0142a\u015bciwo\u015b\u0107,<\/li>\n<li>Sprawdzam, czy istnieje zale\u017cno\u015b\u0107 od innej firmy,<\/li>\n<li>Je\u015bli nie, to dodaj\u0119 komunikat o b\u0142\u0119dzie,<\/li>\n<li>Aktualizuj\u0119 nieruchomo\u015b\u0107.<\/li>\n<\/ol>\n<p>Jasne, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-00-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jest gadatliwy<\/a>, ale nie ucieka si\u0119 te\u017c do sprytnego kodu do inicjowania warto\u015bci.<\/p>\n<pre><code>&lt;?php\n\npublic function __construct( $container) {\n\n    $this-&gt;can_run = true;\n\n    \/\/ If the dependency isn't installed, then add a message and flag execution to stop.\n    $this-&gt;messenger = $container-&gt;get( 'settings-messenger');\n    if (! class_exists( 'Acme_Dependency')) {\n\n        $this-&gt;messenger-&gt;add_error_message( 'The dependency is not installed.' );\n        $this-&gt;can_run = false;\n    }\n}\n<\/code><\/pre>\n<p>(Im jestem starszy, tym bardziej polubi\u0142em konkretny kod, poniewa\u017c u\u0142atwia on czytanie, chwytanie i korzystanie z szybszego tempa ni\u017c alternatywa).<\/p>\n<h3>2 Metoda inicjalizacji<\/h3>\n<p>Poniewa\u017c nie u\u017cywamy konstruktora do pracy z hookami WordPress, ta funkcjonalno\u015b\u0107 powinna istnie\u0107 w kontek\u015bcie innej metody.<\/p>\n<p>To daje nam wydzielone miejsce na umieszczenie tego typu funkcji, oddzielenie jej od reszty klasy i interakcj\u0119 z WordPressem tylko wtedy, gdy metoda jest jawnie wywo\u0142ana.<\/p>\n<p>Pami\u0119taj jednak, \u017ce ca\u0142y sens tego, do czego zmierzam, dotyczy zatrzymania wykonywania wtyczki \u2013 a nie tego, gdzie umie\u015bci\u0107 hooki.<\/p>\n<p>Za\u0142\u00f3\u017cmy wi\u0119c, \u017ce zale\u017cno\u015b\u0107 od strony trzeciej nie istnieje, wi\u0119c co? Przypomnijmy, w konstruktorze zosta\u0142a ustawiona w\u0142a\u015bciwo\u015b\u0107, kt\u00f3ra pozwoli nam okre\u015bli\u0107 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-01-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, czy powinni\u015bmy i\u015b\u0107 naprz\u00f3d<\/a> z konfiguracj\u0105 hook\u00f3w, czy nie:<\/p>\n<pre><code>&lt;?php\n\npublic function init() {\n\n    if (! $this-&gt;can_run) {\n        return;\n    }\n\n    add_action( 'admin_notices', array( $this, 'admin_notices') );\n}\n<\/code><\/pre>\n<p>A kiedy to nast\u0105pi, reszta kodu nie zostanie wykonana.<\/p>\n<h2>Du\u017co s\u0142\u00f3w, ma\u0142y kod<\/h2>\n<p>Brzmi to jak wiele wyja\u015bnie\u0144 dla tak bardzo ma\u0142ego kodu.<\/p>\n<p>Ale cz\u0119\u015bci\u0105 tego jest r\u00f3wnie\u017c pr\u00f3ba przekazania znaczenia oddzielenia cz\u0119\u015bci projektu opartego na WordPressie od reszty rdzenia, aby cz\u0119\u015bci mog\u0142y wchodzi\u0107 w interakcje ze sob\u0105 bez wyra\u017anej potrzeby ci\u0105g\u0142ego rozmawiania z rdzeniem.<\/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>Co si\u0119 dzieje, gdy chcesz zatrzyma\u0107 wykonywanie wtyczki, gdy musi ona dzia\u0142a\u0107 z zale\u017cno\u015bci\u0105 innej firmy i powinna to zrobi\u0107 tylko wtedy, gdy jest obecna?<\/p>\n","protected":false},"author":1,"featured_media":221144,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,805,866],"tags":[1169],"class_list":["post-228423","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-php-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228423","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=228423"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228423\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/221144"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}