Come manipolare il DOM usando PHP
Quando si tratta di manipolare il DOM, la prima cosa a cui molti di noi probabilmente pensano è usare JavaScript per fare tutto ciò che è necessario.
Non solo il linguaggio supporta nativamente le funzioni per farlo, ma le nuove funzionalità di ES6 ci offrono modi più potenti per creare script lato client. E se stai usando jQuery con WordPress, hai la stessa libreria di funzioni per, ehm, interrogare il DOM che abbiamo da anni.
Ma manipolare il DOM sul lato client non è sempre l’opzione migliore. Invece, potresti volerlo fare sul lato server. E a causa di alcune delle funzionalità integrate in PHP, non è molto diverso da come facciamo le cose usando JavaScript.
A parte, ovviamente, lo stiamo facendo sul server.
Quindi, se stai lavorando con il contenuto di un post (un tipo di post o un tipo di post personalizzato, se è per questo) e hai bisogno di manipolare i tag proprio come faresti con JavaScript, l’uso della DomDocumentlibreria è uno dei più potenti gli strumenti sono a tua disposizione.
Supponiamo, ad esempio, di voler scorrere tutti gli elementi di paragrafo che esistono nel contenuto del post.
È facile farlo usando detta libreria. Innanzitutto, assicurati di avere la libreria configurata nella tua classe (o solo nella tua raccolta di funzioni):
Quindi, imposta un hook per il contenuto:
<?php
add_filter('the_content', __NAMESPACE__. 'updateParagraphElements');
E all’interno di quella funzione, assicurati di caricare il contenuto del post nella libreria e quindi cerca tutti gli pelementi proprio come faresti usando JavaScript (con una nota importante è che devi codificare correttamente le informazioni nel caso in cui gli apici o gli emoji siano Usato):
<?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...
}
Da qui, puoi fare diverse cose come aggiungere l’ID del post a un attributo personalizzato di ogni elemento del paragrafo. La funzione completa sarebbe quindi simile a questa:
<?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());
}
Naturalmente, ci sono anche altre cose che puoi fare. Una cosa è manipolare il markup prima di inviarlo al browser. Un’altra cosa, tuttavia, è aggiungere attributi ai dati se non esistono già.
Cioè, nessun gioco di parole intendeva – tranne forse solo una sorta di – contenuto per un altro post.