{"id":230131,"date":"2022-12-05T13:46:00","date_gmt":"2022-12-05T10:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230131"},"modified":"2022-11-09T20:14:06","modified_gmt":"2022-11-09T17:14:06","slug":"podstawy-dzialania-hookow-w-wordpressie","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/podstawy-dzialania-hookow-w-wordpressie\/","title":{"rendered":"Podstawy dzia\u0142ania hook\u00f3w w WordPressie"},"content":{"rendered":"\n<p>Za ka\u017cdym razem, gdy zaczyna si\u0119 bardziej zaawansowane programowanie \u2013 czy to w WordPressie, czy w jakimkolwiek innym frameworku, bibliotece, fundamencie lub j\u0119zyku programowania \u2013 s\u0105 chwile, w kt\u00f3rych nowe koncepcje mog\u0105 by\u0107 cz\u0119sto trudniejsze do zrozumienia ni\u017c inne.<\/p>\n<p>Generalnie stwierdzi\u0142em, \u017ce jest to prawd\u0105, gdy dana osoba nauczy\u0142a si\u0119 podstaw, powiedzmy, programowania obiektowego, ale nie by\u0142a wystawiona na niuanse pewnych rzeczy, takich jak wzorce projektowe.<\/p>\n<p>Przyk\u0142ad: pisa\u0142em o <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wzorcu projektowym opartym na zdarzeniach<\/a><\/strong> (lub <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">publikuj-subskrybuj<\/a><\/strong> lub Pub\/Sub, jak niekt\u00f3rzy lubi\u0105 to nazywa\u0107) <strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">w innych postach.<\/a><\/strong><\/p>\n<p>Tak, istniej\u0105 pewne r\u00f3\u017cnice mi\u0119dzy nimi, ale og\u00f3lna idea jest taka, \u017ce \u200b\u200bco\u015b si\u0119 dzieje, a wydarzenie jest podnoszone i wszystko, co nas\u0142uchuje tego wydarzenia lub subskrybuje to wydarzenie, zareaguje.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7466947738.jpg\" 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-162881-61e7466947738.jpg\" alt=\"Podstawy dzia\u0142ania hook\u00f3w w WordPressie\" ><\/a><\/p>\n<p>Zdj\u0119cie: Claus Gr\u00fcnst\u00e4udl na Unsplash<\/p>\n<p>Jest to podstawowy wzorzec, kt\u00f3ry stosuje WordPress, kt\u00f3ry pozwala nam dos\u0142ownie pod\u0142\u0105czy\u0107 si\u0119 do pewnych punkt\u00f3w wykonania. Og\u00f3lnie rzecz bior\u0105c, mo\u017cemy je konceptualizowa\u0107 jako haki akcji w WordPressie.<\/p>\n<p>W ka\u017cdym razie aplikacja udost\u0119pnia nam pewne punkty, aby doda\u0107 w\u0142asn\u0105 funkcjonalno\u015b\u0107. Po zarejestrowaniu tej funkcji WordPress opu\u015bci swoj\u0105 baz\u0119 kodu, \u017ce tak powiem, wskoczy do naszej, a nast\u0119pnie wr\u00f3ci do naszej.<\/p>\n<p>\u0141atwo to zrozumie\u0107, ale co zrobi\u0107, je\u015bli chcesz ujawni\u0107 obszary w swoim kodzie, kt\u00f3re pozwalaj\u0105 innym na podpi\u0119cie si\u0119 do Twojego kodu?<\/p>\n<h2>Haki akcji w WordPressie<\/h2>\n<p>Zanim przyjrzymy si\u0119, jak WordPress implementuje te wzorce, wa\u017cne jest, aby zrozumie\u0107 podstawy tego wzorca. Chocia\u017c w \u017cadnym wypadku nie jest to wyczerpuj\u0105ce, ma pom\u00f3c w podstawowym zrozumieniu wzorca, aby mo\u017cna by\u0142o czyta\u0107 i pisa\u0107 kod oparty na WordPressie.<\/p>\n<p>Jaki jest wi\u0119c dobry spos\u00f3b my\u015blenia o wzorcu Pub\/Sub? <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Wikipedia definiuje to jako:<\/a><\/strong><\/p>\n<blockquote>\n<p>W architekturze oprogramowania publikuj-subskrybuj to wzorzec wiadomo\u015bci, w kt\u00f3rym nadawcy wiadomo\u015bci, zwani wydawcami, nie programuj\u0105 wiadomo\u015bci, kt\u00f3re maj\u0105 by\u0107 wysy\u0142ane bezpo\u015brednio do okre\u015blonych odbiorc\u00f3w, zwanych subskrybentami, ale zamiast tego kategoryzuj\u0105 opublikowane wiadomo\u015bci w klasy bez wiedzy o tym, kt\u00f3rzy subskrybenci, je\u015bli w og\u00f3le., mo\u017ce by\u0107. Podobnie subskrybenci wyra\u017caj\u0105 zainteresowanie co najmniej jedn\u0105 klas\u0105 i otrzymuj\u0105 tylko interesuj\u0105ce wiadomo\u015bci, bez wiedzy o tym, kt\u00f3rzy wydawcy, je\u015bli w og\u00f3le, istniej\u0105.<\/p>\n<\/blockquote>\n<h3>Zrozumienie wzorca<\/h3>\n<p>Na pocz\u0105tku mo\u017ce to by\u0107 du\u017co. Nie wiem, ale podzielmy to:<\/p>\n<ol>\n<li>Istnieje us\u0142uga, w naszym przypadku WordPress, kt\u00f3ra jest odpowiedzialna za publikowanie wiadomo\u015bci do ka\u017cdego subskrybuj\u0105cego (niekoniecznie wie, kto s\u0142ucha).<\/li>\n<li>Gdy subskrybent nas\u0142uchuje, podejmie dzia\u0142anie, gdy tylko je us\u0142yszy.<\/li>\n<li>Gdy kod subskrybenta zostanie wykonany, program powr\u00f3ci do pierwotnego punktu wykonania (czyli tam, gdzie wydawca wys\u0142a\u0142 wiadomo\u015b\u0107).<\/li>\n<\/ol>\n<p>S\u0105 w tym niuanse, takie jak funkcjonalno\u015b\u0107 asynchroniczna i tym podobne, ale to jest bardziej zaawansowane ni\u017c wola\u0142bym w tym konkretnym po\u015bcie. W ko\u0144cu celem tego jest stworzenie podstaw do zrozumienia i wdro\u017cenia funkcjonalno\u015bci.<\/p>\n<p>Funkcjonalno\u015b\u0107 asynchroniczna mo\u017ce wej\u015b\u0107 w w\u0105tki lub Ajax i to s\u0105 wa\u017cne tematy, to nie jest ten post.<\/p>\n<h3>Jak to wygl\u0105da w WordPressie?<\/h3>\n<p>By\u0107 mo\u017ce naj\u0142atwiejszym sposobem opisania tego konkretnego wzorca w WordPressie jest u\u017cycie wywo\u0142a\u0144 funkcji:<\/p>\n<ul>\n<li>zr\u00f3b_dzia\u0142anie<\/li>\n<li>add_action<\/li>\n<\/ul>\n<p>Czasami nazewnictwo mo\u017ce by\u0107 myl\u0105ce, ale po prostu m\u00f3wi\u0105c, <strong>do_action<\/strong> publikuje oraz subskrybent\u00f3w zdarzenia i <strong>add_action<\/strong> do zdarzenia. A mo\u017ce lepszym sposobem my\u015blenia o tym jest<strong>:<\/strong><\/p>\n<p>do_action m\u00f3wi WordPressowi, aby wykona\u0142 wszystkie dodane dzia\u0142ania.<\/p>\n<p>Czasami pomocne jest posiadanie prostych zwrot\u00f3w do zapami\u0119tania, jak to dzia\u0142a. Nie wiem, czy powy\u017csze zdanie jest najbardziej chwytliwym czy najbardziej zapadaj\u0105cym w pami\u0119\u0107, ale to co\u015b, prawda?<\/p>\n<p>Ponadto zauwa\u017c, \u017ce <strong>do_action<\/strong> i <strong>add_action<\/strong> to rzeczy, kt\u00f3re s\u0105 podstaw\u0105 WordPressa i s\u0105 r\u00f3wnie\u017c dost\u0119pne dla naszego rozwoju. Zanim przejdziemy dalej, sp\u00f3jrzmy, co ka\u017cdy z nich oznacza:<\/p>\n<p>Dla <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">do_action<\/a> :<\/p>\n<blockquote>\n<p>Ta funkcja wywo\u0142uje wszystkie funkcje do\u0142\u0105czone do zaczepu akcji <code>$tag<\/code>. Mo\u017cliwe jest tworzenie nowych podpi\u0119\u0107 akcji, po prostu wywo\u0142uj\u0105c t\u0119 \u200b\u200bfunkcj\u0119, okre\u015blaj\u0105c nazw\u0119 nowego podpi\u0119cia za pomoc\u0105 <code>$tag<\/code>parametru.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7466d56bdd.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-162881-61e7466d56bdd.png\" alt=\"Podstawy dzia\u0142ania hook\u00f3w w WordPressie\" ><\/a><\/p>\n<p>Lub pro\u015bciej m\u00f3wi\u0105c:<\/p>\n<blockquote>\n<p>Wykonywanie funkcji zaczepionych o konkretny zaczep akcji.<\/p>\n<\/blockquote>\n<p>Odnosz\u0105c si\u0119 do haczyk\u00f3w, mog\u0105 to by\u0107 <strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Hooks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">haki zdefiniowane przez WordPress<\/a><\/strong> lub niestandardowe haki, kt\u00f3re okre\u015blisz w swoim motywie lub wtyczce.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7467368f0b.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-162881-61e7467368f0b.png\" alt=\"Podstawy dzia\u0142ania hook\u00f3w w WordPressie\" ><\/a><\/p>\n<p>Co do <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">add_action<\/a> :<\/p>\n<blockquote>\n<p>Akcje to haki, kt\u00f3re rdze\u0144 WordPressa uruchamia w okre\u015blonych punktach podczas wykonywania lub gdy wyst\u0105pi\u0105 okre\u015blone zdarzenia. Wtyczki mog\u0105 okre\u015bla\u0107, \u017ce jedna lub wi\u0119cej funkcji PHP jest wykonywanych w tych punktach, u\u017cywaj\u0105c API Action.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7467888f17.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-162881-61e7467888f17.png\" alt=\"Podstawy dzia\u0142ania hook\u00f3w w WordPressie\" ><\/a><\/p>\n<p>I podobnie, pro\u015bciej:<\/p>\n<blockquote>\n<p>Pod\u0142\u0105cza funkcj\u0119 do okre\u015blonej akcji.<\/p>\n<\/blockquote>\n<p>Praktyczne ustawienie tego jest nieco inne, poniewa\u017c generalnie u\u017cywamy <strong>add_action<\/strong> do dodawania w\u0142asnego kodu do WordPressa.<\/p>\n<h3>Praktyczny przyk\u0142ad<\/h3>\n<p>Na przyk\u0142ad, by\u0107 mo\u017ce napisa\u0142e\u015b co\u015b <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/035b213bd632d2ab9fc4a79acffa1342\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">takiego:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nadd_action('wp_insert_post_data', __NAMESPACE__. 'processPermalink');\n\/**\n * Processes the permalink so we can remove any characters that may cause a problem when communicating\n * with the API.\n *\n * @param  array $data The array of information about the post.\n * @return array $data The data without the malformed information in the post name for the URL.\n *\/\npublic function processPermalink($data)\n{\n    if (!in_array($data['post_status'], array('draft', 'pending', 'auto-draft'))) {\n        $data['post_name'] =\n            preg_replace(\n                '\/(%ef%b8%8f|\u2122|\u00ae|\u00a9|\u2122|\u00ae|\u00a9|\u2122|\u00ae|\u00a9)\/',\n                '',\n                $data['post_name']\n            );\n    }\n    return $data;\n}\n<\/code><\/pre>\n<p>W tym przypadku gdzie\u015b w bazie kodu WordPressa znajduje si\u0119 wywo\u0142anie <strong>do_action dla haka<\/strong> <strong>wp_insert_post_data<\/strong>, kt\u00f3re akceptuje funkcj\u0119 i przekazuje jej przynajmniej jeden parametr.<\/p>\n<h3>Dodawanie w\u0142asnych hook\u00f3w<\/h3>\n<p>Ale co, je\u015bli chcesz da\u0107 innym programistom mo\u017cliwo\u015b\u0107 pod\u0142\u0105czenia si\u0119 do Twojej wtyczki lub motywu? W takim przypadku powiniene\u015b zaj\u0105\u0107 si\u0119 u\u017cywaniem do_action, a strona, do kt\u00f3rej link znajduje si\u0119 wcze\u015bniej w tym dokumencie, zawiera wszystko, czego potrzebujesz, aby to skonfigurowa\u0107.<\/p>\n<p>Moim zdaniem jest to o wiele prostsze ni\u017c praca z <strong>add_action<\/strong>, poniewa\u017c <strong>add_action<\/strong> zapewnia, \u017ce \u200b\u200bnie tylko pod\u0142\u0105czamy si\u0119 do istniej\u0105cego wydawcy, ale tak\u017ce dodajemy w\u0142asn\u0105 niestandardow\u0105 logik\u0119.<\/p>\n<p><strong>z kolei do_action<\/strong> wymaga podania nazwy funkcji, kt\u00f3ra ma zosta\u0107 wykonana, a nast\u0119pnie listy argument\u00f3w, kt\u00f3re maj\u0105 zosta\u0107 przekazane do funkcji, kt\u00f3ra ma zosta\u0107 wykonana.<\/p>\n<h2>Ot\u00f3\u017c \u200b\u200bto?<\/h2>\n<p>M\u00f3wi\u0105c tak prosto, jak tylko potrafi\u0119, tak. Istnieje kilka niuans\u00f3w dotycz\u0105cych priorytetu, liczby argument\u00f3w oraz pracy z przestrzeniami nazw i programowaniem obiektowym. Ale znowu jest to poza zakresem tego konkretnego postu. By\u0107 mo\u017ce om\u00f3wi\u0119 to bardziej szczeg\u00f3\u0142owo w innym po\u015bcie.<\/p>\n<p>Na razie jednak, je\u015bli nie znasz podstaw:<\/p>\n<ul>\n<li>wzorzec Pub\/Sub,<\/li>\n<li>zr\u00f3b_dzia\u0142anie,<\/li>\n<li>i add_action<\/li>\n<\/ul>\n<p>Jeste\u015b teraz wystarczaj\u0105co wygodny, aby czyta\u0107 kod, z kt\u00f3rym pracujesz, rozumie\u0107, jak dzia\u0142a kod, a nawet wdra\u017ca\u0107 w\u0142asne rozwi\u0105zania w razie potrzeby.<\/p>\n<p>Obecnie pisz\u0119 e-booka (wraz z wieloma innymi tre\u015bciami premium). Je\u015bli jeste\u015b zainteresowany, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprawd\u017a co otrzymujesz<\/a>.<\/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>Zrozumienie podstaw dzia\u0142ania hook\u00f3w w WordPressie jest wa\u017cne, ale zanim to zrobisz, wa\u017cne jest, aby rozpozna\u0107 le\u017c\u0105cy u ich podstaw wzorzec projektowy.<\/p>\n","protected":false},"author":1,"featured_media":162882,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[866],"tags":[1169],"class_list":["post-230131","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230131","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=230131"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230131\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/162882"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}