{"id":230189,"date":"2022-11-24T11:29:00","date_gmt":"2022-11-24T08:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230189"},"modified":"2022-11-09T20:31:12","modified_gmt":"2022-11-09T17:31:12","slug":"modifier-les-conteneurs-dimages-cote-serveur-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/modifier-les-conteneurs-dimages-cote-serveur-dans-wordpress\/","title":{"rendered":"Modifier les conteneurs d&rsquo;images c\u00f4t\u00e9 serveur dans WordPress"},"content":{"rendered":"\n<p>Chaque fois que vous cr\u00e9ez des solutions personnalis\u00e9es pour d&rsquo;autres personnes, vous devrez peut-\u00eatre faire face \u00e0 des cas nuanc\u00e9s de la fa\u00e7on dont WordPress rend le contenu.<\/p>\n<p>Cela se r\u00e9sume g\u00e9n\u00e9ralement au th\u00e8me, au moins un plugin, ou \u00e0 la combinaison des deux. Et si vous devez travailler avec des images individuellement, cela peut \u00eatre un peu difficile. Le probl\u00e8me m\u00eame d&rsquo;essayer d&rsquo;\u00e9crire un message comme celui-ci est qu&rsquo;il est m\u00eame difficile de d\u00e9crire une situation dans laquelle vous pourriez avoir besoin de quelque chose comme \u00e7a.<\/p>\n<p>M\u00eame quand m\u00eame, je vais faire du mieux que je peux. Autrement dit, je veux partager comment modifier les conteneurs d&rsquo;images c\u00f4t\u00e9 serveur avant de les rendre c\u00f4t\u00e9 client et le faire en utilisant la biblioth\u00e8que DOMDocument de PHP.<\/p>\n<p>Cela vous semble beaucoup\u00a0? J&rsquo;esp\u00e8re que je peux d\u00e9composer cela assez facilement.<\/p>\n<p>Avant d&rsquo;entrer dans le code, disons que vous avez un eux qui rend les images dans un seul \u00e9l\u00e9ment de paragraphe (ou tout type d&rsquo;\u00e9l\u00e9ment de niveau bloc) et que vous devez envelopper chaque \u00e9l\u00e9ment dans un certain type de classe afin que vous puissiez acc\u00e9der via CSS ou JavaScript.<\/p>\n<h3>O\u00f9 nous sommes<\/h3>\n<p>Donc, pour commencer, disons que les images s&rsquo;affichent comme ceci\u00a0:<\/p>\n<p>Et vous devez les rendre comme ceci :<\/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=\"Modifier les conteneurs d&#039;images c\u00f4t\u00e9 serveur dans WordPress\" ><\/a><\/p>\n<p>Maintenant, vous pouvez ou non avoir besoin d&rsquo;espace entre eux. Cela n&rsquo;a pas vraiment d&rsquo;importance car vous avez le contr\u00f4le sur cela via CSS. Mais vous avez le contr\u00f4le sur la fa\u00e7on dont cela est envoy\u00e9 sur le r\u00e9seau c\u00f4t\u00e9 client.<\/p>\n<p>Pour ce faire, vous avez besoin de quelques \u00e9l\u00e9ments :<\/p>\n<ul>\n<li>Acc\u00e8s \u00e0 la biblioth\u00e8que DOMDocument de PHP,<\/li>\n<li>Compr\u00e9hension de la manipulation de contenu via le crochet <strong>the_content de WordPress,<\/strong><\/li>\n<li>Une strat\u00e9gie pour la fa\u00e7on dont vous voulez envelopper les images.<\/li>\n<\/ul>\n<p>Je vais passer en revue chacun d&rsquo;entre eux dans le code, mais il suffit de dire que je vais envelopper chaque image dans un \u00e9l\u00e9ment de paragraphe. Vous pouvez \u00e9videmment choisir de faire ce que vous voulez.<\/p>\n<h3>Comment faire<\/h3>\n<p>Tout d&rsquo;abord, assurez-vous que vous avez d\u00e9clar\u00e9 que vous utilisez le contenu du document DOM au-dessus <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-00-acme-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de votre 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>Ensuite, allez-y et cr\u00e9ez un crochet vers <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 mani\u00e8re dont vous proc\u00e9derez d\u00e9pendra de la mani\u00e8re dont vous avez organis\u00e9 votre code (que ce soit en <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">POO<\/a> ou non). Pour cet exemple, je vais montrer un exemple tr\u00e8s 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\">la fa\u00e7on de le faire<\/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>Apr\u00e8s cela, vous devrez faire un peu de travail (tout cela est ci-dessous mais en dehors de la port\u00e9e de cet article). Ceci comprend:<\/p>\n<ul>\n<li>convertir l&rsquo;encodage des entit\u00e9s HTML,<\/li>\n<li>cr\u00e9er une instance du document DOM,<\/li>\n<li>charger le HTML de la publication \u00e0 partir du contenu entrant<\/li>\n<\/ul>\n<p>Dans le code, cela devrait ressembler <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\">\u00e0 ceci<\/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>Ensuite, vous devez parcourir les\u00a0 \u00e9l\u00e9ments <strong>img<\/strong> et vous assurer que vous d\u00e9finissez un attribut appropri\u00e9. Vous pouvez choisir d&rsquo;utiliser une classe, vous pouvez choisir d&rsquo;utiliser un attribut de donn\u00e9es ou vous pouvez choisir d&rsquo;utiliser autre chose. Cette partie n&rsquo;a pas d&rsquo;importance.<\/p>\n<p>Notez que pour une image donn\u00e9e, vous voudrez v\u00e9rifier que l&rsquo;\u00e9l\u00e9ment suivant n&rsquo;est pas un \u00e9l\u00e9ment de paragraphe puisque c&rsquo;est ce que j&rsquo;opte pour envelopper l&rsquo;image. En d&rsquo;autres termes, si l&rsquo;\u00e9l\u00e9ment suivant n&rsquo;est pas un paragraphe, nous envelopperons l&rsquo;\u00e9l\u00e9ment dans un \u00e9l\u00e9ment paragraphe.<\/p>\n<p>Pour ce faire, le squelette de la fonction main devrait <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\">ressembler \u00e0 ceci<\/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>Ensuite, la fonction charg\u00e9e d&rsquo;envelopper r\u00e9ellement l&rsquo;\u00e9l\u00e9ment dans un \u00e9l\u00e9ment de paragraphe devrait ressembler <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/44178197b6878eb43e369cf6e5de09fc#file-05-wrap-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/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>Assurez-vous de lire le DocBlock du code pour comprendre le fonctionnement de la fonction. Tout simplement:<\/p>\n<ul>\n<li>il accepte une instance du document et de l&rsquo;\u00e9l\u00e9ment image,<\/li>\n<li>cr\u00e9e un \u00e9l\u00e9ment de paragraphe,<\/li>\n<li>ajoute un attribut de classe<\/li>\n<li>remplace l&rsquo;\u00e9l\u00e9ment original de l&rsquo;image par le paragraphe,<\/li>\n<li>et ajoute l&rsquo;image en tant qu&rsquo;\u00e9l\u00e9ment enfant<\/li>\n<\/ul>\n<p>Et puisque nous avons bas\u00e9 l&rsquo;objet document dans la m\u00e9thode, nous n&rsquo;avons rien \u00e0 renvoyer.<\/p>\n<p>La version finale de la fonction originale devrait ressembler <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\">\u00e0 ceci<\/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>Et votre sortie devrait ressembler \u00e0 l&rsquo;image ci-dessus. Rappelez-vous, cependant; vous devez renvoyer les r\u00e9sultats de l&rsquo;instance de document \u00e0 WordPress, afin qu&rsquo;il restitue correctement le code HTML. Et c&rsquo;est ce que fait la\u00a0 fonction <strong>saveHTML<\/strong> dans le code ci-dessus.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9couvrez comment utiliser DOMDocument pour modifier des \u00e9l\u00e9ments HTML avant de les rendre.<\/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":[717,841,862],"tags":[1167],"class_list":["post-230189","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230189"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230189\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/221217"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}