{"id":229769,"date":"2022-11-24T10:41:00","date_gmt":"2022-11-24T07:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229769"},"modified":"2022-11-09T16:18:36","modified_gmt":"2022-11-09T13:18:36","slug":"muutke-wordpressis-serveripoolseid-pildikonteinereid","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/muutke-wordpressis-serveripoolseid-pildikonteinereid\/","title":{"rendered":"Muutke WordPressis serveripoolseid pildikonteinereid"},"content":{"rendered":"\n<p>Kui loote kohandatud lahendusi teistele inimestele, v\u00f5ib juhtuda, et peate tegelema n\u00fcansirikaste juhtumitega, kuidas WordPress sisu renderdab.<\/p>\n<p>Tavaliselt taandub see teemale, v\u00e4hemalt \u00fchele pistikprogrammile v\u00f5i m\u00f5lema kombinatsioonile. Ja kui teil on vaja t\u00f6\u00f6tada piltidega eraldi, v\u00f5ib see olla v\u00e4ike v\u00e4ljakutse. Isegi sellise postituse kirjutamise proovimisel on probleem selles, et isegi raske on kirjeldada olukorda, kus teil v\u00f5ib midagi sellist vaja minna.<\/p>\n<p>Sellegipoolest annan ma endast parima. See t\u00e4hendab, et ma tahan jagada, kuidas muuta pildikonteinereid serveri poolel enne nende renderdamist kliendi poolel ja teha seda PHP DOMDocument teegi abil.<\/p>\n<p>K\u00f5lab nagu palju? Loodetavasti saan selle piisavalt lihtsalt lahti.<\/p>\n<p>Enne koodiga tutvumist oletame, et teil on need, mis renderdavad pilte \u00fches l\u00f5iguelemendis (v\u00f5i mis tahes t\u00fc\u00fcpi plokitaseme elemendis) ja peate iga elemendi m\u00e4hkima teatud t\u00fc\u00fcpi klassi, et teil oleks juurdep\u00e4\u00e4s seda CSS-i v\u00f5i JavaScripti kaudu.<\/p>\n<h3>Kus me oleme<\/h3>\n<p>Alustuseks oletame, et pildid renderdatakse j\u00e4rgmiselt:<\/p>\n<p>Ja peate need renderdama j\u00e4rgmiselt:<\/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=\"Muutke WordPressis serveripoolseid pildikonteinereid\" ><\/a><\/p>\n<p>N\u00fc\u00fcd v\u00f5ib nende vahel ruumi vaja minna v\u00f5i mitte. See pole tegelikult oluline, sest teil on CSS-i kaudu kontroll selle \u00fcle. Kuid teil on kontroll selle \u00fcle, kuidas see juhtme kaudu kliendi poolele saadetakse.<\/p>\n<p>Selleks vajate m\u00f5nda asja:<\/p>\n<ul>\n<li>Juurdep\u00e4\u00e4s PHP DOMDocumenti teegile,<\/li>\n<li>WordPressi konksu <strong>the_content<\/strong> kaudu sisuga manipuleerimise m\u00f5istmine\u00a0 ,<\/li>\n<li>Strateegia selle kohta, kuidas soovite pilte pakkida.<\/li>\n<\/ul>\n<p>Ma k\u00e4sitlen k\u00f5iki neid koodis, kuid piisab, kui \u00f6elda, et m\u00e4hkin iga pildi l\u00f5igu elemendiks. Ilmselgelt saate teha seda, mida soovite.<\/p>\n<h3>Kuidas seda teha<\/h3>\n<p>Esiteks veenduge, et olete deklareerinud, et kasutate <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-00-acme-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oma klassi<\/a><\/strong> kohal oleva DOM-dokumendi sisu :<\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nuse DOMDocument;\n\nclass AcmeContentSubscriber\n{\n  \/\/ ...\n}\n<\/code><\/pre>\n<p>J\u00e4rgmisena j\u00e4tkake ja looge konks <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/the_content\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">saidile_content<\/a>. Kuidas seda teha, s\u00f5ltub sellest, kuidas olete oma koodi korraldanud (olgu see siis <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">OOP<\/a> v\u00f5i mitte). Selle n\u00e4ite puhul n\u00e4itan v\u00e4ga lihtsat n\u00e4idet selle kohta, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-01-acme-content-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kuidas seda teha<\/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>P\u00e4rast seda peate natuke t\u00f6\u00f6d tegema (k\u00f5ik see on allpool, kuid v\u00e4ljaspool selle postituse ulatust). See sisaldab:<\/p>\n<ul>\n<li>HTML-\u00fcksuste kodeeringu teisendamine,<\/li>\n<li>DOM-dokumendi eksemplari loomine,<\/li>\n<li>postituse HTML-i laadimine sissetulevast sisust<\/li>\n<\/ul>\n<p>Koodis peaks see v\u00e4lja n\u00e4gema <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\">j\u00e4rgmine<\/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>J\u00e4rgmiseks peate l\u00e4bima <strong>img<\/strong> &#8211; elemendid ja veenduma, et m\u00e4\u00e4rate \u00f5ige atribuudi. V\u00f5ite valida klassi kasutamise, andmeatribuudi kasutamise v\u00f5i millegi muu kasutamise. See osa ei oma t\u00e4htsust.<\/p>\n<p>Pange t\u00e4hele, et antud pildi puhul peaksite kontrollima, et j\u00e4rgmine element ei oleks l\u00f5iguelement, kuna valin pildi \u00fcmber selle. Teisis\u00f5nu, kui j\u00e4rgmine element ei ole l\u00f5ik, siis m\u00e4hime elemendi l\u00f5igu elemendiks.<\/p>\n<p>Selleks peaks p\u00f5hifunktsiooni skelett v\u00e4lja <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\u00e4gema j\u00e4rgmine<\/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>Siis peaks funktsioon, mis vastutab elemendi tegelikult l\u00f5iguelemendis m\u00e4hkimise eest, v\u00e4lja n\u00e4gema <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-05-wrap-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rgmine<\/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>Funktsiooni toimimise m\u00f5istmiseks lugege kindlasti koodi DocBlocki. Lihtsamalt \u00f6eldes:<\/p>\n<ul>\n<li>see aktsepteerib dokumendi eksemplari ja pildielementi,<\/li>\n<li>loob l\u00f5igu elemendi,<\/li>\n<li>lisab klassi atribuudi<\/li>\n<li>asendab algse pildielemendi l\u00f5iguga,<\/li>\n<li>ja lisab pildi alamelemendina<\/li>\n<\/ul>\n<p>Ja kuna oleme meetodi aluseks v\u00f5tnud dokumendiobjekti, ei pea me midagi tagastama.<\/p>\n<p>Algse funktsiooni l\u00f5plik versioon peaks v\u00e4lja n\u00e4gema <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\">j\u00e4rgmine<\/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 teie v\u00e4ljund peaks v\u00e4lja n\u00e4gema nagu \u00fclaltoodud pildil. Pidage siiski meeles; peate dokumendi eksemplari tulemused WordPressile tagastama, et see renderdaks HTML-i \u00f5igesti. Ja seda teeb \u00fclaltoodud koodis funktsioon <strong>saveHTML .<\/strong><\/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>Vaadake, kuidas kasutada DOMDocumenti HTML-elementide muutmiseks enne nende renderdamist.<\/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":[718,842,863],"tags":[1165],"class_list":["post-229769","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-opetused","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=229769"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229769\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/221217"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=229769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=229769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=229769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}