Como manipular o DOM usando PHP
Quando se trata de manipular o DOM, a primeira coisa que muitos de nós provavelmente pensam é usar JavaScript para fazer tudo o que precisamos fazer.
Não apenas a linguagem oferece suporte nativo a funções para fazer isso, como os recursos mais recentes do ES6 nos dão maneiras mais poderosas de criar scripts do lado do cliente. E se você estiver usando jQuery com WordPress, então você tem a mesma biblioteca de funções para, ahem, consultar o DOM que temos há anos.
Mas manipular o DOM no lado do cliente nem sempre é a melhor opção. Em vez disso, você pode querer fazer isso no lado do servidor. E por causa de alguns dos recursos embutidos no PHP, não é muito diferente de como fazemos as coisas usando JavaScript.
Fora, é claro, que estamos fazendo isso no servidor.
Portanto, se você estiver trabalhando com o conteúdo de uma postagem (um tipo de postagem ou um tipo de postagem personalizado) e precisar manipular tags como faria com JavaScript, usar a DomDocumentbiblioteca é uma das maneiras mais poderosas ferramentas estão à sua disposição.
Digamos, por exemplo, que você queira percorrer todos os elementos de parágrafo que existem no conteúdo da postagem.
É fácil fazer isso usando a referida biblioteca. Primeiro, você deve certificar-se de ter a biblioteca configurada em sua classe (ou apenas em sua coleção de funções):
Em seguida, configure um gancho para o conteúdo:
<?php
add_filter('the_content', __NAMESPACE__. 'updateParagraphElements');
E dentro dessa função, certifique-se de carregar o conteúdo da postagem na biblioteca e, em seguida, procure todos os pelementos como faria usando JavaScript (com uma observação importante sendo que você precisa codificar adequadamente as informações caso sobrescritos ou emojis sejam usado):
<?php
function updateParagraphElements($content)
{
/* If we're not on a single page or it's not the main query,
* we won't do anything.
*/
if (!is_single() || !is_main_query()) {
return $content;
}
// Make sure there is content to parse (and properly encode the HTML entities).
$domDocument = new DOMDocument();
$domContent = $domDocument->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));
if (false === $domContent) {
return $content;
}
$paragraphs = $domDocument->getElementsByTagName('p');
if (0 === count($paragraphs)) {
return $content;
}
// More to come...
}
A partir daqui, você pode fazer várias coisas diferentes, como adicionar o ID da postagem a um atributo personalizado de cada elemento de parágrafo. A função completa ficaria assim:
<?php
namespace Acme;
use DOMDocument;
add_filter('the_content', __NAMESPACE__. 'updateParagraphElements');
/**
* Updates the content by locating all of the `p` elements in the content,
* then adds a class attribute of the post ID to them.
*
* The gist of the work is done in this function.
*
* @param string $content the post content
*
* @return string the updated post content with the aforemented markup.
*/
function updateParagraphElements($content)
{
/* If we're not on a single page or it's not the main query,
* we won't do anything.
*/
if (!is_single() || !is_main_query()) {
return $content;
}
// Make sure there is content to parse (and properly encode the HTML entities).
$domDocument = new DOMDocument();
$domContent = $domDocument->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));
if (false === $domContent) {
return $content;
}
$paragraphs = $domDocument->getElementsByTagName('p');
if (0 === count($paragraphs)) {
return $content;
}
// If so, iterate through the elements and add the post ID as a custom attribute.
$updatedContent = '';
foreach ($paragraphs as $paragraph) {
$paragraph->setAttribute('data-id', get_the_ID());
}
return wp_kses_post($domDocument->saveHTML());
}
Claro, há outras coisas que você pode fazer também. Uma coisa é manipular a marcação antes de enviá-la ao navegador. Outra coisa, porém, é adicionar atributos aos dados se eles ainda não existirem.
Ou seja, sem trocadilhos – exceto talvez apenas uma espécie de – conteúdo para outro post.