{"id":230211,"date":"2022-12-05T13:47:00","date_gmt":"2022-12-05T10:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230211"},"modified":"2022-11-09T20:37:03","modified_gmt":"2022-11-09T17:37:03","slug":"grunderna-foer-action-hooks-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/grunderna-foer-action-hooks-i-wordpress\/","title":{"rendered":"Grunderna f\u00f6r Action Hooks i WordPress"},"content":{"rendered":"\n<p>N\u00e4r som helst n\u00e5gon g\u00e5ng b\u00f6rjar komma in i mer avancerad programmering \u2013 vare sig det \u00e4r i WordPress eller n\u00e5got annat ramverk, bibliotek, grund eller programmeringsspr\u00e5k \u2013 det finns tillf\u00e4llen d\u00e5 nya koncept ofta kan vara sv\u00e5rare att f\u00f6rst\u00e5 \u00e4n andra.<\/p>\n<p>Jag har i allm\u00e4nhet tyckt att detta \u00e4r sant n\u00e4r en person har l\u00e4rt sig grunderna i till exempel objektorienterad programmering men inte har blivit utsatt f\u00f6r nyanserna i vissa saker som designm\u00f6nster.<\/p>\n<p>Exempel: Jag har skrivit om <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">det h\u00e4ndelsedrivna designm\u00f6nstret<\/a><\/strong> (eller <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">publicera-prenumerera<\/a><\/strong> eller Pub\/Sub som vissa gillar att h\u00e4nvisa till det) <strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i andra inl\u00e4gg.<\/a><\/strong><\/p>\n<p>Ja, det finns vissa skillnader f\u00f6r var och en, men den allm\u00e4nna id\u00e9n \u00e4r att n\u00e5got h\u00e4nder och en h\u00e4ndelse tas upp och allt som lyssnar p\u00e5 den h\u00e4ndelsen, eller prenumererar p\u00e5 den h\u00e4ndelsen, kommer att svara.<\/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=\"Grunderna f\u00f6r Action Hooks i WordPress\" ><\/a><\/p>\n<p>Foto av Claus Gr\u00fcnst\u00e4udl p\u00e5 Unsplash<\/p>\n<p>Detta \u00e4r det prim\u00e4ra m\u00f6nstret som WordPress anv\u00e4nder som g\u00f6r att vi bokstavligen kan ansluta till vissa exekveringspunkter. Vi kan generellt f\u00f6rest\u00e4lla dessa som actionhooks i WordPress.<\/p>\n<p>Hur som helst, applikationen g\u00f6r vissa punkter tillg\u00e4ngliga f\u00f6r oss att l\u00e4gga till v\u00e5r egen funktionalitet. N\u00e4r den funktionen \u00e4r registrerad kommer WordPress att l\u00e4mna sin kodbas, s\u00e5 att s\u00e4ga, hoppa in i v\u00e5r och sedan \u00e5terv\u00e4nda till v\u00e5r.<\/p>\n<p>Det \u00e4r l\u00e4tt nog att f\u00f6rst\u00e5, men vad h\u00e4nder om du vill exponera omr\u00e5den i din kod som l\u00e5ter andra haka in i din kod?<\/p>\n<h2>Action Hooks i WordPress<\/h2>\n<p>Innan du tittar p\u00e5 hur WordPress implementerar detta m\u00f6nster \u00e4r det viktigt att f\u00f6rst\u00e5 grunderna i detta m\u00f6nster. \u00c4ven om detta inte p\u00e5 n\u00e5got s\u00e4tt \u00e4r helt\u00e4ckande, \u00e4r det t\u00e4nkt att ge en grundl\u00e4ggande f\u00f6rst\u00e5else f\u00f6r m\u00f6nstret s\u00e5 att det \u00e4r m\u00f6jligt att l\u00e4sa och skriva WordPress-centrerad kod.<\/p>\n<p>S\u00e5 vad \u00e4r ett bra s\u00e4tt att t\u00e4nka p\u00e5 Pub\/Sub-m\u00f6nstret? <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Wikipedia definierar det som:<\/a><\/strong><\/p>\n<blockquote>\n<p>Inom mjukvaruarkitektur \u00e4r publicera\u2013prenumerera ett meddelandem\u00f6nster d\u00e4r avs\u00e4ndare av meddelanden, kallade publicister, inte programmerar meddelandena f\u00f6r att skickas direkt till specifika mottagare, kallade prenumeranter, utan ist\u00e4llet kategoriserar publicerade meddelanden i klasser utan att veta vilka prenumeranter, om n\u00e5gra., det kan finnas. P\u00e5 samma s\u00e4tt uttrycker prenumeranter intresse f\u00f6r en eller flera klasser och f\u00e5r endast meddelanden som \u00e4r av intresse, utan att veta vilka utgivare, om n\u00e5gra, det finns.<\/p>\n<\/blockquote>\n<h3>F\u00f6rst\u00e5 m\u00f6nstret<\/h3>\n<p>Det h\u00e4r kan vara mycket att ta in i b\u00f6rjan. Jag vet inte, men l\u00e5t oss dela upp det:<\/p>\n<ol>\n<li>Det finns en tj\u00e4nst, i v\u00e5rt fall WordPress, som ansvarar f\u00f6r att publicera meddelanden till den som prenumererar (den vet inte n\u00f6dv\u00e4ndigtvis vem som lyssnar).<\/li>\n<li>N\u00e4r en abonnent lyssnar, kommer den att vidta \u00e5tg\u00e4rder n\u00e4rhelst den h\u00f6r den \u00e5tg\u00e4rden.<\/li>\n<li>N\u00e4r abonnentens kod \u00e4r klar kommer programmet att \u00e5terg\u00e5 till den ursprungliga exekveringspunkten (som \u00e4r dit utgivaren skickade meddelandet).<\/li>\n<\/ol>\n<p>Det finns nyanser i detta som asynkron funktionalitet och s\u00e5nt, men det \u00e4r mer avancerat \u00e4n jag skulle f\u00f6redra att f\u00e5 i just det h\u00e4r inl\u00e4gget. Syftet med detta \u00e4r trots allt att l\u00e4gga en grund f\u00f6r att f\u00f6rst\u00e5 och implementera funktionalitet.<\/p>\n<p>Asynkron funktionalitet kan komma in i tr\u00e5dning eller Ajax och genom dessa \u00e4r viktiga \u00e4mnen, det h\u00e4r \u00e4r inte det inl\u00e4gget.<\/p>\n<h3>Hur ser det h\u00e4r ut i WordPress?<\/h3>\n<p>Det kanske enklaste s\u00e4ttet att beskriva just detta m\u00f6nster i WordPress \u00e4r genom att anv\u00e4nda funktionsanropen:<\/p>\n<ul>\n<li>do_action<\/li>\n<li>add_action<\/li>\n<\/ul>\n<p>Ibland kan nomenklaturen vara f\u00f6rvirrande men enkelt uttryckt, <strong>do_action<\/strong> publicerar och en h\u00e4ndelse och <strong>add_action-<\/strong> prenumeranter till en h\u00e4ndelse. Eller kanske ett b\u00e4ttre s\u00e4tt att t\u00e4nka p\u00e5 det \u00e4r<strong>:<\/strong><\/p>\n<p>do_action s\u00e4ger \u00e5t WordPress att utf\u00f6ra de \u00e5tg\u00e4rder som har lagts till.<\/p>\n<p>Ibland \u00e4r det bra att ha enkla fraser f\u00f6r att komma ih\u00e5g hur saker fungerar. Jag vet inte om ovanst\u00e5ende \u00e4r den mest catchy frasen eller mest minnesv\u00e4rd, men det \u00e4r n\u00e5got, eller hur?<\/p>\n<p>Observera dessutom att <strong>do_action<\/strong> och <strong>add_action<\/strong> \u00e4r saker som \u00e4r k\u00e4rnan i WordPress och \u00e4ven \u00e4r tillg\u00e4ngliga f\u00f6r v\u00e5r utveckling. Innan vi g\u00e5r vidare, l\u00e5t oss ta en titt p\u00e5 vad var och en betyder:<\/p>\n<p>F\u00f6r <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>Den h\u00e4r funktionen anropar alla funktioner som \u00e4r kopplade till actionkroken <code>$tag<\/code>. Det \u00e4r m\u00f6jligt att skapa nya actionkrokar genom att helt enkelt anropa denna funktion, ange namnet p\u00e5 den nya kroken med <code>$tag<\/code>parametern.<\/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=\"Grunderna f\u00f6r Action Hooks i WordPress\" ><\/a><\/p>\n<p>Eller \u00e4nnu enklare uttryckt:<\/p>\n<blockquote>\n<p>Utf\u00f6r funktioner kopplade till en specifik actionkrok.<\/p>\n<\/blockquote>\n<p>N\u00e4r du h\u00e4nvisar till krokar kan detta antingen vara <strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Hooks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">krokar definierade av WordPress<\/a><\/strong> eller anpassade krokar som du anger i ditt tema eller din plugin.<\/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=\"Grunderna f\u00f6r Action Hooks i WordPress\" ><\/a><\/p>\n<p>N\u00e4r det g\u00e4ller <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>\u00c5tg\u00e4rder \u00e4r de krokar som WordPress-k\u00e4rnan lanserar vid specifika punkter under exekvering, eller n\u00e4r specifika h\u00e4ndelser intr\u00e4ffar. Plugins kan ange att en eller flera av dess PHP-funktioner exekveras vid dessa punkter, med hj\u00e4lp av Action API.<\/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=\"Grunderna f\u00f6r Action Hooks i WordPress\" ><\/a><\/p>\n<p>Och p\u00e5 liknande s\u00e4tt, enklare uttryckt:<\/p>\n<blockquote>\n<p>Kopplar en funktion till en specifik \u00e5tg\u00e4rd.<\/p>\n<\/blockquote>\n<p>Att st\u00e4lla in detta praktiskt \u00e4r lite annorlunda eftersom vi vanligtvis anv\u00e4nder <strong>add_action<\/strong> f\u00f6r att l\u00e4gga till v\u00e5r egen kod till WordPress.<\/p>\n<h3>Ett praktiskt exempel<\/h3>\n<p>Till exempel kanske du har skrivit n\u00e5got <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/035b213bd632d2ab9fc4a79acffa1342\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r:<\/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>I det h\u00e4r fallet, n\u00e5gonstans i WordPress-kodbasen finns det ett <strong>do_action<\/strong> -anrop f\u00f6r <strong>wp_insert_post_data-<\/strong> kroken och den accepterar en funktion och skickar den minst en enda parameter.<\/p>\n<h3>L\u00e4gga till dina egna krokar<\/h3>\n<p>Men vad h\u00e4nder om du vill ge andra utvecklare m\u00f6jlighet att ansluta till ditt plugin eller tema? I s\u00e5 fall b\u00f6r du bry dig om att anv\u00e4nda do_action och sidan som l\u00e4nkades tidigare i detta dokument ger allt du beh\u00f6ver f\u00f6r att st\u00e4lla in detta.<\/p>\n<p>Det \u00e4r faktiskt mycket enklare, enligt min mening, \u00e4n att arbeta med <strong>add_action<\/strong> eftersom <strong>add_action<\/strong> ger att vi inte bara kopplar in oss i en befintlig utgivare, utan att vi l\u00e4gger till v\u00e5r egen anpassade logik.<\/p>\n<p><strong>do_action<\/strong> \u00e5 andra sidan kr\u00e4ver att vi anger ett namn p\u00e5 funktionen som ska k\u00f6ras och sedan listan med argument som ska skickas till funktionen som ska k\u00f6ras.<\/p>\n<h2>Det \u00e4r allt?<\/h2>\n<p>I ungef\u00e4r s\u00e5 enkla termer som jag kan g\u00f6ra det, ja. Det finns en del nyanser kring prioritet, antal argument och att arbeta med namnrymder och objektorienterad programmering. Men \u00e5terigen, det ligger utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg. Jag kanske ska g\u00e5 in p\u00e5 det mer ing\u00e5ende i ett annat inl\u00e4gg.<\/p>\n<p>Men f\u00f6r nu, om du inte \u00e4r bekant med grunderna i:<\/p>\n<ul>\n<li>Pub\/Sub-m\u00f6nstret,<\/li>\n<li>do_action,<\/li>\n<li>och add_action<\/li>\n<\/ul>\n<p>Du \u00e4r nu bekv\u00e4m nog att l\u00e4sa koden du arbetar med, f\u00f6rst\u00e5 hur koden fungerar och till och med implementera dina egna l\u00f6sningar n\u00e4r det beh\u00f6vs.<\/p>\n<p>Jag h\u00e5ller f\u00f6r n\u00e4rvarande p\u00e5 att skriva en e-bok (tillsammans med en m\u00e4ngd annat premiuminneh\u00e5ll). Om du \u00e4r intresserad, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kolla in vad du f\u00e5r<\/a>.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Att f\u00f6rst\u00e5 grunderna f\u00f6r actionhooks i WordPress \u00e4r viktigt, men innan du g\u00f6r det \u00e4r det viktigt att k\u00e4nna igen det underliggande designm\u00f6nstret.<\/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":[868],"tags":[1173],"class_list":["post-230211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230211"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230211\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/162882"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}