PHP DOM добавляет HTML в фильтр WordPress

Я создал фильтр WordPress, используя метод DOM API, который был предложен здесь. https://wordpress.stackexchange.com/a/61036/103233 изменить некоторые атрибуты моих изображений:

function add_lazyload($content) {

$content = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
$dom = new DOMDocument();
@$dom->loadHTML($content);

foreach ($dom->getElementsByTagName('img') as $node) {
$oldsrc = $node->getAttribute('src');
$node->setAttribute('data-src', $oldsrc );
$newsrc = get_template_directory_uri() . '/images/placeholder.gif';
$node->setAttribute('src', $newsrc);
}

$newHtml = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML()));
return $newHtml;
}
add_filter('the_content', 'add_lazyload');
add_filter('post_thumbnail_html', 'add_lazyload');

Как я могу добавить элемент HTML в foreach цикл?

Я пытался добавить новый DOMDocument и отображать его в цикле:

$test = new DOMDocument();
$test->loadHTML('<a>Hello</a>');
$test->saveHTML();

Но эта первая печатает все новое $test элементы (по одному на каждый цикл), а затем мой измененный $newHTML печатается. Я хочу добавить новый $test элемент к каждому img из foreach петля. Я никогда не использовал DOM раньше … какие-либо предложения? appendChild? Но как?

0

Решение

http://php.net/manual/en/domdocument.createelement.php это путь. Так что вы бы сделали что-то вроде:

foreach ($dom->getElementsByTagName('img') as $node) {
$oldsrc = $node->getAttribute('src');
$node->setAttribute('data-src', $oldsrc );
$newsrc = get_template_directory_uri() . '/images/placeholder.gif';
$node->setAttribute('src', $newsrc);

// Create new anchor
$testNode = $dom->createElement('a', 'Hello');
$node->appendChild($testNode); // Insert new node inside (bad idea for images though)
$node->parentNode->appendChild($testNode); // Insert new node after image
$node->parentNode->insertBefore($testNode, $node); // Insert new node before image
}

Вы должны быть осторожны с добавлением текста с помощью createElement в виде объектов HTML, таких как & амперсанды нужно избегать.

1

Другие решения

Других решений пока нет …