{"id":231525,"date":"2022-12-25T16:00:00","date_gmt":"2022-12-25T13:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231525"},"modified":"2022-12-07T11:07:48","modified_gmt":"2022-12-07T08:07:48","slug":"comment-manipuler-le-dom-avec-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-manipuler-le-dom-avec-php\/","title":{"rendered":"Comment manipuler le DOM avec PHP"},"content":{"rendered":"\n<p>Lorsqu&rsquo;il s&rsquo;agit de manipuler le DOM, la premi\u00e8re chose \u00e0 laquelle beaucoup d&rsquo;entre nous pensent probablement est d&rsquo;utiliser JavaScript pour faire tout ce que nous devons faire.<\/p>\n<p>Non seulement le langage prend en charge nativement les fonctions pour ce faire, mais les nouvelles fonctionnalit\u00e9s d&rsquo; <a href=\"http:\/\/es6-features.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ES6<\/a> nous offrent des moyens plus puissants de cr\u00e9er des scripts c\u00f4t\u00e9 client. Et si vous utilisez <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery<\/a> avec WordPress, alors vous avez la m\u00eame biblioth\u00e8que de fonctions pour, ahem, interroger le DOM que nous avons depuis des ann\u00e9es.<\/p>\n<p>Mais manipuler le DOM c\u00f4t\u00e9 client n&rsquo;est pas toujours la meilleure option. Au lieu de cela, vous voudrez peut-\u00eatre le faire c\u00f4t\u00e9 serveur. Et \u00e0 cause de certaines des fonctionnalit\u00e9s int\u00e9gr\u00e9es \u00e0 PHP, ce n&rsquo;est pas tr\u00e8s diff\u00e9rent de la fa\u00e7on dont nous faisons les choses en utilisant JavaScript.<\/p>\n<p>\u00c0 part, bien s\u00fbr, nous le faisons sur le serveur.<\/p>\n<p>Donc, si vous travaillez un jour avec le contenu d&rsquo;un article (un type d&rsquo;article ou un type d&rsquo;article personnalis\u00e9, d&rsquo;ailleurs) et que vous devez manipuler des balises comme vous le feriez avec JavaScript, l&rsquo;utilisation de la <code>DomDocument<\/code>biblioth\u00e8que est l&rsquo;une des plus puissantes. les outils sont \u00e0 votre disposition.<\/p>\n<p>Supposons, par exemple, que vous souhaitiez parcourir tous les \u00e9l\u00e9ments de paragraphe qui existent dans le contenu de l&rsquo;article.<\/p>\n<p>Il est facile de le faire en utilisant ladite biblioth\u00e8que. Tout d&rsquo;abord, vous <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-00-use-dom-document-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">devez vous assurer que la biblioth\u00e8que est configur\u00e9e<\/a> dans votre classe (ou simplement dans votre collection de fonctions)\u00a0:<\/p>\n<p>Ensuite, configurez un <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-01-the-content-hook-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">crochet pour le contenu\u00a0:<\/a><\/p>\n<pre><code>&lt;?php\n\nadd_filter('the_content', __NAMESPACE__. 'updateParagraphElements');<\/code><\/pre>\n<p>Et dans cette fonction, assurez-vous de charger le contenu de la publication dans la biblioth\u00e8que, puis recherchez tous les <code>p<\/code>\u00e9l\u00e9ments <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-02-update-the-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comme vous le feriez avec JavaScript<\/a> (avec une remarque importante \u00e9tant que vous devez encoder correctement les informations au cas o\u00f9 les exposants ou les emojis seraient utilis\u00e9):<\/p>\n<pre><code>&lt;?php\n\nfunction updateParagraphElements($content) \n{\n    \/* If we're not on a single page or it's not the main query, \n     * we won't do anything.\n     *\/\n    if (!is_single() || !is_main_query()) {\n        return $content;\n    }\n\n    \/\/ Make sure there is content to parse (and properly encode the HTML entities).\n    $domDocument = new DOMDocument();\n    $domContent = $domDocument-&gt;loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));\n    if (false === $domContent) {\n        return $content;\n    }\n\n    $paragraphs = $domDocument-&gt;getElementsByTagName('p');\n    if (0 === count($paragraphs)) {\n        return $content;\n    }\n\n    \/\/ More to come...\n}<\/code><\/pre>\n<p>\u00c0 partir de l\u00e0, vous pouvez faire plusieurs choses diff\u00e9rentes, telles que l&rsquo;ajout de l&rsquo;ID de publication \u00e0 un attribut personnalis\u00e9 de chaque \u00e9l\u00e9ment de paragraphe. La fonction compl\u00e8te ressemblerait alors <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-04-full-code-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci\u00a0:<\/a><\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nuse DOMDocument;\n\nadd_filter('the_content', __NAMESPACE__. 'updateParagraphElements');\n\/**\n * Updates the content by locating all of the `p` elements in the content,\n * then adds a class attribute of the post ID to them.\n *\n * The gist of the work is done in this function.\n *\n * @param string $content the post content\n *\n * @return string the updated post content with the aforemented markup.\n *\/\nfunction updateParagraphElements($content) \n{\n    \/* If we're not on a single page or it's not the main query, \n     * we won't do anything.\n     *\/\n    if (!is_single() || !is_main_query()) {\n        return $content;\n    }\n\n    \/\/ Make sure there is content to parse (and properly encode the HTML entities).\n    $domDocument = new DOMDocument();\n    $domContent = $domDocument-&gt;loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));\n    if (false === $domContent) {\n        return $content;\n    }\n\n    $paragraphs = $domDocument-&gt;getElementsByTagName('p');\n    if (0 === count($paragraphs)) {\n        return $content;\n    }\n\n    \/\/ If so, iterate through the elements and add the post ID as a custom attribute.\n    $updatedContent = '';\n    foreach ($paragraphs as $paragraph) {\n        $paragraph-&gt;setAttribute('data-id', get_the_ID());\n    }\n\n    return wp_kses_post($domDocument-&gt;saveHTML());\n}<\/code><\/pre>\n<p>Bien s\u00fbr, il y a d&rsquo;autres choses que vous pouvez faire aussi. C&rsquo;est une chose de manipuler le balisage avant de l&rsquo;envoyer au navigateur. C&rsquo;est une autre chose, cependant, d&rsquo;ajouter des attributs aux donn\u00e9es s&rsquo;ils n&rsquo;existent pas d\u00e9j\u00e0.<\/p>\n<p>C&rsquo;est-\u00e0-dire, sans jeu de mots &#8211; sauf peut-\u00eatre seulement une sorte de &#8211; contenu pour un autre message.<\/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>Manipuler le DOM c\u00f4t\u00e9 client n&rsquo;est pas toujours la meilleure option. Nous pouvons le faire en utilisant les fonctionnalit\u00e9s int\u00e9gr\u00e9es de PHP.<\/p>\n","protected":false},"author":1,"featured_media":236123,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,832,801,862],"tags":[1167],"class_list":["post-231525","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231525","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=231525"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231525\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}