{"id":231626,"date":"2022-12-25T16:17:00","date_gmt":"2022-12-25T13:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231626"},"modified":"2022-12-07T11:07:51","modified_gmt":"2022-12-07T08:07:51","slug":"como-manipular-o-dom-usando-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-manipular-o-dom-usando-php\/","title":{"rendered":"Como manipular o DOM usando PHP"},"content":{"rendered":"\n<p>Quando se trata de manipular o DOM, a primeira coisa que muitos de n\u00f3s provavelmente pensam \u00e9 usar JavaScript para fazer tudo o que precisamos fazer.<\/p>\n<p>N\u00e3o apenas a linguagem oferece suporte nativo a fun\u00e7\u00f5es para fazer isso, como os recursos mais recentes do <a href=\"http:\/\/es6-features.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ES6<\/a> nos d\u00e3o maneiras mais poderosas de criar scripts do lado do cliente. E se voc\u00ea estiver usando <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery<\/a> com WordPress, ent\u00e3o voc\u00ea tem a mesma biblioteca de fun\u00e7\u00f5es para, ahem, consultar o DOM que temos h\u00e1 anos.<\/p>\n<p>Mas manipular o DOM no lado do cliente nem sempre \u00e9 a melhor op\u00e7\u00e3o. Em vez disso, voc\u00ea pode querer fazer isso no lado do servidor. E por causa de alguns dos recursos embutidos no PHP, n\u00e3o \u00e9 muito diferente de como fazemos as coisas usando JavaScript.<\/p>\n<p>Fora, \u00e9 claro, que estamos fazendo isso no servidor.<\/p>\n<p>Portanto, se voc\u00ea estiver trabalhando com o conte\u00fado de uma postagem (um tipo de postagem ou um tipo de postagem personalizado) e precisar manipular tags como faria com JavaScript, usar a <code>DomDocument<\/code>biblioteca \u00e9 uma das maneiras mais poderosas ferramentas est\u00e3o \u00e0 sua disposi\u00e7\u00e3o.<\/p>\n<p>Digamos, por exemplo, que voc\u00ea queira percorrer todos os elementos de par\u00e1grafo que existem no conte\u00fado da postagem.<\/p>\n<p>\u00c9 f\u00e1cil fazer isso usando a referida biblioteca. Primeiro, voc\u00ea deve <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-00-use-dom-document-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">certificar-se de ter a biblioteca configurada<\/a> em sua classe (ou apenas em sua cole\u00e7\u00e3o de fun\u00e7\u00f5es):<\/p>\n<p>Em seguida, configure um <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-01-the-content-hook-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">gancho para o conte\u00fado:<\/a><\/p>\n<pre><code>&lt;?php\n\nadd_filter('the_content', __NAMESPACE__. 'updateParagraphElements');<\/code><\/pre>\n<p>E dentro dessa fun\u00e7\u00e3o, certifique-se de carregar o conte\u00fado da postagem na biblioteca e, em seguida, procure todos os <code>p<\/code>elementos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-02-update-the-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como faria usando JavaScript<\/a> (com uma observa\u00e7\u00e3o importante sendo que voc\u00ea precisa codificar adequadamente as informa\u00e7\u00f5es caso sobrescritos ou emojis sejam usado):<\/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>A partir daqui, voc\u00ea pode fazer v\u00e1rias coisas diferentes, como adicionar o ID da postagem a um atributo personalizado de cada elemento de par\u00e1grafo. A fun\u00e7\u00e3o completa ficaria <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-04-full-code-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/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>Claro, h\u00e1 outras coisas que voc\u00ea pode fazer tamb\u00e9m. Uma coisa \u00e9 manipular a marca\u00e7\u00e3o antes de envi\u00e1-la ao navegador. Outra coisa, por\u00e9m, \u00e9 adicionar atributos aos dados se eles ainda n\u00e3o existirem.<\/p>\n<p>Ou seja, sem trocadilhos \u2013 exceto talvez apenas uma esp\u00e9cie de \u2013 conte\u00fado para outro post.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Manipular o DOM no lado do cliente nem sempre \u00e9 a melhor op\u00e7\u00e3o. Podemos fazer isso usando recursos internos do 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":[898,722,837,806,867],"tags":[1170],"class_list":["post-231626","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-php-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231626"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}