{"id":233863,"date":"2023-02-24T09:44:00","date_gmt":"2023-02-24T06:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233863"},"modified":"2022-11-11T12:52:19","modified_gmt":"2022-11-11T09:52:19","slug":"kuinka-ottaa-kaeyttoeoen-automaattinen-latausohjelma-nimiavaruuksilla-wordpress-teemassa-tai-laajennuksessa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/kuinka-ottaa-kaeyttoeoen-automaattinen-latausohjelma-nimiavaruuksilla-wordpress-teemassa-tai-laajennuksessa\/","title":{"rendered":"Kuinka ottaa k\u00e4ytt\u00f6\u00f6n automaattinen latausohjelma nimiavaruuksilla WordPress-teemassa tai -laajennuksessa"},"content":{"rendered":"\n<p>Jos kirjoitat oliopohjaista koodia, automaattinen latausohjelma on pakollinen. Ilman automaattista latausohjelmaa sinun on lis\u00e4tt\u00e4v\u00e4 rivi, joka sis\u00e4lt\u00e4\u00e4 luokkatiedoston, ennen kuin voit alustaa sen. Se voi nopeasti olla hankalaa, kun ty\u00f6skentelet useiden luokkien kanssa. Autoloader on toiminto, joka laukeaa aina, kun uusi luokka instantoidaan, ja sis\u00e4lt\u00e4\u00e4 luokkatiedoston ennen instanssia.<\/p>\n<p>Nimiavaruudet ovat tapa j\u00e4sent\u00e4\u00e4 ja kapseloida koodia ja auttaa v\u00e4ltt\u00e4m\u00e4\u00e4n nimien t\u00f6rm\u00e4yksi\u00e4. Jos aiot kirjoittaa OOP, on suositeltavaa k\u00e4ytt\u00e4\u00e4 my\u00f6s nimiavaruuksia. Muista, ett\u00e4 voit ottaa k\u00e4ytt\u00f6\u00f6n automaattisen latausohjelman k\u00e4ytt\u00e4m\u00e4tt\u00e4 nimiavaruuksia OOP-koodissasi.<\/p>\n<p>Voit k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 koodia WordPress-teemassasi tai -laajennuksessasi tai mit\u00e4 tahansa PHP-koodia WordPressin ulkopuolella \u2013 muuta polkuja vastaavasti. T\u00e4t\u00e4 esimerkki\u00e4 varten olen luomassa automaattista latausohjelmaa WordPress-teemaa varten.<\/p>\n<h2>Luokan nimiavaruuden ja rakenteen s\u00e4\u00e4nn\u00f6t<\/h2>\n<p>Autoloaderin k\u00e4ytt\u00f6\u00f6notto vaatisi joitain m\u00e4\u00e4riteltyj\u00e4 s\u00e4\u00e4nt\u00f6j\u00e4 koodirakenteelle ja mist\u00e4 ne l\u00f6ytyv\u00e4t. Nimiavaruuksien k\u00e4ytt\u00e4minen yksinkertaistaa t\u00e4t\u00e4 jonkin verran, koska nimiavaruutesi voi viitata siihen, miss\u00e4 kansiossa luokat ovat.<\/p>\n<p>Tee ensin p\u00e4\u00e4t\u00f6s siit\u00e4, mik\u00e4 nimiavaruutesi pit\u00e4isi nimet\u00e4. Yleens\u00e4 se on jotain ainutlaatuista koodillesi, esimerkiksi teemasi nimi. Esimerkiksi t\u00e4m\u00e4n sivuston teeman nimiavaruus on <code>AWhitePixelTheme<\/code>. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 automaattinen latausohjelma toimii, kaikkien luokkien on oltava t\u00e4ss\u00e4 nimiavaruudessa.<\/p>\n<pre><code>namespace AWhitePixelTheme;<\/code><\/pre>\n<p>Ensimm\u00e4inen s\u00e4\u00e4nt\u00f6ni on, ett\u00e4 mik\u00e4 tahansa luokkatiedosto sis\u00e4lt\u00e4\u00e4 aina vain yhden luokan ja luokan nimen on oltava sama kuin tiedoston nimi. Esimerkiksi; luokka <code>MyTest<\/code>on m\u00e4\u00e4ritett\u00e4v\u00e4 tiedoston sis\u00e4ll\u00e4 <code>MyTest.php<\/code>.<\/p>\n<p>Toinen s\u00e4\u00e4nt\u00f6ni on, kuinka luokat rakennetaan kansioihin. P\u00e4\u00e4t\u00e4n, ett\u00e4 kaikki luokat menev\u00e4t teemani kansioon <code>src<\/code>. Voin laittaa luokkatiedostot suoraan t\u00e4h\u00e4n kansioon, ja sit\u00e4 varten niiden tulee olla yll\u00e4 m\u00e4\u00e4ritellyn &quot;root&quot;-nimiavaruuden sis\u00e4ll\u00e4. Mutta jos haluan luoda alikansioita ja laittaa niihin luokkatiedostoja, niiden nimiavaruuksien tulee sis\u00e4lt\u00e4\u00e4 kansiorakenne. Esim luokka kansiossa <code>MyTest.php<\/code>olevalle tiedostolle <code>src\/Test\/<\/code>on m\u00e4\u00e4ritett\u00e4v\u00e4 t\u00e4m\u00e4 nimiavaruus:<\/p>\n<pre><code>namespace AWhitePixelThemeTest;<\/code><\/pre>\n<h2>Autoloaderin luominen<\/h2>\n<p>Haluan pit\u00e4\u00e4 automaattisen latausohjelman erillisess\u00e4 tiedostossa ja <code>src\/<\/code>kansion ulkopuolella, joka on m\u00e4\u00e4ritetty vain nimiv\u00e4litteisille luokkatiedostoille. Esimerkkin\u00e4 luon tiedoston <code>autoloader.php<\/code>teemani kansioon <code>inc\/<\/code>.<\/p>\n<p>PHP:ss\u00e4 on sis\u00e4\u00e4nrakennettu automaattinen lataustoiminto: <a href=\"https:\/\/www.php.net\/manual\/en\/function.spl-autoload-register.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">spl_autoload_register<\/a>. Annat parametriksi autoloader-funktion nimen ja tuossa funktiossa saat pyydetyn luokan argumenttina (mit\u00e4 laitat <code>new<\/code>luokkaa ilment\u00e4ess\u00e4si). Kun luokissa on nimiavaruuksia, esim <code>new AWhitePixelThemeTestMyTest()<\/code>., t\u00e4m\u00e4n funktion muuttuja olisi <code>\"AWhitePixelThemeTestMyTest\"<\/code>.<\/p>\n<p>Lis\u00e4t\u00e4\u00e4n autoloader-toiminto, ja siin\u00e4 m\u00e4\u00e4ritet\u00e4\u00e4n vaadittava nimiavaruus automaattilataajalle:<\/p>\n<pre><code>&lt;?php\nspl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace = 'AWhitePixelTheme';\n\u00a0\n}<\/code><\/pre>\n<p>Sitten meid\u00e4n on sis\u00e4llytett\u00e4v\u00e4 t\u00e4m\u00e4 tiedosto, jotta automaattinen latausohjelmamme rekister\u00f6id\u00e4\u00e4n. Koska t\u00e4m\u00e4 kuuluu teemaan, lis\u00e4\u00e4n sis\u00e4llytt\u00e4misen teemaan <code>functions.php<\/code>. Jos k\u00e4yt\u00e4t t\u00e4t\u00e4 laajennukselle, laita se laajennustiedostoihisi. Autoloader-tiedosto on lis\u00e4tt\u00e4v\u00e4 aikaisin, ennen luokkien ilment\u00e4mist\u00e4. Laitan t\u00e4m\u00e4n ensimm\u00e4iselle rivilleni <code>functions.php<\/code>:<\/p>\n<pre><code>require_once(get_template_directory(). '\/inc\/autoloader.php');<\/code><\/pre>\n<p>Jos k\u00e4yt\u00e4t sit\u00e4 lapsiteemaan tai laajennukseen, muokkaa polkua tarpeidesi mukaan.<\/p>\n<p>Ja siin\u00e4 se. Autoloader on nyt paikallaan, mutta se ei tee mit\u00e4\u00e4n. Palataan automaattiseen lataustoimintoon ja lopetetaan se.<\/p>\n<h2>Autoloader-toiminnon kirjoittaminen ja testaus<\/h2>\n<p>Ensin meid\u00e4n on varmistettava, ett\u00e4 pyydetty luokan nimi on todella nimiavaruudessamme. Tarkistamme vain, sis\u00e4lt\u00e4\u00e4k\u00f6 annettu nimiavaruuden luokan nimi nimiavaruuden merkkijonon, ja jos ei, poistumme funktiosta. T\u00e4m\u00e4n j\u00e4lkeen poistamme nimiavaruuden nimen merkkijonosta, jotta voimme selvitt\u00e4\u00e4 mahdolliset alikansiot ja luokkatiedostot.<\/p>\n<pre><code>&lt;?php\nspl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace_name = 'AWhitePixelTheme';\n\u00a0\n    if (strpos($class, $namespace) !== 0) {\n        return;\n    }\n    $class = str_replace($namespace, '', $class);\n}<\/code><\/pre>\n<p>Nyt muutetaan annettu nimiavaruus todelliseksi polkuksi tiedostoon. Ensin korvaamme kenoviivan <code>\"\"<\/code>nimiavaruudessa kansion erottimen merkill\u00e4 \u2013 t\u00e4t\u00e4 varten k\u00e4yt\u00e4mme PHP-vakiota <code>DIRECTORY_SEPARATOR<\/code>. Aivan lopussa lis\u00e4\u00e4mme <code>\".php\"<\/code>. Ja lopuksi ennen merkkijonoa lis\u00e4\u00e4mme koko juuripolun. Koska t\u00e4m\u00e4 on teeman sis\u00e4ll\u00e4, k\u00e4yt\u00e4n <code>get_template_directory()<\/code>. Jos k\u00e4yt\u00e4t t\u00e4t\u00e4 laajennukselle, k\u00e4yt\u00e4 menetelm\u00e4\u00e4, joka palauttaa t\u00e4yden polun laajennukseen.<\/p>\n<pre><code>    ...\n    $class = str_replace($namespace, '', $class);\n\u00a0\n    $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';\n    $directory = get_template_directory();\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n}<\/code><\/pre>\n<p>Meid\u00e4n tarvitsee nyt vain tarkistaa, onko tiedosto olemassa, ja jos on, vaatia sit\u00e4.<\/p>\n<pre><code>    ...\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n\u00a0\n    if (file_exists($path)) {\n        require_once($path);\n    }\n}<\/code><\/pre>\n<p>Se siit\u00e4!<\/p>\n<p>Testataanpa sit\u00e4. Luo alikansio <code>Test<\/code>teemasi <code>src\/<\/code>kansioon ja laita sen sis\u00e4\u00e4n php-tiedosto nimelt\u00e4 <code>MyTest.php<\/code>. M\u00e4\u00e4rittele siihen luokka <code>MyTest<\/code>nimiavaruuden s\u00e4\u00e4nt\u00f6jen mukaisesti: <code>AWhitePixelThemeTest<\/code>. Lis\u00e4\u00e4n vain tulosteen &quot;Success&quot; konstruktiofunktioon, jotta voimme helposti n\u00e4hd\u00e4, ett\u00e4 se todella alustaa luokan.<\/p>\n<pre><code>&lt;?php\nnamespace AWhitePixelThemeTest;\n\u00a0\nclass MyTest {\n    public function __construct() {\n        var_dump('Success!');\n    }\n}<\/code><\/pre>\n<p>Funktiones.php:ss\u00e4, kun olemme vaatineet automaattisen latausohjelman, luomme luokan:<\/p>\n<pre><code>$test = new AWhitePixelThemeTestMyTest();<\/code><\/pre>\n<p>P\u00e4ivit\u00e4 WordPress-sivustosi ja varmista, ett\u00e4 saat &quot;Onnistuminen!&quot; tulostettu.<\/p>\n<p>Autoloader lataa automaattisesti kaikki luokkatiedostot, jotka ovat m\u00e4\u00e4ritetyss\u00e4 nimiavaruudessa, ja noudattaa oikeita s\u00e4\u00e4nt\u00f6j\u00e4. Voit luoda kursseja mist\u00e4 tahansa teeman sis\u00e4ll\u00e4, jopa itse luokissa.<\/p>\n<h2>T\u00e4ysi automaattinen lataustoiminto<\/h2>\n<p>Viitteeksi t\u00e4ss\u00e4 on viimeinen automaattinen lataustoimintomme:<\/p>\n<pre><code>spl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace = 'AWhitePixelTheme';\n\u00a0\n    if (strpos($class, $namespace) !== 0) {\n        return;\n    }\n\u00a0\n    $class = str_replace($namespace, '', $class);\n    $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';\n\u00a0\n    $directory = get_template_directory();\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n\u00a0\n    if (file_exists($path)) {\n        require_once($path);\n    }\n}<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Opas automaattisen latausohjelman kirjoittamiseen, joka mahdollistaa nimiavaruuksien lis\u00e4\u00e4misen oliokoodillesi WordPress-teemaan tai -laajennukseen.<\/p>\n","protected":false},"author":1,"featured_media":224072,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[927,895,719,719,895,917,917,1110,834,843,834,927,843,864,864],"tags":[1166],"class_list":["post-233863","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aiheita","category-koodi","category-kehittaejae","category-muut","category-n-a","category-opas-aloittelijoille","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233863","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=233863"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233863\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233863"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233863"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233863"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}