{"id":230373,"date":"2022-11-24T11:02:00","date_gmt":"2022-11-24T08:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230373"},"modified":"2022-11-09T22:05:02","modified_gmt":"2022-11-09T19:05:02","slug":"muokkaa-kuvasaeilioeitae-palvelinpuolella-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/muokkaa-kuvasaeilioeitae-palvelinpuolella-wordpressissae\/","title":{"rendered":"Muokkaa kuvas\u00e4ili\u00f6it\u00e4 palvelinpuolella WordPressiss\u00e4"},"content":{"rendered":"\n<p>Aina kun rakennat mukautettuja ratkaisuja muille ihmisille, saatat joutua k\u00e4sittelem\u00e4\u00e4n vivahteita, kuinka WordPress render\u00f6i sis\u00e4lt\u00f6\u00e4.<\/p>\n<p>T\u00e4m\u00e4 johtuu yleens\u00e4 teemasta, v\u00e4hint\u00e4\u00e4n yhdest\u00e4 laajennuksesta tai molempien yhdistelm\u00e4st\u00e4. Ja jos sinun on ty\u00f6skennelt\u00e4v\u00e4 kuvien kanssa erikseen, se voi olla pieni haaste. Ongelma edes yritt\u00e4\u00e4 kirjoittaa t\u00e4llaista viesti\u00e4 on, ett\u00e4 on vaikea edes kuvata tilannetta, jossa saatat tarvita jotain t\u00e4llaista.<\/p>\n<p>Silti aion tehd\u00e4 parhaani. Toisin sanoen haluan kertoa kuinka muokata kuvas\u00e4il\u00f6j\u00e4 palvelinpuolella ennen niiden render\u00f6imist\u00e4 asiakaspuolella ja tehd\u00e4 se PHP:n DOMDocument-kirjaston avulla.<\/p>\n<p>Kuulostaako paljon? Toivottavasti pystyn rikkomaan t\u00e4m\u00e4n riitt\u00e4v\u00e4n helposti.<\/p>\n<p>Oletetaan ennen koodiin perehtymist\u00e4, ett\u00e4 sinulla on ne, jotka render\u00f6iv\u00e4t kuvat yhdess\u00e4 kappaleelementiss\u00e4 (tai miss\u00e4 tahansa lohkotason elementiss\u00e4) ja sinun on k\u00e4\u00e4ritt\u00e4v\u00e4 jokainen elementti jonkin tyyppiseen luokkaan, jotta voit k\u00e4ytt\u00e4\u00e4 niit\u00e4 se CSS:n tai JavaScriptin kautta.<\/p>\n<h3>Miss\u00e4 olemme<\/h3>\n<p>Joten aluksi, oletetaan, ett\u00e4 kuvat n\u00e4kyv\u00e4t seuraavasti:<\/p>\n<p>Ja sinun t\u00e4ytyy hahmontaa ne n\u00e4in:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164647-61e7698060b2e.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164647-61e7698060b2e.png\" alt=\"Muokkaa kuvas\u00e4ili\u00f6it\u00e4 palvelinpuolella WordPressiss\u00e4\" ><\/a><\/p>\n<p>Nyt saatat tarvita tai et tarvitse tilaa niiden v\u00e4liin. Sill\u00e4 ei ole v\u00e4li\u00e4, koska voit hallita t\u00e4t\u00e4 CSS:n kautta. Mutta voit hallita sit\u00e4, kuinka t\u00e4m\u00e4 l\u00e4hetet\u00e4\u00e4n langan kautta asiakaspuolelle.<\/p>\n<p>T\u00e4t\u00e4 varten tarvitset muutaman asian:<\/p>\n<ul>\n<li>P\u00e4\u00e4sy PHP:n DOMDocument-kirjastoon,<\/li>\n<li>Ymm\u00e4rt\u00e4\u00e4 kuinka k\u00e4sitell\u00e4 sis\u00e4lt\u00f6\u00e4 WordPressin <strong>the_content<\/strong> koukun avulla,<\/li>\n<li>Strategia siit\u00e4, miten haluat k\u00e4\u00e4ri\u00e4 kuvat.<\/li>\n<\/ul>\n<p>K\u00e4yn l\u00e4pi kaikki n\u00e4m\u00e4 koodissa, mutta riitt\u00e4\u00e4, kun sanon, ett\u00e4 aion k\u00e4\u00e4ri\u00e4 jokaisen kuvan kappaleelementtiin. Voit tietysti valita tehd\u00e4 mit\u00e4 haluat.<\/p>\n<h3>Kuinka tehd\u00e4 se<\/h3>\n<p>Varmista ensin, ett\u00e4 olet ilmoittanut k\u00e4ytt\u00e4v\u00e4si DOM-asiakirjan <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-00-acme-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sis\u00e4lt\u00f6\u00e4 luokkasi<\/a><\/strong> yl\u00e4puolella :<\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nuse DOMDocument;\n\nclass AcmeContentSubscriber\n{\n  \/\/ ...\n}\n<\/code><\/pre>\n<p>Siirry seuraavaksi ja luo koukku <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/the_content\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">the_content -tiedostoon<\/a>. Kuinka teet t\u00e4m\u00e4n, riippuu siit\u00e4, kuinka olet j\u00e4rjest\u00e4nyt koodisi (olipa se sitten <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">OOP<\/a> tai ei). T\u00e4ss\u00e4 esimerkiss\u00e4 aion n\u00e4ytt\u00e4\u00e4 hyvin yksinkertaisen esimerkin siit\u00e4, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-01-acme-content-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kuinka se tehd\u00e4\u00e4n<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\npublic function contentSubscriber()\n{\n  add_action( 'the_content', [$this, 'addImageAttributes']);\n}\n<\/code><\/pre>\n<p>Sen j\u00e4lkeen sinun on teht\u00e4v\u00e4 v\u00e4h\u00e4n ty\u00f6t\u00e4 (joka kaikki on alla, mutta t\u00e4m\u00e4n viestin ulkopuolella). T\u00e4m\u00e4 sis\u00e4lt\u00e4\u00e4:<\/p>\n<ul>\n<li>muuntaa HTML-kokonaisuuksien koodausta,<\/li>\n<li>luoda DOM-asiakirjan esiintym\u00e4,<\/li>\n<li>lataamalla viestin HTML-koodi saapuvasta sis\u00e4ll\u00f6st\u00e4<\/li>\n<\/ul>\n<p>Koodissa sen pit\u00e4isi n\u00e4ytt\u00e4\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-02-acme-add-image-attrbutes-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\npublic function addImageAttributes($content)\n{\n\n    $content  = mb_convert_encoding($content, 'HTML-ENTITIES', \"UTF-8\");\n    $document = new DOMDocument();\n\n    libxml_use_internal_errors(true);\n    $document-&gt;loadHTML(utf8_decode($content));\n\n    \/\/ ...\n}\n<\/code><\/pre>\n<p>Seuraavaksi sinun on toistettava <strong>img<\/strong> &#8211; elementit ja varmistettava, ett\u00e4 asetat oikean m\u00e4\u00e4ritteen. Voit valita luokan k\u00e4yt\u00f6n, dataattribuutin tai jonkin muun k\u00e4yt\u00f6n. T\u00e4ll\u00e4 osuudella ei ole v\u00e4li\u00e4.<\/p>\n<p>Huomaa, ett\u00e4 tietyn kuvan kohdalla sinun kannattaa tarkistaa, ett\u00e4 seuraava elementti ei ole kappaleelementti, koska olen valinnut kuvan rivityksen sen. Toisin sanoen, jos seuraava elementti ei ole kappale, k\u00e4\u00e4rimme elementin kappaleelementtiin.<\/p>\n<p>T\u00e4t\u00e4 varten p\u00e4\u00e4toiminnon rungon tulisi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-03-acme-add-image-attrbutes-part-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\npublic function addImageAttributes($content)\n{\n\n    $content  = mb_convert_encoding($content, 'HTML-ENTITIES', \"UTF-8\");\n    $document = new DOMDocument();\n\n    libxml_use_internal_errors(true);\n    $document-&gt;loadHTML(utf8_decode($content));\n\n    $images = $document-&gt;getElementsByTagName('img');\n    foreach ($images as $image) {\n        $image-&gt;setAttribute('class', 'acme-iamge');\n        if ($image-&gt;nextSibling-&gt;tagName !== 'p') {\n            $this-&gt;wrapImage($document, $image);\n        }\n    }\n\n    \/\/ ...\n}\n<\/code><\/pre>\n<p>T\u00e4ll\u00f6in elementin k\u00e4\u00e4rimisest\u00e4 kappaleelementtiin vastaavan funktion pit\u00e4isi n\u00e4ytt\u00e4\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-05-wrap-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * This function is used to wrap individual images in a paragraph element.\n *\n * @param $document The DOM Document which is to be rendered.\n * @param $image    The image to wrap with the new paragraph element.\n *\/\nprivate function wrapImage($document, $image)\n{\n    if (null === $image) {\n        return;\n    }\n    $wrapper = $document-&gt;createElement('p');\n    $wrapper-&gt;setAttribute('class', 'acme-image');\n\n    $image-&gt;parentNode-&gt;replaceChild($wrapper, $image);\n    if (null !== $image) {\n        $wrapper-&gt;appendChild($image);\n    }\n}\n<\/code><\/pre>\n<p>Muista lukea koodin DocBlock ymm\u00e4rt\u00e4\u00e4ksesi, kuinka toiminto toimii. Yksinkertaisesti sanottuna:<\/p>\n<ul>\n<li>se hyv\u00e4ksyy asiakirjan esiintym\u00e4n ja kuvaelementin,<\/li>\n<li>luo kappaleelementin,<\/li>\n<li>lis\u00e4\u00e4 luokkaattribuutin<\/li>\n<li>korvaa alkuper\u00e4isen kuvaelementin kappaleella,<\/li>\n<li>ja lis\u00e4\u00e4 kuvan lapsielementiksi<\/li>\n<\/ul>\n<p>Ja koska olemme perustaneet asiakirjaobjektin menetelm\u00e4\u00e4n, meid\u00e4n ei tarvitse palauttaa mit\u00e4\u00e4n.<\/p>\n<p>Alkuper\u00e4isen funktion lopullisen version pit\u00e4isi n\u00e4ytt\u00e4\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-04-acme-add-image-attrbutes-part-3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\npublic function addImageAttributes($content)\n{\n\n    $content  = mb_convert_encoding($content, 'HTML-ENTITIES', \"UTF-8\");\n    $document = new DOMDocument();\n\n    libxml_use_internal_errors(true);\n    $document-&gt;loadHTML(utf8_decode($content));\n\n    $images = $document-&gt;getElementsByTagName('img');\n    foreach ($images as $image) {\n        $image-&gt;setAttribute('class', 'acme-image');\n        if ($image-&gt;nextSibling-&gt;tagName !== 'p') {\n            $this-&gt;wrapImage($document, $image);\n        }\n    }\n\n  return $document-&gt;saveHTML();\n}\n<\/code><\/pre>\n<p>Ja tulostesi pit\u00e4isi n\u00e4ytt\u00e4\u00e4 yll\u00e4 olevalta kuvalta. Muista kuitenkin; Sinun on palautettava asiakirjainstanssin tulokset WordPressiin, jotta se hahmontaa HTML-koodin oikein. Ja sit\u00e4 <strong>saveHTML-<\/strong> toiminto tekee yll\u00e4 olevassa koodissa.<\/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>Tutustu DOMDocumentin avulla HTML-elementtien muokkaamiseen ennen niiden hahmontamista.<\/p>\n","protected":false},"author":1,"featured_media":221217,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,843,864],"tags":[1166],"class_list":["post-230373","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230373","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=230373"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230373\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/221217"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}