{"id":229948,"date":"2022-11-24T11:20:00","date_gmt":"2022-11-24T08:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229948"},"modified":"2022-11-09T19:25:37","modified_gmt":"2022-11-09T16:25:37","slug":"modificar-contenedores-de-imagenes-en-el-lado-del-servidor-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/modificar-contenedores-de-imagenes-en-el-lado-del-servidor-en-wordpress\/","title":{"rendered":"Modificar contenedores de im\u00e1genes en el lado del servidor en WordPress"},"content":{"rendered":"\n<p>Siempre que est\u00e9 creando soluciones personalizadas para otras personas, es posible que tenga que lidiar con casos matizados de c\u00f3mo WordPress est\u00e1 representando el contenido.<\/p>\n<p>Esto generalmente se reduce al tema, al menos un complemento o la combinaci\u00f3n de ambos. Y si necesita trabajar con im\u00e1genes individualmente, entonces puede ser un desaf\u00edo. El problema de intentar escribir una publicaci\u00f3n como esta es que es dif\u00edcil incluso describir una situaci\u00f3n en la que podr\u00edas necesitar algo como esto.<\/p>\n<p>A\u00fan as\u00ed, voy a hacer lo mejor que pueda. Es decir, quiero compartir c\u00f3mo modificar contenedores de im\u00e1genes en el lado del servidor antes de representarlos en el lado del cliente y hacerlo usando la biblioteca DOMDocument de PHP.<\/p>\n<p>\u00bfSuena como mucho? Con suerte, puedo desglosar esto con bastante facilidad.<\/p>\n<p>Antes de entrar en el c\u00f3digo, supongamos que tiene un elemento que representa im\u00e1genes en un solo elemento de p\u00e1rrafo (o cualquier tipo de elemento a nivel de bloque) y necesita envolver cada elemento en alg\u00fan tipo de clase para que pueda acceder a trav\u00e9s de CSS o JavaScript.<\/p>\n<h3>Donde estamos<\/h3>\n<p>Entonces, para empezar, digamos que las im\u00e1genes se muestran as\u00ed:<\/p>\n<p>Y necesitas renderizarlos as\u00ed:<\/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=\"Modificar contenedores de im\u00e1genes en el lado del servidor en WordPress\" ><\/a><\/p>\n<p>Ahora, puede o no necesitar espacio entre ellos. Realmente no importa porque tienes control sobre esto a trav\u00e9s de CSS. Pero usted tiene control sobre c\u00f3mo se env\u00eda esto a trav\u00e9s del cable al lado del cliente.<\/p>\n<p>Para hacer esto, necesitas algunas cosas:<\/p>\n<ul>\n<li>Acceso a la biblioteca DOMDocument de PHP,<\/li>\n<li>Comprensi\u00f3n de c\u00f3mo manipular el contenido a trav\u00e9s del gancho <strong>the_content de WordPress,<\/strong><\/li>\n<li>Una estrategia sobre c\u00f3mo desea envolver las im\u00e1genes.<\/li>\n<\/ul>\n<p>Revisar\u00e9 cada uno de estos en el c\u00f3digo, pero baste decir que voy a envolver cada imagen en un elemento de p\u00e1rrafo. Obviamente, puedes optar por hacer lo que quieras.<\/p>\n<h3>C\u00f3mo hacerlo<\/h3>\n<p>Primero, aseg\u00farese de haber declarado que est\u00e1 usando el contenido del documento DOM sobre <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-00-acme-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">su clase<\/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>A continuaci\u00f3n, contin\u00fae y cree un gancho para <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/the_content\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">the_content<\/a>. La forma en que lo haga depender\u00e1 de c\u00f3mo haya organizado su c\u00f3digo (ya sea <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">OOP<\/a> o no). Para este ejemplo, voy a mostrar un ejemplo muy simple de <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-01-acme-content-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c\u00f3mo hacerlo<\/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>Despu\u00e9s de eso, deber\u00e1 trabajar un poco (todo lo cual se encuentra a continuaci\u00f3n pero fuera del alcance de esta publicaci\u00f3n). Esto incluye:<\/p>\n<ul>\n<li>convertir la codificaci\u00f3n de las entidades HTML,<\/li>\n<li>creando una instancia del documento DOM,<\/li>\n<li>cargando el HTML de la publicaci\u00f3n desde el contenido entrante<\/li>\n<\/ul>\n<p>En el c\u00f3digo, deber\u00eda verse <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\">as\u00ed<\/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>A continuaci\u00f3n, debe iterar a trav\u00e9s de los\u00a0 elementos <strong>img<\/strong> y asegurarse de que est\u00e1 configurando un atributo adecuado. Puede optar por utilizar una clase, puede optar por utilizar un atributo de datos o puede optar por utilizar otra cosa. Esta parte no importa.<\/p>\n<p>Tenga en cuenta que para una imagen dada, querr\u00e1 verificar que el siguiente elemento no sea un elemento de p\u00e1rrafo, ya que eso es lo que estoy optando por envolver la imagen. En otras palabras, si el siguiente elemento no es un p\u00e1rrafo, envolveremos el elemento en un elemento de p\u00e1rrafo.<\/p>\n<p>Para hacer esto, el esqueleto de la funci\u00f3n principal deber\u00eda <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\">verse as\u00ed<\/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>Entonces, la funci\u00f3n responsable de envolver el elemento en un elemento de p\u00e1rrafo deber\u00eda verse <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-05-wrap-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/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>Aseg\u00farese de leer el DocBlock del c\u00f3digo para comprender c\u00f3mo funciona la funci\u00f3n. Simplemente pon:<\/p>\n<ul>\n<li>acepta una instancia del documento y el elemento de imagen,<\/li>\n<li>crea un elemento de p\u00e1rrafo,<\/li>\n<li>agrega un atributo de clase<\/li>\n<li>reemplaza el elemento de imagen original con el p\u00e1rrafo,<\/li>\n<li>y agrega la imagen como un elemento secundario<\/li>\n<\/ul>\n<p>Y dado que hemos basado el objeto del documento en el m\u00e9todo, no tenemos que devolver nada.<\/p>\n<p>La versi\u00f3n final de la funci\u00f3n original deber\u00eda verse <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\">as\u00ed<\/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>Y su salida deber\u00eda verse como la imagen de arriba. Recuerde, sin embargo; debe devolver los resultados de la instancia del documento a WordPress, para que represente correctamente el HTML. Y eso es lo que hace la\u00a0 funci\u00f3n <strong>saveHTML<\/strong> en el c\u00f3digo anterior.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vea c\u00f3mo usar DOMDocument para modificar elementos HTML antes de representarlos.<\/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":[716,840,861],"tags":[1172],"class_list":["post-229948","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229948","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229948"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229948\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/221217"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229948"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229948"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229948"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}