{"id":230811,"date":"2022-12-20T12:42:00","date_gmt":"2022-12-20T09:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230811"},"modified":"2022-12-20T12:45:12","modified_gmt":"2022-12-20T09:45:12","slug":"wordpress-widgets-refactoring-del-10","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-10\/","title":{"rendered":"WordPress-widgets: Refactoring, del 10"},"content":{"rendered":"\n<p>N\u00e4r det g\u00e4ller refaktoreringen av WordPress Widget Boilerplate \u00e4r vi p\u00e5 en bra plats. Mycket arbete har gjorts s\u00e5 att det borde vara mycket l\u00e4ttare att introducera nya klasser, funktioner och funktioner.<\/p>\n<p>Och inte nog med det: Det borde vara l\u00e4ttare att f\u00f6lja.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-9\/\" title=\"Tack vare arbetet i f\u00f6rra inl\u00e4gget\">Tack vare arbetet i f\u00f6rra inl\u00e4gget<\/a> har vi mycket arbete att bygga vidare p\u00e5 \u2013 n\u00e4mligen ett grundl\u00e4ggande administrativt gr\u00e4nssnitt.<\/p>\n<p>Till sist stod det i f\u00f6rra inl\u00e4gget:<\/p>\n<blockquote>\n<p>Under de kommande artiklarna kommer detta att forts\u00e4tta att utvecklas, men som du kan se ser vi till att vi har en enda basklass av funktionalitet f\u00f6r att prata med WordPress och en klass specifikt f\u00f6r att rendera den administrativa formen.<\/p>\n<\/blockquote>\n<p>Och det \u00e4r d\u00e4r vi ska ta upp i den h\u00e4r artikeln. Specifikt kommer vi att titta p\u00e5 sanering och serialisering av data samt att h\u00e4mta data som sparats i widgeten.<\/p>\n<h2>WordPress Widget Boilerplate: Refactoring del 10<\/h2>\n<h3>Refaktorering av anv\u00e4ndargr\u00e4nssnittet<\/h3>\n<p>Innan vi g\u00e5r in p\u00e5 serialisering, finns det en del mindre arbete som vi kommer att beh\u00f6va g\u00f6ra f\u00f6r v\u00e5r administrativa syn. Minns fr\u00e5n tidigare inl\u00e4gg i serien att vi har byggt ett formul\u00e4r som accepterar:<\/p>\n<ul>\n<li>En titel,<\/li>\n<li>lite inneh\u00e5ll,<\/li>\n<li>och en kryssruta.<\/li>\n<\/ul>\n<p>Detta visas bra, men det utesluter vissa nyckelfunktioner i <a href=\"https:\/\/codex.wordpress.org\/Widgets_API#Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API<\/a>. Vi m\u00e5ste n\u00e4mligen se till att vi namnger v\u00e5ra element korrekt med hj\u00e4lp av f\u00f6ljande funktioner:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/get_field_id\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_field_id<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/get_field_name\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_field_name<\/a><\/li>\n<\/ul>\n<p>Och sedan kommer vi att skriva v\u00e5r funktion som helt enkelt heter <a href=\"https:\/\/codex.wordpress.org\/Widgets_API#Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get<\/a> som jag kommer att f\u00f6rklara ett \u00f6gonblick.<\/p>\n<p>Funktionerna ovan \u00e4r n\u00f6dv\u00e4ndiga eftersom det hj\u00e4lper WordPress att h\u00e5lla reda p\u00e5 hur m\u00e5nga instanser av widgeten som anv\u00e4nds och vilken anv\u00e4ndaren redigerar. Vi f\u00e5r med andra ord mycket funktionalitet gratis.<\/p>\n<p>Innan jag visar dig koden vill jag kort diskutera syftet med <strong>get<\/strong> &#8211; funktionen som vi ska introducera. Kort sagt, det \u00e4r ett s\u00e4tt f\u00f6r oss att skicka en nyckel (som i nyckeln i ett nyckel\/v\u00e4rdepar) till en funktion och sedan f\u00e5 den enkelt att h\u00e4mta ett v\u00e4rde \u00e5t oss s\u00e5 att det h\u00e5ller v\u00e5rt gr\u00e4nssnitt s\u00e5 rent som m\u00f6jligt.<\/p>\n<p>S\u00e5 f\u00f6rst, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-00-get-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get-metoden<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * If the value for the key exists in the current instance of the widget, then it will\n * retrieve it. Otherwise, it will return an empty value.\n *\n * @param string $key the used to identify the value of the widget.\n * @param array $instance the options for the instance of this widget\n *\/\nprotected function get($key, $instance)\n{\n    return empty($instance[$key])? '': $instance[$key];\n}<\/code><\/pre>\n<p>Det viktiga att notera \u00e4r att den h\u00e4r metoden inte bara accepterar nyckeln f\u00f6r v\u00e4rdet vi l\u00e4ser utan en array som refererar till instansen av arrayen.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-01-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Och nu, det omstrukturerade anv\u00e4ndargr\u00e4nssnittet<\/a> :<\/p>\n<pre><code>&lt;?php\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n?&gt;\n\n&lt;div class=\"widget-content\"&gt;\n    &lt;p&gt;\n        &lt;input\n            type=\"text\"\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('title')); ?&gt;\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('title')); ?&gt;\"\n            value=\"&lt;?php echo $this-&gt;get('title', $instance) ?&gt;\"\n            placeholder=\"Widget Title\"\n            class=\"widefat\"\n        \/&gt;\n    &lt;\/p&gt;\n\n    &lt;p&gt;\n        &lt;textarea\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('content')); ?&gt;\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('content')); ?&gt;\"\n            placeholder=\"Widget Content\"\n            style=\"width:100%;\"&gt;&lt;?php echo $this-&gt;get('content', $instance) ?&gt;&lt;\/textarea&gt;\n    &lt;\/p&gt;\n\n    &lt;p&gt;\n        &lt;input\n            type=\"checkbox\"\n            value=\"on\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('display-title')); ?&gt;\"\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('display-title')); ?&gt;\"\n            &lt;?php checked('on', $this-&gt;get('display-title', $instance), true); ?&gt;\n            class=\"checkbox\"\n        \/&gt;\n        &lt;label for=\"&lt;?php echo esc_attr($this-&gt;get_field_id('display-title')); ?&gt;\"&gt;Display Title?&lt;\/label&gt;\n    &lt;\/p&gt;\n&lt;\/div&gt;&lt;!-- .widget-content --&gt;\n<\/code><\/pre>\n<p>Men detta l\u00e4mnar fortfarande funktionalitet bristande och det l\u00e4mnar arbete f\u00f6r oss att g\u00f6ra. Vi m\u00e5ste n\u00e4mligen sanera data och skicka tillbaka den till WordPress, s\u00e5 att den sparar data.<\/p>\n<h3>Sanering och serialisering<\/h3>\n<p>F\u00f6r v\u00e5rt exempel kommer vi att vara v\u00e4ldigt strikta i vad vi till\u00e5ter. Vi kommer n\u00e4mligen bara att st\u00f6dja grundl\u00e4ggande text, och vi kommer att ta bort allt aggressivt.<\/p>\n<p>Det betyder att vi inte kommer att till\u00e5ta uppm\u00e4rkning eller n\u00e5got liknande. Ist\u00e4llet ska vi ta bort allt som inte \u00e4r grundl\u00e4ggande text. Vi kan dekorera den lite n\u00e4r det \u00e4r dags att visa den p\u00e5 fronten, men vi l\u00e4mnar det tills l\u00e4mpligt inl\u00e4gg.<\/p>\n<p>F\u00f6r att g\u00f6ra detta kommer vi att anv\u00e4nda f\u00f6ljande funktioner:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strip-tags.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strip_tags<\/a><\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">streckstreck<\/a><\/li>\n<\/ul>\n<p>Kom ih\u00e5g att vi har tv\u00e5 f\u00e4lt i v\u00e5r widget \u2013 titelf\u00e4ltet och inneh\u00e5llsf\u00e4ltet. Beroende p\u00e5 vilken typ av widget du bygger, kanske du bara beh\u00f6ver en enda klass eller funktion f\u00f6r att rensa data. I andra situationer kan du beh\u00f6va n\u00e5got mer komplext.<\/p>\n<p>T\u00e4nk p\u00e5 det n\u00e4r vi g\u00e5r igenom den h\u00e4r koden eftersom detta inte kommer att vara en l\u00f6sning som passar alla. Ist\u00e4llet kommer det att vara specifikt f\u00f6r detta.<\/p>\n<p>Hur som helst, f\u00f6r att rensa data, kommer vi att skriva en klass specifikt f\u00f6r detta \u00e4ndam\u00e5l, och sedan g\u00f6r vi den tillg\u00e4nglig f\u00f6r v\u00e5r WidgetAdmin-klass.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-02-widget-serializer-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">H\u00e4r \u00e4r klassen i sin helhet<\/a> med en beskrivning som f\u00f6ljer:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateWordPress;\n\n\/**\n * Santiizes and saves the data for the widget.\n *\/\nclass WidgetSerializer\n{\n    \/**\n     * Updates the values of the widget. Sanitizes the information before saving it.\n     *\n     * @param array $newInstance the array of new options to save\n     *\/\n    public function update($newInstance)\n    {\n        $instance = [];\n        foreach ($newInstance as $key =&gt; $value) {\n            $instance[$key] = strip_tags(\n                stripslashes($value)\n            );\n        }\n\n        return $instance;\n    }\n}\n<\/code><\/pre>\n<p>Klassen ska vara rakt fram. Den tar in widgetens inkommande v\u00e4rden, rensar dem och returnerar sedan en ny array som ska l\u00e4mnas tillbaka till WordPress.<\/p>\n<p>Det finns dock en hake. Den h\u00e4r klassen m\u00e5ste vara en egenskap f\u00f6r den huvudsakliga <strong>widgetklassen<\/strong> som visades i f\u00f6rra inl\u00e4gget.<\/p>\n<p>F\u00f6r det andra \u00e4r <strong>uppdateringsmetoden<\/strong> som \u00e4r en del av Widgets API det som kommer att anropa den h\u00e4r klassen. Det \u00e4r inte n\u00f6dv\u00e4ndigt att skicka variabeln <strong>$oldInstance<\/strong> till serializern men det kr\u00e4vs f\u00f6r uppdateringsmetoden.<\/p>\n<p>H\u00e4r \u00e4r <strong>widgetklassen<\/strong> som <a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den \u00e4r byggd f\u00f6r n\u00e4rvarande<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateWordPress;\n\nuse WP_Widget;\n\nclass Widget extends WP_Widget\n{\n    \/**\n     * @var string unique identifier for your widget\n     *\/\n    protected $widgetSlug;\n\n    \/**\n     * Initializes the plugin by setting its properties and calling the parent class with the description.\n     *\n     * @param string           $widgetSlug       unique identifier for your widget\n     * @param WidgetSerializer $widgetSerializer the class responsible for saving widget options\n     *\/\n    public function __construct($widgetSlug)\n    {\n        $this-&gt;widgetSlug = $widgetSlug;\n\n        parent::__construct(\n            $this-&gt;getWidgetSlug(),\n            __('Widget Name', $this-&gt;getWidgetSlug()),\n            [\n                'classname' =&gt; $this-&gt;getWidgetSlug().'-class',\n                'description' =&gt; __('Short description of the widget goes here.', $this-&gt;getWidgetSlug()),\n            ]\n        );\n    }\n\n    \/**\n     * Return the widget slug.\n     *\n     * @return string slug variable\n     *\/\n    public function getWidgetSlug()\n    {\n        return $this-&gt;widgetSlug;\n    }\n\n    \/**\n     * Displays the administrative view of the form and includes the options\n     * for the instance of the widget as arguments passed into the function.\n     *\n     * @param array $instance the options for the instance of this widget\n     *\/\n    public function form($instance)\n    {\n        include plugin_dir_path(__FILE__).'Views\/Admin.php';\n    }\n\n    \/**\n     * Updates the values of the widget. Uses the serialization class to sanitize the\n     * information before saving it.\n     *\n     * @param array $newInstance the values to be sanitized and saved\n     * @param array $oldInstance the values that were originally saved\n     *\/\n    public function update($newInstance, $oldInstance)\n    {\n        return $this-&gt;widgetSerializer-&gt;update($newInstance, $oldInstance);\n    }\n\n    \/**\n     * If the value for the key exists in the current instance of the widget, then it will\n     * retrieve it. Otherwise, it will return an empty value.\n     *\n     * @param string $key      the used to identify the value of the widget\n     * @param array  $instance the options for the instance of this widget\n     *\/\n    protected function get($key, $instance)\n    {\n        return empty($instance[$key])? '': $instance[$key];\n    }\n}\n<\/code><\/pre>\n<p>Men om du uppdaterar sidan kanske du m\u00e4rker att saneringen och serialiseringen inte verkar fungera n\u00e4r du h\u00e4mtar data. Och det \u00e4r vad vi ska titta p\u00e5 i n\u00e4sta inl\u00e4gg.<\/p>\n<h2>H\u00e4mtar data<\/h2>\n<p>Observera att \u00e4ven om funktionaliteten verkar ofullst\u00e4ndig f\u00f6r detta (eftersom den osaniserade data fortfarande visas), \u00e4r vi fokuserade p\u00e5 att se till att vi skriver klasser med sammanh\u00e5llning, ansvar och som inte \u00e4r t\u00e4tt kopplade.<\/p>\n<p>Vi kommer att upprepa detta lite mer i n\u00e4sta inl\u00e4gg. S\u00e5 studera koden ovan, implementera den om det \u00e4r vad du har gjort, s\u00e5 g\u00e5r vi d\u00e4rifr\u00e5n i n\u00e4sta inl\u00e4gg.<\/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>Och nu b\u00f6rjar vi l\u00e4gga till sanerings- och serialiseringsfunktioner i WordPress Widget Boilerplate.<\/p>\n","protected":false},"author":1,"featured_media":234965,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,724],"tags":[1173],"class_list":["post-230811","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230811","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=230811"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230811\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/234965"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230811"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230811"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230811"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}