{"id":228359,"date":"2022-10-22T09:54:00","date_gmt":"2022-10-22T06:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228359"},"modified":"2022-11-09T02:03:07","modified_gmt":"2022-11-08T23:03:07","slug":"stoppa-exekvering-av-plugin-utan-ett-beroende","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/stoppa-exekvering-av-plugin-utan-ett-beroende\/","title":{"rendered":"Stoppa exekvering av plugin utan ett beroende"},"content":{"rendered":"\n<p>Om du n\u00e4rmar dig mycket WordPress-pluginutveckling ur ett objektorienterat perspektiv, kommer du s\u00e5 sm\u00e5ningom att n\u00e5 en punkt d\u00e4r du inte g\u00f6r mycket interaktion direkt med sj\u00e4lva WordPress-k\u00e4rnan.<\/p>\n<p>Och i mina \u00f6gon \u00e4r det en bra sak. Det \u00e4r ett tecken p\u00e5 en arkitektur att du strukturerar din kod korrekt. Det \u00e4r:<\/p>\n<ol>\n<li>Du har WordPress p\u00e5 grundniv\u00e5,<\/li>\n<li>Du har en upps\u00e4ttning klasser som sitter precis ovanf\u00f6r WordPress och ansvarar f\u00f6r att skicka information till och fr\u00e5n WordPress mellan plugin,<\/li>\n<li>Och du har resten av din kod som omfattar resten av funktionaliteten.<\/li>\n<\/ol>\n<p>Hur detta implementeras kan variera, men det allm\u00e4nna s\u00e4ttet jag f\u00f6rest\u00e4ller mig detta \u00e4r p\u00e5 samma s\u00e4tt som jag brukar t\u00e4nka p\u00e5 standard <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multitier_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">N-tier-<\/a> applikationen d\u00e4r du har datalagret, applikationslagret och front-end.<\/p>\n<p>F\u00f6rutom den h\u00e4r g\u00e5ngen har du WordPress, ett lager f\u00f6r att kommunicera med WordPress och resten av din kod, och, du vet, resten av din kod.<\/p>\n<p>Hur ett plugin kan organiseras.<\/p>\n<p>S\u00e5 vad h\u00e4nder n\u00e4r du vill stoppa k\u00f6rning av plugin n\u00e4r det m\u00e5ste interagera med ett tredjepartsberoende och bara ska k\u00f6ras om det beroendet finns?<\/p>\n<h2>Stoppa utf\u00f6rande av plugin<\/h2>\n<p>P\u00e5 grund av PHP och WordPresss natur finns det n\u00e5gra s\u00e4tt att g\u00f6ra detta p\u00e5. Koden jag ska dela med mig av f\u00f6reskriver inte hur man g\u00f6r det.<\/p>\n<p>Ist\u00e4llet \u00e4r detta ett s\u00e4tt att g\u00f6ra det (som har h\u00e4mtats fr\u00e5n n\u00e5got som \u00e4r under utveckling). Vidare kommer jag att visa hur det interagerar med n\u00e5gra andra komponenter i plugins ocks\u00e5.<\/p>\n<h3>1 Konstrukt\u00f6ren<\/h3>\n<p>Om du l\u00e4ser tillr\u00e4ckligt m\u00e5nga artiklar om WordPress och objektorienterad programmering, kommer du sannolikt att uppt\u00e4cka att konstrukt\u00f6rer inte b\u00f6r anv\u00e4ndas f\u00f6r att definiera krokar. Och jag h\u00e5ller med.<\/p>\n<p>Det skapar en on\u00f6dig niv\u00e5 av koppling, och det g\u00f6r att testa saker sv\u00e5rare. Vad \u00e4r d\u00e5 syftet med en konstrukt\u00f6r i WordPress-baserad kod?<\/p>\n<p>Jag anv\u00e4nder det av samma sk\u00e4l som du kan f\u00f6rv\u00e4nta dig p\u00e5 alla andra spr\u00e5k: F\u00f6r att initiera klassens egenskaper. I koden nedan kommer du att se tre saker:<\/p>\n<ol>\n<li>Jag initierar en egenskap,<\/li>\n<li>Jag kontrollerar om det finns ett tredjepartsberoende,<\/li>\n<li>Om det inte g\u00f6r det l\u00e4gger jag till ett felmeddelande,<\/li>\n<li>Jag uppdaterar fastigheten.<\/li>\n<\/ol>\n<p>Visst, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-00-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">det \u00e4r utf\u00f6rligt<\/a>, men det tar inte heller till smart kod f\u00f6r att initiera v\u00e4rden.<\/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>(Ju \u00e4ldre jag har blivit, desto mer har jag blivit f\u00f6rtjust i specifik kod eftersom det g\u00f6r det l\u00e4ttare att l\u00e4sa, plocka upp och komma ig\u00e5ng med i en snabbare takt \u00e4n alternativet.)<\/p>\n<h3>2 Initieringsmetoden<\/h3>\n<p>Eftersom vi inte anv\u00e4nder en konstruktor f\u00f6r att arbeta med WordPress-krokar, b\u00f6r denna funktionalitet existera inom ramen f\u00f6r en annan metod.<\/p>\n<p>Detta ger oss en dedikerad plats f\u00f6r att s\u00e4tta den h\u00e4r typen av funktionalitet, frikoppla den fr\u00e5n resten av klassen och f\u00e5 den att interagera med WordPress endast n\u00e4r metoden uttryckligen anropas.<\/p>\n<p>Men kom ih\u00e5g att hela po\u00e4ngen med det jag kommer till har att g\u00f6ra med att stoppa exekveringen av ett plugin \u2013 inte var man ska placera krokar.<\/p>\n<p>S\u00e5 l\u00e5t oss s\u00e4ga att tredjepartsberoendet inte existerar, vad d\u00e5? Minns i konstruktorn sattes en egenskap som g\u00f6r att vi kan avg\u00f6ra <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-01-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">om vi ska g\u00e5 vidare<\/a> med att s\u00e4tta upp krokar eller inte:<\/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>Och n\u00e4r det \u00e4r p\u00e5 plats kommer resten av koden inte att k\u00f6ras.<\/p>\n<h2>M\u00e5nga ord, lite kod<\/h2>\n<p>Det l\u00e5ter som en hel del f\u00f6rklaringar till s\u00e5 v\u00e4ldigt lite kod.<\/p>\n<p>Men en del av detta \u00e4r ocks\u00e5 att f\u00f6rs\u00f6ka f\u00f6rmedla betydelsen av att ha delar av ett WordPress-baserat projekt separerade fr\u00e5n resten av k\u00e4rnan s\u00e5 att delarna kan interagera med sig sj\u00e4lva utan att uttryckligen beh\u00f6va prata med k\u00e4rnan hela tiden.<\/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>Vad h\u00e4nder n\u00e4r du vill stoppa k\u00f6rning av plugin n\u00e4r det m\u00e5ste fungera med ett tredjepartsberoende och bara b\u00f6r g\u00f6ra det om det finns?<\/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":[901,922,807,724,868],"tags":[1173],"class_list":["post-228359","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-oevrig","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228359","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=228359"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228359\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/221144"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}