{"id":229025,"date":"2022-10-22T18:54:00","date_gmt":"2022-10-22T15:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229025"},"modified":"2022-11-09T05:14:25","modified_gmt":"2022-11-09T02:14:25","slug":"wordpress-laajennusten-muokkaaminen-pieni-esimerkki","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-laajennusten-muokkaaminen-pieni-esimerkki\/","title":{"rendered":"WordPress-laajennusten muokkaaminen: pieni esimerkki"},"content":{"rendered":"\n<p>Yksi tapa, jolla WordPress-laajennukset syntyv\u00e4t, on se, ett\u00e4 ainakin minun tapauksessani ne alkavat kokoelmana toimintoja, joita k\u00e4ytet\u00e4\u00e4n auttamaan tietyn projektin tiettyyn tarkoitukseen. Siit\u00e4 eteenp\u00e4in ajattelet &quot;Hei, ehk\u00e4 joku muu pit\u00e4\u00e4 t\u00e4st\u00e4 hy\u00f6dyllist\u00e4.&quot;<\/p>\n<p>Ainakin se on ollut minun kokemukseni useammin kuin ei.<\/p>\n<p>Mutta asia on, ett\u00e4 ennen kuin julkaiset sen muiden kokeiltavaksi, haluat k\u00e4yd\u00e4 l\u00e4pi koodin puhdistamisprosessin. En my\u00f6sk\u00e4\u00e4n puhu WordPress-laajennusten uudelleenmuodostamisesta \u2013 ainakaan viel\u00e4.<\/p>\n<p>Puhun koodin ottamisesta, sen saamisesta johonkin, joka toimii WordPress-laajennuksena, ja sitten mahdollisesti koodin uudelleenmuodostamisesta.<\/p>\n<h2>WordPress-laajennusten muokkaaminen<\/h2>\n<p>Koko WordPress-laajennusten \u2013 puhumattakaan yhdest\u00e4 WordPress-laajennuksesta \u2013 uudelleenmuodostusprosessin l\u00e4pik\u00e4yminen voi olla ty\u00f6l\u00e4st\u00e4, mutta laajennuksen osan uudelleenmuodostamisen jakaminen on mahdollista.<\/p>\n<p>Joten aion k\u00e4ytt\u00e4\u00e4 esimerkki\u00e4 siit\u00e4, kuinka k\u00e4ytin jotain \u00e4skett\u00e4in (koodia on tiivistetty hieman, jotta en vaivaudu tarkentamaan tietty\u00e4 projektia).<\/p>\n<p>Vaihtoehtojen ihanteellisen tuoton kartoittaminen.<\/p>\n<p>Ennen kuin teet niin, mielest\u00e4ni on kuitenkin t\u00e4rke\u00e4\u00e4 kertoa, ett\u00e4 prosessini voi poiketa \u2013 tai todenn\u00e4k\u00f6isesti \u2013 poiketa sinun (koska monilla meist\u00e4 on erilaisia \u200b\u200bprosesseja).<\/p>\n<ol>\n<li>Suunnittele komponentti (kyll\u00e4, ei edes koko laajennus) muistikirjaan,<\/li>\n<li>Laadi tarkistuslista k\u00e4ytt\u00f6tapauksista, joissa sen pit\u00e4isi l\u00e4p\u00e4ist\u00e4 ja milloin sen pit\u00e4isi ep\u00e4onnistua,<\/li>\n<li>Kirjoita mit\u00e4 tietoja tarvitaan, miten niit\u00e4 tarvitaan ja milloin se tulisi j\u00e4tt\u00e4\u00e4 huomiotta<\/li>\n<li>Muunna kaikki yll\u00e4 oleva koodiksi.<\/li>\n<\/ol>\n<p>En tietenk\u00e4\u00e4n muuta kaikkea kirjaimellisesti koodiksi, mutta ymm\u00e4rr\u00e4tte idean. Ehk\u00e4 ytimekk\u00e4in tapa ilmaista se on seuraava:<\/p>\n<ul>\n<li>Aloita pitk\u00e4ll\u00e4 menetelm\u00e4ll\u00e4, joka palvelee ihanteellista k\u00e4ytt\u00f6tapausta. Refaktoroi sitten t\u00e4m\u00e4 koodi niin, ett\u00e4 funktiot ovat pienempi\u00e4 ja ota huomioon tapaukset, joissa tulos ep\u00e4onnistuu.<\/li>\n<\/ul>\n<p>N\u00e4in ollen koodi saattaa n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4.<\/p>\n<h3>1 Kirjoitus ihanteelliseen k\u00e4ytt\u00f6\u00f6n<\/h3>\n<p>T\u00e4ss\u00e4 esimerkiss\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-00-ideal-path-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ihanteellinen k\u00e4ytt\u00f6tapaus<\/a> on, kun k\u00e4ytt\u00e4j\u00e4 lataa vaihtoehdot, vaihtoehdot ovat l\u00e4sn\u00e4 ja sitten h\u00e4nen on suoritettava toiminto, jos vaihtoehdoilla on tietyt arvot.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options        = get_option( 'acme_date_options' );\n    $event_settings = $options['event'];\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4n osan pit\u00e4isi olla helppolukuinen, mutta se ei ota huomioon mit\u00e4\u00e4n muuta kuin ihanteellinen polku koodin l\u00e4pi.<\/p>\n<h3>2 Ota hieman puolustusta<\/h3>\n<p>Seuraavaksi haluan varmistaa, ett\u00e4 asetukset on asetettu ennen kuin yrit\u00e4n lukea niit\u00e4. Joissakin tapauksissa saatat haluta n\u00e4ytt\u00e4\u00e4 ilmoituksen, tehd\u00e4 poikkeuksen tai lokitietoja.<\/p>\n<p>T\u00e4ss\u00e4 esimerkiss\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-02-defensive-coding-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">palaan vain,<\/a> koska se on helppolukuinen ja sit\u00e4 voidaan helpoimmin mukauttaa k\u00e4ytt\u00f6\u00f6si.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! isset( $options['event'])) {\n            return;\n    }\n\n    $event_settings = $options['event'];\n    if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Joten se k\u00e4sittelee vaihtoehdot, mutta ent\u00e4 jos vaihtoehdot on asetettu, mutta niill\u00e4 ei ole odotettuja arvoja? T\u00e4m\u00e4 tarkoittaa, ett\u00e4 meid\u00e4n on my\u00f6s varmistettava, ett\u00e4 ne tekev\u00e4t. Ja jos ei, ohita ne, palauta, kirjaa virhe, tee poikkeus ja niin edelleen.<\/p>\n<p>Tied\u00e4tk\u00f6: Sama asia kuin edell\u00e4. Paitsi t\u00e4ss\u00e4 tapauksessa en aio tehd\u00e4 mit\u00e4\u00e4n, ellei koodissa ole ihanteellista tietoa.<\/p>\n<h3>3 Pidenty\u00e4 hieman<\/h3>\n<p>T\u00e4ss\u00e4 vaiheessa menetelm\u00e4st\u00e4 tulee hieman pitk\u00e4 ja sit\u00e4 on vaikeampi lukea. Tietysti, jos olet kokenut ohjelmoija, voit todeta, ett\u00e4 &quot;t\u00e4m\u00e4 on koodi, se ei ole englantia&quot;, mutta miksi et pyri tekem\u00e4\u00e4n siit\u00e4 hieman helpompi seurata?<\/p>\n<p>Lis\u00e4ksi se helpottaa testaamista. Mutta se ei kuulu t\u00e4m\u00e4n postauksen piiriin. Ota vaihtoehtojen arviointi koodin ensimm\u00e4isen\u00e4 esimerkkin\u00e4.<\/p>\n<ol>\n<li>T\u00e4m\u00e4 on jotain, joka voidaan p\u00e4\u00e4tell\u00e4 sen toimintoon, joka ei vain erist\u00e4 t\u00e4t\u00e4 tarkistusta, vaan my\u00f6s helpottaa tuloksena olevaa kutsua.<\/li>\n<li>Ota seuraavaksi toinen koodilohko, joka tarkistaa ihanteelliset vaihtoehdon arvot. T\u00e4m\u00e4 voidaan my\u00f6s abstraktisti samoista syist\u00e4 edell\u00e4.<\/li>\n<li>Ja lopuksi m\u00e4\u00e4rit\u00e4 funktio varmistaaksesi, ett\u00e4 odotetut arvot on asetettu jokaiselle m\u00e4\u00e4ritetylle <a href=\"http:\/\/03-consolidation.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">arvolle<\/a> :<\/li>\n<\/ol>\n<pre><code>&lt;?php\n\nprivate function has_valid_option( $option) {\n  return isset( $option );\n}\n\nprivate function has_valid_values( $value1, $value2) {\n  return! (isset( $value1) &amp;&amp; isset( $value2) );\n}\n\nprivate function can_import_data( $value1, $value2) {\n\n    return (0 === strcmp( 'yes', $value1)) &amp;&amp; (0 === strcmp( 'events', $value2) );\n}<\/code><\/pre>\n<p>Joten nyt sinulla on kaksi pienemp\u00e4\u00e4 menetelm\u00e4\u00e4, jotka kapseloivat saman tarkistuksen, jonka teit.<\/p>\n<h3>4 Viimeinen toiminto<\/h3>\n<p>T\u00e4ss\u00e4 vaiheessa lopullinen funktio on paljon helpompi lukea, koska siin\u00e4 on kaksi aputoimintoa, jotka kiteytt\u00e4v\u00e4t heid\u00e4n vastuunsa, kun taas <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-04-final-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4m\u00e4 on palannut arvioimaan ihanteellista polkua<\/a> koodin l\u00e4pi:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! $this-&gt;has_valid_option( $options)) {\n        return;\n    }\n\n    $event_settings = $options['event'];\n    if (! $this-&gt;has_valid_values( $event_settings['import'], $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if ($this-&gt;can_import_data( $import, $post_type)) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Riitt\u00e4\u00e4, kun sanotaan, ett\u00e4 kun kyse on WordPress-laajennusten uudelleenmuodostamisesta, t\u00e4m\u00e4 on vain yksi esimerkki siit\u00e4, kuinka tehd\u00e4 siit\u00e4 vain osa. Mutta se on alku, eik\u00f6?<\/p>\n<h2>Kokonaiset lis\u00e4osat?<\/h2>\n<p>Tied\u00e4n, eik\u00f6? WordPress-laajennusten muokkaaminen ei ole vitsi. Mutta jos aloitat t\u00e4m\u00e4n kaltaisilla pienill\u00e4 funktioilla ja liikut v\u00e4hitellen koodikannan ymp\u00e4ri, se helpottuu.<\/p>\n<p>Ja jos k\u00e4yt\u00e4t aikaa projektin suunnitteluun alusta alkaen, se voi s\u00e4\u00e4st\u00e4\u00e4 paljon aikaa palaamiseen ja t\u00e4llaisten asioiden uudelleenk\u00e4sittelyyn.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <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-laajennusten muokkaaminen on ty\u00f6t\u00e4. Mutta jos aloitat pienill\u00e4 funktioilla ja liikut v\u00e4hitellen koodikannan ymp\u00e4ri, se helpottuu.<\/p>\n","protected":false},"author":1,"featured_media":220671,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[750,719,895,813,917,864],"tags":[1166],"class_list":["post-229025","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-avoin-laehdekoodi","category-kehittaejae","category-koodi","category-laajennuksia","category-muut","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=229025"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229025\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/220671"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}