Comment manipuler le DOM avec PHP
Lorsqu’il s’agit de manipuler le DOM, la première chose à laquelle beaucoup d’entre nous pensent probablement est d’utiliser JavaScript pour faire tout ce que nous devons faire.
Non seulement le langage prend en charge nativement les fonctions pour ce faire, mais les nouvelles fonctionnalités d’ ES6 nous offrent des moyens plus puissants de créer des scripts côté client. Et si vous utilisez jQuery avec WordPress, alors vous avez la même bibliothèque de fonctions pour, ahem, interroger le DOM que nous avons depuis des années.
Mais manipuler le DOM côté client n’est pas toujours la meilleure option. Au lieu de cela, vous voudrez peut-être le faire côté serveur. Et à cause de certaines des fonctionnalités intégrées à PHP, ce n’est pas très différent de la façon dont nous faisons les choses en utilisant JavaScript.
À part, bien sûr, nous le faisons sur le serveur.
Donc, si vous travaillez un jour avec le contenu d’un article (un type d’article ou un type d’article personnalisé, d’ailleurs) et que vous devez manipuler des balises comme vous le feriez avec JavaScript, l’utilisation de la DomDocumentbibliothèque est l’une des plus puissantes. les outils sont à votre disposition.
Supposons, par exemple, que vous souhaitiez parcourir tous les éléments de paragraphe qui existent dans le contenu de l’article.
Il est facile de le faire en utilisant ladite bibliothèque. Tout d’abord, vous devez vous assurer que la bibliothèque est configurée dans votre classe (ou simplement dans votre collection de fonctions) :
Ensuite, configurez un crochet pour le contenu :
<?php
add_filter('the_content', __NAMESPACE__. 'updateParagraphElements');
Et dans cette fonction, assurez-vous de charger le contenu de la publication dans la bibliothèque, puis recherchez tous les péléments comme vous le feriez avec JavaScript (avec une remarque importante étant que vous devez encoder correctement les informations au cas où les exposants ou les emojis seraient utilisé):
<?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...
}
À partir de là, vous pouvez faire plusieurs choses différentes, telles que l’ajout de l’ID de publication à un attribut personnalisé de chaque élément de paragraphe. La fonction complète ressemblerait alors à ceci :
<?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());
}
Bien sûr, il y a d’autres choses que vous pouvez faire aussi. C’est une chose de manipuler le balisage avant de l’envoyer au navigateur. C’est une autre chose, cependant, d’ajouter des attributs aux données s’ils n’existent pas déjà.
C’est-à-dire, sans jeu de mots – sauf peut-être seulement une sorte de – contenu pour un autre message.