{"id":230845,"date":"2022-12-20T18:30:00","date_gmt":"2022-12-20T15:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230845"},"modified":"2022-12-07T10:15:46","modified_gmt":"2022-12-07T07:15:46","slug":"wordpress-widgets-refactoring-del-12","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-12\/","title":{"rendered":"WordPress-widgets: Refactoring, del 12"},"content":{"rendered":"\n<p>N\u00e4r det g\u00e4ller omstruktureringen av WordPress Widget Boilerplate \u2013 s\u00e4rskilt med tanke p\u00e5 hur l\u00e5ngt vi har kommit sedan projektet startade f\u00f6r \u00e5tta \u00e5r sedan \u2013 har vi gjort mycket arbete.<\/p>\n<p>Vi har tagit upp det till en mycket modernare standard och vi g\u00f6r det mycket l\u00e4ttare att arbeta med det s\u00e5 att det borde vara l\u00e4ttare att bygga framtida widgets. Och detta \u00e4r inte bara fr\u00e5n standarden f\u00f6r pannplattan utan fr\u00e5n en objektorienterad standard s\u00e5 att underh\u00e5ll och kodkvalitet \u00e4r h\u00f6gre.<\/p>\n<p>I f\u00f6rra inl\u00e4gget avslutade vi mycket av arbetet f\u00f6r administrationsomr\u00e5det och \u00e4r redo att p\u00e5b\u00f6rja v\u00e5rt arbete med kod f\u00f6r front-end.<\/p>\n<p>Vi sa:<\/p>\n<blockquote>\n<p>D\u00e4refter ska vi titta p\u00e5 rendering av inneh\u00e5ll p\u00e5 front-end. Vi n\u00e4rmar oss slutet, av omstruktureringen av Boilerplate, men det finns bara lite mer att g\u00f6ra innan vi \u00e4r redo att sl\u00e5 samman den i kodbasens huvudgren.<\/p>\n<\/blockquote>\n<p>S\u00e5 i det h\u00e4r inl\u00e4gget ska vi plocka upp d\u00e4r. Om du nu har f\u00f6ljt med fram till denna punkt b\u00f6r du ha allt du beh\u00f6ver fr\u00e5n utvecklingsgrenen.<\/p>\n<p>Om inte, var noga med att dra det eftersom det \u00e4r d\u00e4r vi kommer att ta upp i resten av inl\u00e4gget.<\/p>\n<h2>WordPress Widget Boilerplate: Refactoring del 12<\/h2>\n<p>Nu n\u00e4r det kommer till gr\u00e4nssnittet \u00e4r det l\u00e4tt att t\u00e4nka p\u00e5 gr\u00e4nssnittet som allt som anv\u00e4ndaren ser framf\u00f6r sig, oavsett om det \u00e4r i det administrativa omr\u00e5det eller inte.<\/p>\n<p>Den h\u00e4r serien har dock varit tydlig med att vi delar upp vad anv\u00e4ndaren ser mellan det administrativa omr\u00e5det och det offentliga omr\u00e5det p\u00e5 webbplatsen.<\/p>\n<p>S\u00e5 vad vi kommer att g\u00f6ra \u00e4r att arbeta med omr\u00e5det f\u00f6r koden som \u00e5terger information f\u00f6r anv\u00e4ndaren p\u00e5 det offentliga omr\u00e5det p\u00e5 webbplatsen. Vi kommer att b\u00f6rja med att helt enkelt l\u00e4sa informationen och visa den.<\/p>\n<p>Sedan i n\u00e4sta inl\u00e4gg kommer vi att titta p\u00e5 att arbeta med villkorlig logik ang\u00e5ende n\u00e5gra av alternativen f\u00f6r att se om det \u00e4r n\u00e5got vi beh\u00f6ver g\u00f6ra.<\/p>\n<p>Med det sagt, l\u00e5t oss g\u00e5 in i koden.<\/p>\n<h3>P\u00e5 data vi kommer att visa<\/h3>\n<p>Kom ih\u00e5g att widgeten vid det h\u00e4r laget har tre saker som p\u00e5verkar dess visning:<\/p>\n<ol>\n<li>widgettiteln,<\/li>\n<li>widgetinneh\u00e5llet,<\/li>\n<li>en v\u00e4xel om vi ska visa titeln eller inte<\/li>\n<\/ol>\n<p>Det tredje alternativet \u00e4r i f\u00f6rsta hand att visa hur man anv\u00e4nder en annan typ av element. F\u00f6r tekniskt sett, om vi inte ville visa widgettiteln, skulle vi helt enkelt inte l\u00e4gga in n\u00e5got i widgeten.<\/p>\n<p>Men jag tror att det hj\u00e4lper att visa att anv\u00e4nda olika elementtyper och deras v\u00e4rden p\u00e5 ett praktiskt (eller semi-praktiskt) s\u00e4tt.<\/p>\n<p>Hur som helst, med det sagt, vi vet att f\u00f6r varje given instans av widgeten lagras data med <strong>titeln<\/strong>, <strong>inneh\u00e5llet<\/strong> och <strong>visningstitelns<\/strong> namn och ID som tillhandah\u00e5lls av WordPress.<\/p>\n<p>D\u00e4rf\u00f6r kommer vi att anv\u00e4nda dem i v\u00e5r front-end-kod f\u00f6r att visa v\u00e4rdena.<\/p>\n<h3>F\u00f6rbereder displayfunktionerna<\/h3>\n<p>Vanligtvis \u00e4r <strong>widgetfunktionen<\/strong> ansvarig f\u00f6r att visa utdata fr\u00e5n widgeten. Men en av sakerna vi har f\u00f6rs\u00f6kt g\u00f6ra \u00e4r att dela upp problemen med v\u00e5r widget i en mer fokuserad upps\u00e4ttning klasser och funktioner.<\/p>\n<p>Det f\u00f6rsta vi vill g\u00f6ra \u00e4r att skriva en <strong>WidgetDisplay-<\/strong> klass som kommer att ansvara f\u00f6r, vilket s\u00e4kert \u00e4r uppenbart, visa inneh\u00e5llet i widgeten.<\/p>\n<p>F\u00f6r n\u00e4rvarande kommer detta ovillkorligen att inkludera titeln, inneh\u00e5llet och v\u00e4rdet av om titeln ska inkluderas eller inte. WordPress g\u00f6r ocks\u00e5 tillg\u00e4ngligt visst inneh\u00e5ll som uppm\u00e4rkning som ska visas f\u00f6re widgeten och efter widgeten, s\u00e5 vi kommer att se till att inkludera det ocks\u00e5.<\/p>\n<p>Men f\u00f6rst, l\u00e5t oss bara <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-00-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sl\u00e4nga ut klassen<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplateWordPress;\n\nclass WidgetDisplay\n{\n  private $widgetSlug;\n\n  public function __construct(string $widgetSlug)\n  {\n      $this-&gt;widgetSlug = $widgetSlug;\n  }\n\n  public function show($args, $instance)\n  {\n    \/\/ More to come\n  }\n}\n<\/code><\/pre>\n<p>Efter det m\u00e5ste vi se till att vi skriver upp det till de andra klasserna ocks\u00e5. F\u00f6rst ska vi se till att inkludera <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-01-widget-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">det i v\u00e5r Widget-klass<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function widget($args, $instance)\n{\n    return $this-&gt;widgetDisplay-&gt;show($args, $instance);\n}<\/code><\/pre>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-02-widget-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Och sedan l\u00e4gger<\/a> vi till den i WidgetAdmin-klassen (eftersom det \u00e4r h\u00e4r de centrala Widget API-funktionerna finns \u2013 den delegerar bara ansvaret till r\u00e4tt klass):<\/p>\n<pre><code>&lt;?php\n\npublic function __construct($widgetSlug)\n{\n    parent::__construct($widgetSlug);\n    $this-&gt;widgetSerializer = new WidgetSerializer($this-&gt;getWidgetSlug());\n    $this-&gt;widgetDisplay = new WidgetDisplay($this-&gt;getWidgetSlug());\n}<\/code><\/pre>\n<p>F\u00f6r n\u00e4rvarande visar vi ingenting \u00e4nnu. Vi \u00e4r n\u00e4ra och vi kommer att fokusera p\u00e5 det snart.<\/p>\n<h3>Visar data<\/h3>\n<p>F\u00f6rutsatt att du kan l\u00e4gga till ovanst\u00e5ende kod utan fel, \u00e4r det dags att visa inneh\u00e5llet i widgeten.<\/p>\n<p>Vi kan g\u00f6ra detta p\u00e5 valfritt antal s\u00e4tt fr\u00e5n en enkel <strong>var_dump<\/strong> till att faktiskt arbeta f\u00f6r att visa inneh\u00e5llet p\u00e5 ett mer anv\u00e4ndarv\u00e4nligt s\u00e4tt. Och jag \u00e4r mycket mer ett fan av det sistn\u00e4mnda.<\/p>\n<p>S\u00e5 l\u00e5t oss g\u00f6ra det.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-04-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">L\u00e4gg till f\u00f6ljande kod<\/a> i <strong>showfunktionen<\/strong> f\u00f6r din <strong>WidgetDisplay-<\/strong> klass :<a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-04-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<pre><code>&lt;?php\npublic function show($args, $instance)\n{\n    include_once 'Views\/Widget.php';\n}<\/code><\/pre>\n<p>Och d\u00e5 kan vyn f\u00f6r mallen vara s\u00e5 enkel <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">som denna<\/a> :<\/p>\n<pre><code>&lt;div id=\"&lt;?php echo $args['id']; ?&gt;\"&gt;\n    &lt;h3 class=\"widget-title\"&gt;&lt;?php echo $instance['title']; ?&gt;&lt;\/h3&gt;\n    &lt;p&gt;&lt;?php echo $instance['content']; ?&gt;&lt;\/p&gt;\n    &lt;pre&gt;&lt;?php echo $instance['display-title']; ?&gt;&lt;\/pre&gt;\n&lt;\/div&gt;&lt;!-- #&lt;?php echo $args['id']; ?&gt;--&gt;<\/code><\/pre>\n<p>Detta s\u00e4kerst\u00e4ller att r\u00e4tt uppm\u00e4rkning f\u00f6r allt inneh\u00e5ll f\u00f6re widgeten, inneh\u00e5llet i widgeten och inneh\u00e5llet \u00e4r korrekt renderat.<\/p>\n<p>\u00c5terigen, kom ih\u00e5g att vi visar en del inneh\u00e5ll som inte kommer att finnas i den slutliga versionen av detta, men vi n\u00e4rmar oss och vi kommer att ta upp det i n\u00e4sta inl\u00e4gg.<\/p>\n<p>Jag skulle rekommendera att leka med\u00a0 alternativet <strong>Visa titel<\/strong> f\u00f6r att se hur det renderas p\u00e5 front-end med tanke p\u00e5 uppm\u00e4rkningen vi har tillhandah\u00e5llit.<\/p>\n<p>F\u00f6r n\u00e4rvarande b\u00f6r utdata fr\u00e5n widgeten se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160763-61e7125f80aab.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-160763-61e7125f80aab.png\" alt=\"WordPress-widgets: Refactoring, del 12\" ><\/a><\/p>\n<p>Men det \u00e4r allt som finns att ta upp i det h\u00e4r inl\u00e4gget.<\/p>\n<h2>In i Final Refactor<\/h2>\n<p>Det sista vi kommer att titta p\u00e5 efter detta \u00e4r att sk\u00e4rpa upp en del av den villkorliga logiken tillsammans med ett ord om cachning av data (eftersom vi redan g\u00f6r lite av det i tidigare inl\u00e4gg).<\/p>\n<p>\u00c4n s\u00e5 l\u00e4nge kan du dock leka med vad vi har h\u00e4r tillsammans med koden som vi inte har inkluderat (som vad som kan visas f\u00f6re eller efter widgeten.<\/p>\n<p>De har medvetet utel\u00e4mnats fr\u00e5n det h\u00e4r exemplet men de kanske inte alltid utel\u00e4mnas beroende p\u00e5 vilket arbete du utf\u00f6r.<\/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>Vi kommer att arbeta med det omr\u00e5de av koden som \u00e5terger information f\u00f6r anv\u00e4ndaren p\u00e5 den offentliga delen av webbplatsen.<\/p>\n","protected":false},"author":1,"featured_media":234987,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,724,868],"tags":[1173],"class_list":["post-230845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230845","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=230845"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230845\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/234987"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}