{"id":230710,"date":"2022-12-17T09:15:00","date_gmt":"2022-12-17T06:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230710"},"modified":"2022-12-07T11:44:09","modified_gmt":"2022-12-07T08:44:09","slug":"wordpress-widgets-refactoring-del-5","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-5\/","title":{"rendered":"WordPress-widgets: Refactoring, del 5"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">I det f\u00f6reg\u00e5ende inl\u00e4gget<\/a><\/strong> skapade vi ett register som kommer att anv\u00e4ndas f\u00f6r att lagra alla olika klasser som \u00e4r ansvariga f\u00f6r att ge v\u00e5r widget dess funktionalitet.<\/p>\n<p>F\u00f6r att g\u00f6ra detta kommer det att introduceras en m\u00e4ngd andra klasser, men innan vi g\u00e5r dit m\u00e5ste vi l\u00e4gga till registret i pluginens bootstrap (l\u00e5t vara att skapa en bootstrap f\u00f6r pluginet).<\/p>\n<p>Specifikt, h\u00e4r \u00e4r d\u00e4r vi slutade:<\/p>\n<blockquote>\n<p>Som n\u00e4mnts tidigare i inl\u00e4gget m\u00e5ste vi l\u00e4gga till detta till pluginets bootstrap. F\u00f6r att g\u00f6ra detta m\u00e5ste vi dock definiera v\u00e5rt eget filter s\u00e5 att vi enkelt kan skicka registret runt resten av pluginet (n\u00e4r det \u00e4r dags att g\u00f6ra det).<\/p>\n<\/blockquote>\n<p>S\u00e5 i det h\u00e4r inl\u00e4gget kommer vi att fokusera p\u00e5 att g\u00f6ra exakt det.<\/p>\n<h2>WordPress Widget Boilerplate: Refactoring, del 5<\/h2>\n<p>Om du har f\u00f6ljt med serien fram till denna punkt, b\u00f6r du vara i en bra position specifikt f\u00f6r att l\u00e4gga till registret s\u00e5 att vi har tillg\u00e5ng till det genom hela pluginet.<\/p>\n<p>F\u00f6r att g\u00f6ra detta f\u00f6ruts\u00e4tter du dock att du vet hur du definierar dina filter. I WordPress <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">anv\u00e4nder vi \u00e5tg\u00e4rder och filter hela tiden<\/a>.<\/p>\n<p>Grejen med dessa krokar \u00e4r att de redan \u00e4r definierade. S\u00e5 hur definierar vi v\u00e5rt filter?<\/p>\n<p>L\u00e5t oss ta en titt p\u00e5 att g\u00f6ra exakt det.<\/p>\n<h3>1 Definiera v\u00e5rt filter<\/h3>\n<p>F\u00f6rst m\u00e5ste vi f\u00f6rst\u00e5 n\u00e5gra begrepp:<\/p>\n<ul>\n<li>vad \u00e4r ett filter,<\/li>\n<li>hur man l\u00e4gger till ett filter,<\/li>\n<li>hur man introducerar v\u00e5rt register i filtret<\/li>\n<li>hur man h\u00e4mtar klassen fr\u00e5n filtret.<\/li>\n<\/ul>\n<p>Lyckligtvis \u00e4r allt ovanst\u00e5ende l\u00e4tt att f\u00f6rklara.<\/p>\n<h4>Vad \u00e4r ett filter?<\/h4>\n<p>Enkelt uttryckt l\u00e5ter krokar oss anropa WordPress vid specifika tidpunkter under programmets k\u00f6rning. Handlingar \u00e4r vanligtvis reserverade f\u00f6r beteende; Filter \u00e4r reserverade f\u00f6r data.<\/p>\n<p>Dessutom till\u00e5ter filter oss att arbeta med specifik data i applikationen \u2013 det kan vara redan existerande data eller till och med ny data. Och i v\u00e5rt fall kommer det att vara Registry-klassen som inneh\u00e5ller referenser till andra data.<\/p>\n<h4>L\u00e4gga till ett filter<\/h4>\n<p>Det \u00e4r enkelt att l\u00e4gga till ett filter. Den har tre delar:<\/p>\n<ol>\n<li>anropar <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">add_filter<\/a> ,<\/li>\n<li>definiera en unik identifierare f\u00f6r filtret,<\/li>\n<li>skickar information till filtret som kan returneras n\u00e4rhelst det anropas.<\/li>\n<\/ol>\n<p>F\u00f6r oss kommer jag att identifiera v\u00e5rt register som <strong>wpWidgetRegistry-<\/strong> filtret. Observera dock att det \u00e4r viktigt att du v\u00e4ljer ett unikt namn f\u00f6r din implementering eftersom om du inte g\u00f6r det kan du f\u00e5 kollisioner med annan data om ett annat plugin anv\u00e4nder samma identifierade.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc432bb7.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-161108-61e71bc432bb7.png\" alt=\"WordPress-widgets: Refactoring, del 5\" ><\/a><\/p>\n<p>Hur som helst, att l\u00e4gga till ett filter utf\u00f6r en enkel uppgift:<\/p>\n<blockquote>\n<p>Koppla en funktion eller metod till en specifik filter\u00e5tg\u00e4rd.<\/p>\n<\/blockquote>\n<p>S\u00e5 detta betyder att vi m\u00e5ste definiera en metod med v\u00e5rt ID. P\u00e5 grund av PHPs natur beh\u00f6ver vi inte anv\u00e4nda en separat funktion.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc81c90d.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-161108-61e71bc81c90d.png\" alt=\"WordPress-widgets: Refactoring, del 5\" ><\/a><\/p>\n<p>Ist\u00e4llet kan vi anv\u00e4nda <a href=\"https:\/\/secure.php.net\/manual\/en\/functions.anonymous.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en anonym funktion<\/a>.<\/p>\n<blockquote>\n<p>Anonyma funktioner, \u00e4ven k\u00e4nda som st\u00e4ngningar, till\u00e5ter skapandet av funktioner som inte har n\u00e5got specificerat namn. De \u00e4r mest anv\u00e4ndbara som v\u00e4rdet av \u00e5teruppringningsparametrar, men de har m\u00e5nga andra anv\u00e4ndningsomr\u00e5den.<\/p>\n<\/blockquote>\n<p>Den anonyma funktionen som vi kommer att definiera kommer att acceptera en referens till pluginet som ett argument och sedan returnera det n\u00e4r filtret anropas (vilket kommer att visas senare i den h\u00e4r artikeln).<\/p>\n<h4>Skicka information till v\u00e5rt filter<\/h4>\n<p>Nu n\u00e4r vi har t\u00e4ckt allt detta kan vi g\u00e5 igenom processen att skapa en instans av v\u00e5rt register, definiera ett filter och sedan l\u00e4gga till registret s\u00e5 att det \u00e4r tillg\u00e4ngligt i hela applikationen.<\/p>\n<p>S\u00e5 inom huvudpluginfilen, det vill s\u00e4ga <strong>wordpress-widget-boilerplate.php-<\/strong> filen, l\u00e4gger vi till <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-00-bootstrap-namespace-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6ljande kodrader<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\n\n\/\/ More to come...\n<\/code><\/pre>\n<p>Ovanst\u00e5ende deklarerar namnutrymmet d\u00e4r registret finns. Sedan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-01-bootstrap-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00e4gger vi till f\u00f6ljande kodblock under autoloadern:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpWidgetRegistry', function() use ($registry) {\n    return $registry;\n});\n<\/code><\/pre>\n<p>Observera att n\u00e4r du siktar p\u00e5 att aktivera insticksprogrammet kommer det inte att aktiveras och kommer att ge ett fel. Detta beror p\u00e5 bristen p\u00e5 en autoloader som kommer att diskuteras i n\u00e4sta inl\u00e4gg.<\/p>\n<h3>2 H\u00e4mta v\u00e5rt register<\/h3>\n<p>Eftersom registret \u00e4r definierat i pluginets bootstrap och g\u00f6rs genom att anv\u00e4nda ett filter, kan vi komma \u00e5t registret var som helst i v\u00e5rt plugin genom att anropa v\u00e5rt anpassade filter.<\/p>\n<p>L\u00e5t oss till exempel s\u00e4ga att vi \u00e4r i en annan klass och vi beh\u00f6ver f\u00e5 en referens till registret. F\u00f6r att g\u00f6ra detta kan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-02-retrieve-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vi ringa detta samtal<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Retrieve the registry anywhere in the plugin.\n$registry = apply_filters('wpWidgetRegistry', null);\n<\/code><\/pre>\n<p>Och det \u00e4r allt. L\u00e4tt, eller hur? S\u00e5 l\u00e4nge allt har lagts till ordentligt i registret \u2013 som kommer att t\u00e4ckas snart \u2013 s\u00e5 kommer vi att kunna komma \u00e5t dem alla genom de unika identifierarna som vi anv\u00e4nde i <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6reg\u00e5ende inl\u00e4gg.<\/a><\/p>\n<h2>Autoloadern<\/h2>\n<p>Nu b\u00f6rjar vi anv\u00e4nda namnutrymmen och anv\u00e4nda andra klasser. Det betyder att vi kommer att beh\u00f6va anv\u00e4nda autoloaders.<\/p>\n<p>S\u00e5 innan vi g\u00e5r in p\u00e5 att omstrukturera hela klassen som den ser ut just nu, kommer vi att ta en liten omv\u00e4g till n\u00e5gra av funktionerna i Composer f\u00f6r att se hur den anv\u00e4nds f\u00f6r att generera en autoloader (ut\u00f6ver de saker vi redan har anv\u00e4nder den f\u00f6r att hantera kvaliteten p\u00e5 v\u00e5r k\u00e4llkod).<\/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>N\u00e4r vi v\u00e4l har ett register m\u00e5ste vi kunna komma \u00e5t det genom hela v\u00e5rt plugin och vi g\u00f6r det med anpassade krokar.<\/p>\n","protected":false},"author":1,"featured_media":236152,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,807,724,868],"tags":[1173],"class_list":["post-230710","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230710","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=230710"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230710\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236152"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}