{"id":231246,"date":"2022-12-25T16:17:00","date_gmt":"2022-12-25T13:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231246"},"modified":"2022-12-07T11:07:43","modified_gmt":"2022-12-07T08:07:43","slug":"como-manipular-el-dom-usando-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-manipular-el-dom-usando-php\/","title":{"rendered":"C\u00f3mo manipular el DOM usando PHP"},"content":{"rendered":"\n<p>Cuando se trata de manipular el DOM, lo primero que pensamos muchos de nosotros es usar JavaScript para hacer lo que sea que necesitemos hacer.<\/p>\n<p>El lenguaje no solo admite de forma nativa funciones para hacer esto, sino que las caracter\u00edsticas m\u00e1s nuevas de <a href=\"http:\/\/es6-features.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ES6<\/a> nos brindan formas m\u00e1s poderosas de crear scripts del lado del cliente. Y si usa <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery<\/a> con WordPress, entonces tiene la misma biblioteca de funciones para, ejem, consultar el DOM que hemos tenido durante a\u00f1os.<\/p>\n<p>Pero manipular el DOM en el lado del cliente no siempre es la mejor opci\u00f3n. En su lugar, es posible que desee hacerlo en el lado del servidor. Y debido a algunas de las funciones integradas en PHP, no es muy diferente de c\u00f3mo hacemos las cosas con JavaScript.<\/p>\n<p>Adem\u00e1s, por supuesto, lo estamos haciendo en el servidor.<\/p>\n<p>Entonces, si alguna vez trabaja con el contenido de una publicaci\u00f3n (un tipo de publicaci\u00f3n o un tipo de publicaci\u00f3n personalizada, para el caso) y necesita manipular etiquetas como lo har\u00eda con JavaScript, entonces usar la <code>DomDocument<\/code>biblioteca es uno de los m\u00e1s poderosos Las herramientas est\u00e1n a tu disposici\u00f3n.<\/p>\n<p>Digamos, por ejemplo, que desea recorrer todos los elementos de p\u00e1rrafo que existen en el contenido de la publicaci\u00f3n.<\/p>\n<p>Es f\u00e1cil hacer esto usando dicha biblioteca. Primero, querr\u00e1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-00-use-dom-document-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">asegurarse de tener la biblioteca configurada<\/a> en su clase (o solo en su colecci\u00f3n de funciones):<\/p>\n<p>A continuaci\u00f3n, configure un <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 el contenido:<\/a><\/p>\n<pre><code>&lt;?php\n\nadd_filter('the_content', __NAMESPACE__. 'updateParagraphElements');<\/code><\/pre>\n<p>Y dentro de esa funci\u00f3n, aseg\u00farese de cargar el contenido de la publicaci\u00f3n en la biblioteca y luego busque todos los <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 lo har\u00eda con JavaScript<\/a> (con una nota importante que necesita para codificar correctamente la informaci\u00f3n en caso de super\u00edndices o emojis). us\u00f3):<\/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>Desde aqu\u00ed, puede hacer varias cosas diferentes, como agregar la ID de la publicaci\u00f3n a un atributo personalizado de cada elemento de p\u00e1rrafo. La funci\u00f3n completa se ver\u00eda <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-04-full-code-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed:<\/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>Por supuesto, tambi\u00e9n hay otras cosas que puedes hacer. Una cosa es manipular el marcado antes de enviarlo al navegador. Sin embargo, otra cosa es agregar atributos a los datos si a\u00fan no existen.<\/p>\n<p>Eso es, sin juego de palabras, excepto tal vez solo una especie de contenido para otra publicaci\u00f3n.<\/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>Manipular el DOM en el lado del cliente no siempre es la mejor opci\u00f3n. Podemos hacerlo usando las caracter\u00edsticas integradas 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":[892,716,831,800,861],"tags":[1172],"class_list":["post-231246","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231246","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=231246"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231246\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}