Я использую ленивую загрузку для своих изображений и как Google указал важно добавить тег noscript ниже каждого img.
Я хочу добавить тег noscript ниже каждого изображения в Редактор WordPress, что-то вроде:
<figure>
<img src="img.jpg">
<nocript><img src="img.jp"></noscript>
<figcaption> Caption</figcaption>
<figure>
Но я не могу 🙁
Это моя функция в PHP.
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;
});
Помогите, пожалуйста: D
Что следует заметить с помощью циклов foreach, при обновлении существующего объекта (или массива), если он работает по ссылке
По умолчанию цикл foreach создает копию элементов и запускается на них. для работы с реальным объектом, вы должны добавить & до
Я также заметил бы использование временных переменных для реального распределения доменов:
создание временных переменных и использование их результатов для вставки в объект
Но это должно работать
Я также вывел 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;
});
Других решений пока нет …