{"id":230511,"date":"2022-11-24T10:46:00","date_gmt":"2022-11-24T07:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230511"},"modified":"2022-11-09T22:43:21","modified_gmt":"2022-11-09T19:43:21","slug":"modifica-i-contenitori-di-immagini-sul-lato-server-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/modifica-i-contenitori-di-immagini-sul-lato-server-in-wordpress\/","title":{"rendered":"Modifica i contenitori di immagini sul lato server in WordPress"},"content":{"rendered":"\n<p>Ogni volta che crei soluzioni personalizzate per altre persone, potresti trovarti a dover affrontare casi sfumati di come WordPress sta visualizzando il contenuto.<\/p>\n<p>Questo di solito dipende dal tema, almeno un plug-in o dalla combinazione di entrambi. E se hai bisogno di lavorare con le immagini individualmente, allora pu\u00f2 essere un po&#8217; una sfida. Il problema anche solo nel provare a scrivere un post come questo \u00e8 che \u00e8 difficile persino descrivere una situazione in cui potresti aver bisogno di qualcosa del genere.<\/p>\n<p>Comunque, far\u00f2 del mio meglio. Cio\u00e8, voglio condividere come modificare i contenitori di immagini sul lato server prima di eseguirne il rendering sul lato client e farlo utilizzando la libreria DOMDocument di PHP.<\/p>\n<p>Suona come molto? Spero di poterlo scomporre abbastanza facilmente.<\/p>\n<p>Prima di entrare nel codice, supponiamo che tu ne abbia uno che esegue il rendering di immagini in un singolo elemento di paragrafo (o qualsiasi tipo di elemento a livello di blocco) e devi racchiudere ogni elemento in un tipo di classe in modo da poter accedere tramite CSS o JavaScript.<\/p>\n<h3>Dove siamo<\/h3>\n<p>Quindi, per cominciare, diciamo che le immagini vengono renderizzate in questo modo:<\/p>\n<p>E devi renderli in questo modo:<\/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=\"Modifica i contenitori di immagini sul lato server in WordPress\" ><\/a><\/p>\n<p>Ora, potresti aver bisogno o meno di spazio tra di loro. Non importa perch\u00e9 hai il controllo su questo tramite CSS. Ma hai il controllo su come questo viene inviato attraverso il filo al lato client.<\/p>\n<p>Per fare ci\u00f2, hai bisogno di alcune cose:<\/p>\n<ul>\n<li>Accesso alla libreria DOMDocument di PHP,<\/li>\n<li>Comprensione di come manipolare i contenuti tramite l&#8217; hook <strong>the_content di WordPress,<\/strong><\/li>\n<li>Una strategia per come vuoi avvolgere le immagini.<\/li>\n<\/ul>\n<p>Illustrer\u00f2 ciascuno di questi nel codice, ma \u00e8 sufficiente dire che avvolger\u00f2 ogni immagine in un elemento di paragrafo. Ovviamente puoi scegliere di fare quello che vuoi.<\/p>\n<h3>Come farlo<\/h3>\n<p>Innanzitutto, assicurati di aver dichiarato che stai utilizzando il contenuto del documento DOM sopra <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-00-acme-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la tua classe<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nuse DOMDocument;\n\nclass AcmeContentSubscriber\n{\n  \/\/ ...\n}\n<\/code><\/pre>\n<p>Quindi, vai avanti e crea un hook a <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/the_content\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">the_content<\/a>. Il modo in cui lo fai dipender\u00e0 da come hai organizzato il tuo codice (che sia <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">OOP<\/a> o meno). Per questo esempio, mostrer\u00f2 un esempio molto semplice di <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-01-acme-content-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">come farlo<\/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>Dopodich\u00e9, dovrai fare un po&#8217; di lavoro (che \u00e8 tutto sotto ma fuori dallo scopo di questo post). Ci\u00f2 comprende:<\/p>\n<ul>\n<li>convertire la codifica delle entit\u00e0 HTML,<\/li>\n<li>creando un&#8217;istanza del documento DOM,<\/li>\n<li>caricamento dell&#8217;HTML del post dal contenuto in arrivo<\/li>\n<\/ul>\n<p>Nel codice dovrebbe apparire <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\">cos\u00ec<\/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>Successivamente, devi scorrere gli\u00a0 elementi <strong>img<\/strong> e assicurarti di impostare un attributo corretto. Puoi scegliere di utilizzare una classe, puoi scegliere di utilizzare un attributo di dati o puoi scegliere di utilizzare qualcos&#8217;altro. Questa parte non ha importanza.<\/p>\n<p>Nota che per una determinata immagine, ti consigliamo di verificare che l&#8217;elemento successivo non sia un elemento di paragrafo poich\u00e9 \u00e8 quello che sto optando per avvolgere l&#8217;immagine. In altre parole, se l&#8217;elemento successivo non \u00e8 un paragrafo, avvolgeremo l&#8217;elemento in un elemento paragrafo.<\/p>\n<p>Per fare ci\u00f2, lo scheletro della funzione principale dovrebbe <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\">assomigliare a questo<\/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>Quindi la funzione responsabile per avvolgere effettivamente l&#8217;elemento in un elemento di paragrafo dovrebbe assomigliare <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-05-wrap-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questa<\/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>Assicurati di leggere il DocBlock del codice per capire come funziona la funzione. In poche parole:<\/p>\n<ul>\n<li>accetta un&#8217;istanza del documento e l&#8217;elemento immagine,<\/li>\n<li>crea un elemento paragrafo,<\/li>\n<li>aggiunge un attributo di classe<\/li>\n<li>sostituisce l&#8217;elemento dell&#8217;immagine originale con il paragrafo,<\/li>\n<li>e aggiunge l&#8217;immagine come elemento figlio<\/li>\n<\/ul>\n<p>E poich\u00e9 abbiamo basato l&#8217;oggetto del documento nel metodo, non dobbiamo restituire nulla.<\/p>\n<p>La versione finale della funzione originale dovrebbe assomigliare <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\">a questa<\/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>E il tuo output dovrebbe assomigliare all&#8217;immagine sopra. Ricorda, per\u00f2; devi restituire i risultati dell&#8217;istanza del documento a WordPress, quindi esegue correttamente il rendering dell&#8217;HTML. Ed \u00e8 ci\u00f2 che sta facendo la\u00a0 funzione <strong>saveHTML<\/strong> nel codice sopra.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scopri come utilizzare DOMDocument per modificare gli elementi HTML prima di renderizzarli.<\/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":[720,844,865],"tags":[1168],"class_list":["post-230511","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=230511"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230511\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/221217"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}