{"id":229745,"date":"2022-11-23T13:29:00","date_gmt":"2022-11-23T10:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229745"},"modified":"2022-11-09T16:12:05","modified_gmt":"2022-11-09T13:12:05","slug":"mallar-och-villkorlig-logik-med-oop-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/mallar-och-villkorlig-logik-med-oop-i-wordpress\/","title":{"rendered":"Mallar och villkorlig logik med OOP i WordPress"},"content":{"rendered":"\n<p>Mallar blir allt vanligare i WordPress, och jag anser att det \u00e4r bra.<\/p>\n<p>Men det betyder inte att det inte finns projekt som vi hanterar som anv\u00e4nder en mer traditionell metod f\u00f6r att visa mallar eller delar. Dessutom betyder det inte heller att vi \u00e4r undantagna fr\u00e5n att underh\u00e5lla kodbaser som anv\u00e4nder kod som inte anv\u00e4nder en mallmotor.<\/p>\n<p>\u00c4ven om jag tycker att mall \u00e4r bra, tror jag inte att det alltid \u00e4r n\u00f6dv\u00e4ndigt. Det \u00e4r dock inneh\u00e5ll f\u00f6r ett annat inl\u00e4gg.<\/p>\n<p>Ist\u00e4llet vill jag g\u00e5 igenom processen med att anv\u00e4nda den villkorliga logiken om huruvida en partiell ska visas eller inte i en mall och g\u00f6ra det med hj\u00e4lp av objektorienterad programmering.<\/p>\n<h2>Mallar och villkorlig logik med OOP<\/h2>\n<p>F\u00f6r att g\u00f6ra detta, l\u00e5t oss anta f\u00f6ljande:<\/p>\n<ol>\n<li>Vi har ett plugin som \u00e4r beroende av ett annat plugin f\u00f6r en funktion.<\/li>\n<li>Det andra pluginet \u00e4r valfritt.<\/li>\n<li>Om det inte finns, kommer vi att visa ett meddelande. Om den finns visar vi en del.<\/li>\n<\/ol>\n<p>Rakt fram nog, eller hur?<\/p>\n<p>Det enda att notera \u00e4r att all denna logik kommer att h\u00e5llas inom det prim\u00e4ra insticksprogrammet (det vill s\u00e4ga den som kommer att kontrollera n\u00e4rvaron av det andra insticksprogrammet).<\/p>\n<h3>1 Mallens villkorliga logik<\/h3>\n<p>Det f\u00f6rsta som m\u00e5ste g\u00f6ras \u00e4r att ha en funktion som kontrollerar n\u00e4rvaron av den sekund\u00e4ra plugin. Anledningen till detta \u00e4r att mallen ser ut ungef\u00e4r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-00-template-example-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;div class=\"wrap\"&gt;\n    &lt;!-- Snipping out irrelevant code in this file --&gt;\n    &lt;form id=\"yhd-upload-new-item-settings\"&gt;\n        &lt;?php if (!$this-&gt;hasSecondaryPlugin()) { ?&gt;\n            &lt;?php include_once 'partials\/error-inactive-plugin.php'; ?&gt;\n        &lt;?php } else { ?&gt;\n            &lt;h2&gt;Secondary Plugin Settings&lt;\/h2&gt;\n            &lt;p class=\"description\"&gt;The Secondary Plugin is installed and active.&lt;\/p&gt;\n            &lt;form method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"&gt;\n                &lt;label for=\"acme-secondary-plugin\"&gt;\n                    &lt;input type=\"checkbox\" name=\"acme-secondary-plugin\" value=\"true\"\/&gt;\n                    Would you like to automatically use the secondary plugin?\n                &lt;\/label&gt;\n                &lt;!-- Snipping out irrelevant code in this file --&gt;\n            &lt;\/form&gt;\n        &lt;?php } ?&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Och sedan kan den partiella se ut ungef\u00e4r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-01-error-inactive-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r<\/a><\/strong> (det beror p\u00e5 din implementering):<\/p>\n<pre><code>&lt;?php\n\/**\n * This is the partial displayed when the Secondary Plugin is not active.\n *\/\n?&gt;\n&lt;div id=\"inactive-importer-message\" class=\"error notice is-dismissible\"&gt;\n    &lt;p&gt;[The message you want to display here.]&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;&lt;!-- #inactive-importer-message --&gt;<\/code><\/pre>\n<p>P\u00e5 grund av hur mallar ing\u00e5r i WordPress kommer funktionen att leva i en klass, och klassen kommer att kontrollera om plugin-programmet finns.<\/p>\n<p>Om du anv\u00e4nder n\u00e5gon kodsniffer kommer det troligen att utl\u00f6sa en varning om att metoden inte anv\u00e4nds, men metoden anv\u00e4nds, den anv\u00e4nds bara i en mallfil. Notera i en klass. Allt detta att s\u00e4ga, vissa av v\u00e5ra sniffers \u00e4r inte s\u00e5 intelligenta. \u00c4n.<\/p>\n<h3>2 Pluginens kod p\u00e5 serversidan<\/h3>\n<p>N\u00e4r du har f\u00e5tt den allm\u00e4nna uppfattningen om hur det kommer att fungera, \u00e4r det dags att skriva kod i din klass.<\/p>\n<p>Kom ih\u00e5g att detta \u00e4r en enkel funktion: Den beh\u00f6ver bara kontrollera om det finns ett plugin. Du kan g\u00f6ra detta p\u00e5 n\u00e5gra s\u00e4tt, men det vanligaste kan vara att anv\u00e4nda API-funktionen <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_plugin_active\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">is_active_plugin<\/a><\/strong>.<\/p>\n<p>Observera att n\u00e4r du anv\u00e4nder den h\u00e4r funktionen bygger det p\u00e5 tanken att du vet namnet p\u00e5 pluginet du anv\u00e4nder. Om inte, finns det andra s\u00e4tt, men det ligger utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg.<\/p>\n<p>Hur som helst, s\u00e5 eftersom logiken \u00e4r villkorad m\u00e5ste den returnera ett booleskt v\u00e4rde, och det \u00e4r precis vad ovanst\u00e5ende API-funktion g\u00f6r. S\u00e5 funktionen p\u00e5 serversidan kan se ut ungef\u00e4r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-02-hassecondaryplugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Determines if the Secondary Importer is is activated.\n *\n * @return bool True if the the pklugin is active; false, otherwise.\n *\/\nprivate function hasSecondaryPlugin()\n{\n    return in_array(\n        'secondary-plugin\/secondary-plugin.php',\n        get_option('active_plugins')\n    );\n}\n<\/code><\/pre>\n<p>Och eftersom mallkoden anropar den h\u00e4r funktionen (som du ser ovan), kommer den att avg\u00f6ra om den beh\u00f6ver visa en partiell eller inte.<\/p>\n<h2>L\u00e4tt nog<\/h2>\n<p>F\u00f6r vissa \u00e4r det h\u00e4r v\u00e4ldigt enkla saker; f\u00f6r andra \u00e4r det ett helt annat tillv\u00e4gag\u00e5ngss\u00e4tt eftersom det handlar om st\u00f6rre separation av bekymmer.<\/p>\n<p>Och n\u00e4r jag forts\u00e4tter att arbeta genom <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">OOP Fundamentals<\/a><\/strong> med sajtens medlemmar, tror jag att det \u00e4r viktigt att ocks\u00e5 dela n\u00e5gra av de b\u00e4ttre metoderna med dem som kanske inte \u00e4r medlemmar men som \u00e4r angel\u00e4gna om att skriva mer organiserad kod.<\/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>Anv\u00e4nd objektorienterad programmering och villkorlig logik f\u00f6r att skilja problemen mellan partialer, mallar och kod p\u00e5 serversidan.<\/p>\n","protected":false},"author":1,"featured_media":164710,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,901,724,868],"tags":[1173],"class_list":["post-229745","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229745","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=229745"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229745\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/164710"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229745"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229745"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}