Что следует заметить с циклами foreach, при обновлении существующего объекта (или массива), если он работает по ссылке
По умолчанию циклы foreach создают копию элементов и запускаются на них.чтобы работать с реальным объектом, вы должны добавить & before
. Я бы также заметил, что временные переменные используются для распределения реальных объектов: создаются временные переменные и используются их результаты для вставки в объект
.Но это должно работать
Я также получил saveHTML из цикла, поскольку нет необходимости в промежуточных сохранениях
Надеюсь, что поможет
ниже с & $ img
add_filter('the_content', function ($content) {
$dom = new DOMDocument();
$dom->loadHTML($post->post_content);
foreach($dom->getElementsByTagName( 'img' ) as &$img) {
if ( $img->hasAttribute( 'src' )) {
$src_attr = $img->getAttribute( 'src' );
$noscript = $dom->createElement( 'noscript' );
$noscript_node = $img->parentNode->insertBefore( $noscript, $img );
$noscript_img = $dom->createElement( 'IMG' );
$new_img = $noscript_node->appendChild( $noscript_img );
$new_img->setAttribute( 'src', $src_attr );
}
};
$content = $dom->saveHTML();
return $content;
});