{"id":230531,"date":"2022-12-13T13:02:00","date_gmt":"2022-12-13T10:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230531"},"modified":"2022-12-13T13:02:43","modified_gmt":"2022-12-13T10:02:43","slug":"wordpress-widgets-ett-objektorienterat-tillvaegagaangssaett","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-ett-objektorienterat-tillvaegagaangssaett\/","title":{"rendered":"WordPress-widgets: ett objektorienterat tillv\u00e4gag\u00e5ngss\u00e4tt"},"content":{"rendered":"\n<p>F\u00f6r \u00e5r sedan skapade jag <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate som<\/a><\/strong> syftar till att vara f\u00f6ljande:<\/p>\n<blockquote>\n<p>En organiserad, underh\u00e5llsbar planl\u00f6sning f\u00f6r att bygga widgets med WordPress b\u00e4sta praxis.<\/p>\n<\/blockquote>\n<p>Sedan dess har inte mycket f\u00f6r\u00e4ndrats ang\u00e5ende <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API<\/a><\/strong> (som vi kommer att titta p\u00e5 senare i det h\u00e4r inl\u00e4gget), men vad jag anser vara &quot;b\u00e4sta praxis&quot; har f\u00f6r\u00e4ndrats. Vidare, i vilken grad jag tycker att detta API \u00e4r en solid exempel p\u00e5 inledande objektorienterad programmering i WordPress \u00e4r h\u00f6g.<\/p>\n<p>Det \u00e4r inte f\u00f6r att det anv\u00e4nder en massa objektorienterade principer, det \u00e4r inte f\u00f6r att det anv\u00e4nder moderna standarder (\u00e5tminstone vad g\u00e4ller modern PHP), utan f\u00f6r att den anv\u00e4nder n\u00e5gra saker som hj\u00e4lper oss att k\u00e4nna igen n\u00e5gra, s\u00e4g, signaler g\u00e4llande objektorienterad programmering i WordPress.<\/p>\n<p>Och det h\u00e4r \u00e4r n\u00e5got som inte b\u00f6r underskattas: Om du letar efter exempel p\u00e5 objektorienterad programmering i WordPress, leta efter API:er som anv\u00e4nder det.<\/p>\n<p>Vidare, om du letar efter s\u00e4tt att m\u00e4ta din egen niv\u00e5 av att utv\u00e4rdera en bit kod (f\u00f6r att inte tala om en kodbas) f\u00f6r anv\u00e4ndning av klasser och n\u00e5gra av de mer avancerade funktionerna i OOP, varf\u00f6r inte ha n\u00e5gon sorts av ett lackmustest f\u00f6r att se hur du m\u00e5r?<\/p>\n<\/p>\n<p>Och Widgets API g\u00f6r just det.<\/p>\n<h2>WordPress-widgets: en introduktion<\/h2>\n<p>S\u00e5 i en mindre serie \u00e4n min f\u00f6rra, siktar jag p\u00e5 att titta p\u00e5 Widgets API och att g\u00f6ra n\u00e5gra saker:<\/p>\n<ol>\n<li>visa dig grundskelettet f\u00f6r en widget och varf\u00f6r den \u00e4r objektorienterad,<\/li>\n<li>diskutera vilka saker du b\u00f6r kunna l\u00e4gga m\u00e4rke till och varf\u00f6r,<\/li>\n<li>uppdatera Widget Boilerplate direkt p\u00e5 den h\u00e4r webbplatsen f\u00f6rst och tryck sedan ut den till GitHub,<\/li>\n<li>bygga en widget med hj\u00e4lp av API:t med boilerplate som grund f\u00f6r v\u00e5rt arbete.<\/li>\n<\/ol>\n<p>Och i det h\u00e4r inl\u00e4gget ska vi b\u00f6rja med den f\u00f6rsta punkten ovan.<\/p>\n<h3>Men f\u00f6rst\u2026<\/h3>\n<p>Innan jag g\u00e5r in i det h\u00e4r inl\u00e4gget rekommenderar jag att du l\u00e4ser f\u00f6ljande inl\u00e4gg:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 1 av 2\">Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 1 av 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-andra-tvaa-pelarna-i-oop\/\" title=\"Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 2 av 2\">Tv\u00e5 pelare f\u00f6r objektorienterad programmering: Del 2 av 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/abstrakta-klasser-del-1-abstraherande-beteende\/\" title=\"Abstrakta klasser, del 1 \u2013 Abstraherande beteende\">Abstrakta klasser, del 1 \u2013 Abstraherande beteende<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/abstrakta-klasser-del-2-abstrakta-klasser-och-graenssnitt\/\" title=\"Abstrakta klasser, del 2 \u2013 Abstrakta klasser och gr\u00e4nssnitt\">Abstrakta klasser, del 2 \u2013 Abstrakta klasser och gr\u00e4nssnitt<\/a><\/strong><\/li>\n<\/ol>\n<p>N\u00e4r det \u00e4r klart (eller om du k\u00e4nner att du redan har koll p\u00e5 \u00e4mnena) \u00e4r vi redo att b\u00f6rja.<\/p>\n<p>[restrict paid=&quot;true&#8221;]<\/p>\n<h2>Grunderna i Widgets API<\/h2>\n<p>Om du l\u00e4ser igenom handbokssidan p\u00e5 Widgets kommer du att se mycket inneh\u00e5ll. Det h\u00e4r \u00e4r bra, men det \u00e4r inte alltid det b\u00e4sta draget n\u00e4r du f\u00f6rs\u00f6ker destillera inneh\u00e5ll till en publik som dig sj\u00e4lv n\u00e4r du letar efter praktiska, objektorienterade r\u00e5d.<\/p>\n<p>S\u00e5 jag ska plocka ut relevanta delar fr\u00e5n API-dokumentationen och sedan till\u00e4mpa den p\u00e5 koden vi ocks\u00e5 tillhandah\u00e5ller.<\/p>\n<h3>Vad \u00e4r en widget?<\/h3>\n<p>Jag tror att de flesta av oss som arbetar med WordPress vet vad en widget \u00e4r men det \u00e4r viktigt att definiera termen s\u00e5 att vi alla arbetar utifr\u00e5n samma id\u00e9. <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Handboken lyder:<\/a><\/strong><\/p>\n<blockquote>\n<p>En widget \u00e4r ett PHP-objekt som matar ut lite HTML. Samma typ av widget kan anv\u00e4ndas flera g\u00e5nger p\u00e5 samma sida (t.ex. textwidgeten). Widgets kan spara data i databasen (i alternativtabellen).<\/p>\n<\/blockquote>\n<p>Med detta p\u00e5 plats, l\u00e5t oss ta en titt p\u00e5 koden f\u00f6r en anpassad widget, \u00e5tminstone en del av den, och se vad vi kan f\u00e5 fram n\u00e4r det g\u00e4ller dess objektorienterade karakt\u00e4r.<\/p>\n<h3>Widget-klassen<\/h3>\n<p>Innan vi ens tittar p\u00e5 koden vet vi att det kommer att finnas n\u00e5gon niv\u00e5 av objektorienterad programmering helt enkelt f\u00f6r att dokumentationen s\u00e4ger \u00e5t oss att g\u00f6ra tre saker:<\/p>\n<ol>\n<li>Skapa din widgets klass genom att ut\u00f6ka standardklassen <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a> och n\u00e5gra av dess funktioner.<\/li>\n<li>Registrera din widget s\u00e5 att den blir tillg\u00e4nglig p\u00e5 sk\u00e4rmen <strong>Widgets .<\/strong><\/li>\n<li>Se till att ditt tema har minst ett <strong><a href=\"https:\/\/make.wordpress.org\/docs\/theme-developer-handbook\/theme-functionality\/sidebars\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">widgetomr\u00e5de<\/a><\/strong> d\u00e4r du kan l\u00e4gga till widgetarna.<\/li>\n<\/ol>\n<p>I det h\u00e4r inl\u00e4gget kommer jag att fokusera p\u00e5 den f\u00f6rsta punkten (\u00e4ven om vi s\u00e5 sm\u00e5ningom kommer till hur vi introducerar v\u00e5ra widgets i ett tema innan serien \u00e4r \u00f6ver).<\/p>\n<p>S\u00e5 l\u00e5t oss <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00e4gga upp koden<\/a><\/strong> som den presenteras i dokumentationen och prata om vad vi kan l\u00e4ra oss av den:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>F\u00f6rst m\u00e4rker vi att \u00e4ven om vi definierade en klass (som vi kan namnge vad vi vill, p\u00e5 mitt s\u00e4tt), m\u00e5ste den ut\u00f6ka <strong>WP_Widget<\/strong>. Det betyder att det i WordPress-k\u00e4rnan finns en <strong>WP_Widget-<\/strong> klass. Du kan se en v\u00e4lorganiserad uppdelning av k\u00e4llkoden p\u00e5 den <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-widget.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4r sidan.<\/a><\/strong><\/p>\n<p>F\u00f6r det andra indikerar nyckelordet <strong>extends<\/strong> att vi anv\u00e4nder <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP-arv<\/a><\/strong> som \u00e4r en grundpelare i objektorienterad programmering.<\/p>\n<p>F\u00f6r det tredje finns det fyra funktioner som vi m\u00e5ste implementera, varav tv\u00e5 kr\u00e4ver argument. Funktionerna som vi m\u00e5ste implementera \u00e4r f\u00f6ljande:<\/p>\n<ul>\n<li><strong>__construct()<\/strong> som \u00e4r den grundl\u00e4ggande klasskonstruktorn. Det \u00e4r h\u00e4r vi m\u00e5ste se till att den \u00f6verordnade klasskonstruktorn anropas, om det finns en, och sedan initierar vi de egenskaper vi anser vara n\u00f6dv\u00e4ndiga f\u00f6r v\u00e5r widget. Vi ska ta en titt p\u00e5 detta senare i serien.<\/li>\n<li><strong>widget()<\/strong> \u00e4r ansvarig f\u00f6r att mata ut inneh\u00e5llet i widgeten som anv\u00e4ndaren tillhandah\u00e5ller med gr\u00e4nssnittet i det administrativa omr\u00e5det. Den accepterar tv\u00e5 parametrar \u2013 <strong>$args<\/strong> och <strong>$instance.<\/strong> Parametern <strong>$args<\/strong> \u00e4r informationen som ska renderas p\u00e5 till sidan, och <strong>$instansen<\/strong> \u00e4r en referens till instansen av widgeten (eftersom flera widgets kan renderas p\u00e5 en sida).<\/li>\n<li><strong>form()<\/strong> visar det administrativa gr\u00e4nssnittet som anv\u00e4ndaren interagerar med f\u00f6r att styra vad som matas ut p\u00e5 sidans front-end. Det kr\u00e4ver ocks\u00e5 argumentet <strong>$instance<\/strong> s\u00e5 att informationen som tillhandah\u00e5lls \u00e4r f\u00f6r den faktiska widgeten som anv\u00e4ndaren arbetar med (mot alla instanser av widgeten).<\/li>\n<li><strong>update()<\/strong> anv\u00e4nds f\u00f6r att spara v\u00e4rdena i den aktuella instansen av widgeten. Den godtar tv\u00e5 argument. Den f\u00f6rsta \u00e4r den nya instansen av widgeten med uppdateringsv\u00e4rden som anv\u00e4ndaren har tillhandah\u00e5llit (t\u00e4nk p\u00e5 att uppdatera v\u00e4rdet p\u00e5 en aktiv textwidget) och det andra argumentet \u00e4r det f\u00f6r den gamla instansen av widgeten eller kanske den tidigare instansen eller kanske &quot; instansen som h\u00f6ll de tidigare v\u00e4rdena.&quot;<\/li>\n<\/ul>\n<p>Dessa fyra funktioner kr\u00e4vs f\u00f6r att implementera som en del av Widget API, som en del av att \u00e4rva funktioner fr\u00e5n det ut\u00f6kade gr\u00e4nssnittet, och f\u00f6r att producera en widgets grundl\u00e4ggande funktionalitet.<\/p>\n<p>Detta betyder inte att fler inte kan l\u00e4ggas till, men p\u00e5 ett bra objektorienterat s\u00e4tt skulle det troligen vara b\u00e4st att f\u00f6rvisa det beteendet till andra klasser. Men vi ska ta en titt p\u00e5 att g\u00f6ra det senare i serien n\u00e4r vi skapar v\u00e5r egen widget.<\/p>\n<h3>Vilka \u00e4r de viktigaste takeaways?<\/h3>\n<p>F\u00f6r att vara s\u00e4ker p\u00e5 att jag \u00e4r tydlig med vad som skulle f\u00f6rst\u00e5s av det h\u00e4r inl\u00e4gget \u00e4r det f\u00f6ljande:<\/p>\n<ul>\n<li>Widgets API \u00e4r objektorienterat. Den \u00e4r inte bara objektorienterad eftersom den anv\u00e4nder en klass (\u00e4ven om det verkligen \u00e4r en bra utg\u00e5ngspunkt), utan ocks\u00e5 f\u00f6r att den \u00e4rver funktionalitet inbyggd i en redan existerande basklass.<\/li>\n<li>N\u00e4rhelst vi \u00e4rver beteende fr\u00e5n en basklass eller en \u00f6verordnad klass f\u00e5r vi f\u00f6rutvecklad funktionalitet gratis. Det \u00e4r en riktigt bra sak med objektorienterad programmering eftersom det till\u00e5ter oss att fokusera specifikt p\u00e5 den programmeringslogik som vi vill implementera.<\/li>\n<\/ul>\n<p>F\u00f6rest\u00e4ll dig f\u00f6r ett \u00f6gonblick att du vill utveckla en widget men varje g\u00e5ng du g\u00f6r det m\u00e5ste du skriva in all funktionalitet f\u00f6r att haka in i WordPress f\u00f6r att g\u00f6ra samma, repetitiva funktionalitet.<\/p>\n<p>Det \u00e4r h\u00e4r arv och objektorienterad programmering kommer in i bilden. Den repetitiva koden abstraheras till en basklass s\u00e5 att den bara skrivs en g\u00e5ng och sedan \u00f6verl\u00e5ts koden vi vill fokusera p\u00e5 att implementera.<\/p>\n<p>Allt ovanst\u00e5ende \u00e4r vad man b\u00f6r f\u00f6rst\u00e5 n\u00e4r man l\u00e4ser detta f\u00f6rsta pass vid k\u00e4llkoden f\u00f6r ett grundl\u00e4ggande, objektorienterat API i WordPress.<\/p>\n<h2>Vad kommer h\u00e4rn\u00e4st?<\/h2>\n<p>I n\u00e4sta inl\u00e4gg i den h\u00e4r serien kommer vi att titta p\u00e5 den objektorienterade karakt\u00e4ren hos Widgets API och vilka saker du b\u00f6r kunna uppt\u00e4cka direkt genom att l\u00e4sa koden.<\/p>\n<p>Detta beror p\u00e5 att det \u00e4r viktigt att k\u00e4nna igen vissa objektorienterade principer i praktiken och det h\u00e4r \u00e4r ett bra s\u00e4tt att bed\u00f6ma om du kan g\u00f6ra det eller inte. Om du \u00e4r, bra! Sedan kommer det att forts\u00e4tta att hj\u00e4lpa till att utveckla den muskeln. Om inte, oroa dig inte \u2013 det hj\u00e4lper dig fortfarande att utveckla den muskeln.<\/p>\n<p>Och det kommer att tj\u00e4na dig v\u00e4l n\u00e4r vi forts\u00e4tter att g\u00e5 mer och mer in i objektorienterad WordPress-utveckling med praktiska medel.<\/p>\n<p>Den n\u00f6dv\u00e4ndiga teorin har t\u00e4ckts. S\u00e5 l\u00e5t oss b\u00f6rja med att faktiskt oms\u00e4tta det i praktiken.<\/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>WordPress Widgets API hj\u00e4lper till att ge ett gediget lackmustest och exempel p\u00e5 hur man kommer ig\u00e5ng med objektorienterad programmering i WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236133,"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-230531","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\/230531","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=230531"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230531\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236133"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}