{"id":229718,"date":"2022-11-23T15:35:00","date_gmt":"2022-11-23T12:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229718"},"modified":"2022-11-09T16:04:51","modified_gmt":"2022-11-09T13:04:51","slug":"arbeta-med-klasser-mallar-och-delar-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/arbeta-med-klasser-mallar-och-delar-i-wordpress\/","title":{"rendered":"Arbeta med klasser, mallar och delar i WordPress"},"content":{"rendered":"\n<p>N\u00e4r jag satte mig f\u00f6r att b\u00f6rja det h\u00e4r inl\u00e4gget, planerade jag att skriva n\u00e5got mycket mer involverat \u00e4n vad jag ska dela med mig av. Till att b\u00f6rja med ville jag g\u00e5 igenom en av tv\u00e5 saker:<\/p>\n<ul>\n<li>Den kompletta guiden f\u00f6r att st\u00e4lla in en utvecklingsmilj\u00f6,<\/li>\n<li>Integrera kodkvalitetsverktyg i PhpStorm<\/li>\n<\/ul>\n<p>Den f\u00f6rsta skulle vara att fokusera p\u00e5 en m\u00e4ngd andra saker jag har pratat om, att knyta ihop dem alla och ha en definitiv referens. Men det h\u00e4r \u00e4r n\u00e5got som jag vill ta tid att s\u00e4tta ihop f\u00f6r att se till att det g\u00f6rs r\u00e4tt.<\/p>\n<p>Den andra \u00e4r en som jag tycker \u00e4r viktig men jag \u00e4r i lite av en \u00f6verg\u00e5ngsfas med n\u00e5gra av mina egna verktyg. Tills det \u00e4r gjort vill jag helst inte skriva om det.<\/p>\n<p>\u00c4nd\u00e5 finns det alltid n\u00e5got att t\u00e4cka, eller hur? S\u00e5 idag har jag valt n\u00e5got enklare: Att bryta ner anv\u00e4ndningen av klasser, mallar och delar i WordPress-plugins med ett enkelt exempel.<\/p>\n<h2>Klasser, mallar och delar i WordPress<\/h2>\n<p>F\u00f6r just detta \u00e4mne \u00e4r en omedelbar fr\u00e5ga som kan komma att t\u00e4nka p\u00e5 enkel: Varf\u00f6r bry sig om att prata om detta?<\/p>\n<p>Eftersom det \u00e4r 2018 och vi ser fortfarande en grov blandning av PHP, CSS, uppm\u00e4rkning och JavaScript i en enda fil. Detta \u00e4r inte f\u00f6r att sl\u00e5 p\u00e5 andra tekniker som g\u00f6r detta som standard (som React). Jag pratar specifikt om WordPress-plugins och att skriva underh\u00e5llbar kod p\u00e5 ett s\u00e5dant s\u00e4tt att det \u00e4r l\u00e4tt att [uppenbarligen] underh\u00e5lla, skriva och l\u00e4sa.<\/p>\n<h3>Ett praktiskt exempel<\/h3>\n<p>L\u00e5t oss s\u00e4ga att du arbetar p\u00e5 en undermenysida f\u00f6r n\u00e5got som kommer att visas under en anpassad meny. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-00-addmenupage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Du registrerar din sida<\/a> med WordPress API:<\/p>\n<pre><code>&lt;?php\n\npublic function addMenuPage()\n{\n    add_menu_page(\n      'Acme Menu',\n      'Acme Menu',\n      'manage_options',\n      'acme-custom-menu',\n      array($this, 'display'),\n      'dashicons-dashboard',\n      30\n    );\n\n    add_submenu_page(\n      'acme-custom-menu',\n      'Acme Menu',\n      'Acme Menu',\n      'Acme Menu',\n      'acme-custom-menu',\n      array($this, 'display')\n    );\n}\n<\/code><\/pre>\n<p>Men n\u00e4r du st\u00e4ller in en \u00e5teruppringningsfunktion f\u00f6r att visa sidan, anv\u00e4nder du <strong>inte<\/strong> funktionen f\u00f6r att blanda alla olika spr\u00e5k tillsammans. Ist\u00e4llet anv\u00e4nder du den f\u00f6r att <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-01-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inkludera en fil.<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function display()\n{\n    include_once $this-&gt;pluginPath. 'views\/acme-settings.php';\n}\n<\/code><\/pre>\n<p>Observera att i filen ovan refererar jag till en egenskap <strong>$this-&gt;pluginPath<\/strong>. Detta \u00e4r inst\u00e4llt i konstruktorn f\u00f6r klassen s\u00e5 att jag enkelt kan komma \u00e5t roten av plugin.<\/p>\n<p>Hur som helst, hur kan den h\u00e4r filen se ut?<\/p>\n<h3>En mall och en del<\/h3>\n<p>I det h\u00e4r fallet antar jag att din mall \u00e4r det som kommer att ge information till anv\u00e4ndaren och kommer att beg\u00e4ra deras input. Den partiella kommer att vara ansvarig f\u00f6r att visa ett framg\u00e5ngs-, fel- eller varningsmeddelande f\u00f6r anv\u00e4ndaren.<\/p>\n<h4>En mall<\/h4>\n<p>F\u00f6r att g\u00f6ra det enkelt kommer jag att h\u00e5lla b\u00e5de mallen och den partiella s\u00e5 smal som m\u00f6jligt. I det h\u00e4r fallet, anta att vi ska rendera en sida, be anv\u00e4ndaren att spara ett v\u00e4rde, och om v\u00e4rdet sparas framg\u00e5ngsrikt (och d\u00e4rmed finns i tabellen <strong>wp_options<\/strong> ), visar vi framg\u00e5ngsmeddelandet.<\/p>\n<p>Detta betyder:<\/p>\n<ul>\n<li>mallen visar sidans titel, information, inmatning och spara-knapp,<\/li>\n<li>den partiella visar framg\u00e5ngsmeddelandet vid behov.<\/li>\n<\/ul>\n<p>Ta en titt p\u00e5 koden f\u00f6r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-02-acme-settings-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mallen nedan:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the settings page for the plugin.\n *\/\n?&gt;\n&lt;div class=\"wrap\"&gt;\n    &lt;h1 class=\"wp-heading-inline\"&gt;&lt;?php echo get_admin_page_title(); ?&gt;&lt;\/h1&gt;\n    &lt;?php if ($this-&gt;showSuccessMessage()) { ?&gt;\n      &lt;?php include_once 'partials\/settings-saved.php'; ?&gt;\n    ?&gt;\n    &lt;div id=\"acme-settings-schedule\"&gt;\n        &lt;form id=\"acme-form\" method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"\"&gt;\n            &lt;!-- This is where your settings go. --&gt;\n            &lt;p&gt;\n                &lt;?php\n                submit_button(\n                    'Save',\n                    'primary',\n                    'acme-save-settings',\n                    false\n                );\n                wp_nonce_field(\n                    'acme-save',\n                    'acme-save-nonce'\n                );\n                ?&gt;\n            &lt;\/p&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>L\u00e4gg m\u00e4rke till att, ja, den har en ing\u00e5ng, en spara-knapp och en nonce som alla \u00e4r viktiga (men utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg) f\u00f6r att spara information.<\/p>\n<p>Men l\u00e4gg ocks\u00e5 m\u00e4rke till att den har en hj\u00e4lpfunktion som jag anv\u00e4nder f\u00f6r att kontrollera f\u00f6rekomsten av framg\u00e5ngsrikt sparande av information. Denna funktion finns i samma klass som ansvarar f\u00f6r att rendera mallen.<\/p>\n<h4>Partiell<\/h4>\n<p>Det ser ut ungef\u00e4r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-03-showsuccessmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function showSuccessMessage()\n{\n  return (false !== get_option('acme_custom_setting'));\n}\n<\/code><\/pre>\n<p>Och den resulterande delen \u00e4r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-04-settings-saved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mycket enkel:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the success message if the option has been properly saved.\n *\/\n?&gt;\n\n&lt;div class=\"notice-success notice is-dismissible\"&gt;\n    &lt;p&gt;Your settings have been successfully saved.&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Sj\u00e4lvklart kan din implementering av funktionen variera. Syftet \u00e4r inte s\u00e5 mycket att visa hur man implementerar funktionen utan hur man anv\u00e4nder en funktion f\u00f6r att kontrollera information f\u00f6r att visa en del.<\/p>\n<h2>Det finns mer (men inte h\u00e4r)<\/h2>\n<p>Kanske \u00e4r detta n\u00e5got som b\u00f6r placeras i b\u00f6rjan av artikeln.<\/p>\n<p>F\u00f6r att vara \u00e4rlig tror jag att det \u00e4r en av de saker d\u00e4r vissa kan tycka att det \u00e4r mer anv\u00e4ndbart att se det fr\u00e5n b\u00f6rjan (men d\u00e5 saknar kontexten f\u00f6r koden) och andra tycker att det \u00e4r mer anv\u00e4ndbart i slutet eftersom de kan se hur det hela passar in. tillsammans.<\/p>\n<p>Oavsett vilket hoppas jag att det i slut\u00e4ndan ger klarhet i hur allt detta h\u00e4nger ihop.<\/p>\n<p>Dessutom finns det mycket utrymme p\u00e5 platser f\u00f6r saker som kan anpassas som:<\/p>\n<ul>\n<li>kontrollerar att anv\u00e4ndaren har tillst\u00e5nd att spara,<\/li>\n<li>verifiera nonce-v\u00e4rdet,<\/li>\n<li>sanering och validering av data,<\/li>\n<li>avg\u00f6ra vad som \u00e4r framg\u00e5ng, varningar och fel.<\/li>\n<\/ul>\n<p>Men om jag ska t\u00e4cka allt ovanst\u00e5ende tittar vi p\u00e5 ett utomordentligt l\u00e5ngt inl\u00e4gg eller en l\u00e5ng rad inl\u00e4gg. Det \u00e4r inget jag \u00e4r emot, men det \u00e4r ocks\u00e5 n\u00e5got som jag inte nu \u00e4r v\u00e4rt anstr\u00e4ngningen vid det h\u00e4r laget.<\/p>\n<p>Tveka aldrig att ge feedback. Men under tiden hoppas jag att allt detta hj\u00e4lper dig att ge dig en grund att bygga p\u00e5 n\u00e4r du arbetar med ditt n\u00e4sta projekt.<\/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>I det h\u00e4r inl\u00e4gget bryter jag ner anv\u00e4ndningen av klasser, mallar och delar i WordPress-plugins med ett enkelt exempel.<\/p>\n","protected":false},"author":1,"featured_media":164763,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,807,724,868],"tags":[1173],"class_list":["post-229718","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229718","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=229718"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229718\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/164763"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229718"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229718"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229718"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}