Замените атрибуты изображения для плагина lazyload на элементах изображения с определенным классом

Я использую WordPress, и я хочу применить ленивую нагрузку только к определенным изображениям. Я нашел здесь способ создания атрибутов data-src и заменить атрибут src на правильное изображение https://wordpress.stackexchange.com/questions/60792/replace-image-attributes-for-lazyload-plugin-data-src , Прямо сейчас мой код применяет ленивую загрузку ко всем изображениям, и я просто хочу применить их к изображениям с ленивой загрузкой класса.

Вот как выглядит мой код

// Lazyload Converter function add_lazyload($content) { $content = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8"); $dom = new DOMDocument(); @$dom->loadHTML($content); $images = []; foreach ($dom->getElementsByTagName('img') as $node) { $images[] = $node; } foreach ($images as $node) { $fallback = $node->cloneNode(true); $oldsrc = $node->getAttribute('src'); $node->setAttribute('data-src', $oldsrc ); $newsrc = get_template_directory_uri() . '/assets/placeholders/squares.svg'; $node->setAttribute('src', $newsrc); $oldsrcset = $node->getAttribute('srcset'); $node->setAttribute('data-srcset', $oldsrcset ); $newsrcset = ''; $node->setAttribute('srcset', $newsrcset); $noscript = $dom->createElement('noscript', ''); $node->parentNode->insertBefore($noscript, $node); $noscript->appendChild($fallback); } $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'); 

как я могу получить элемент по классу вместо использования тега?

Для этого вы можете использовать xpath (с domxpath ); xpath – это язык запросов для выбора узлов из документов XML / HTML.

К сожалению, выбор элементов, которые имеют класс, который является автономной фразой lazy-load , немного запутан с помощью xpath; это не так лаконично, как вы, возможно, привыкли к css-селекторам ; xpath не имеет сокращенных селекторов атрибутов, таких как @attr~="lazy-load" и т. д.

Вот пример того, как вы выберете все элементы <img> которые имеют класс lazy-load :

 // create a DOMXPath instance that operates on your DOMDocument instance $dom $xpath = new DOMXPath( $dom ); // select nodes by some criteria (returns a non-live¹ DOMNodeList) $images = $xpath->query( '//img[contains(concat(" ", normalize-space(@class), " "), " lazy-load ")]' ); // then apply the same operations to the nodes again as in your last foreach loop foreach ($images as $node) { $fallback = $node->cloneNode(true); // etc. } 

1) Хотя я официально не документирован (насколько мне известно), DOMNodeList возвращенный DOMXPath , не является «живым», в отличие от DOMNodeList возвращенного DOMDocument , я считаю. Итак, ваш первый foreach() должен быть лишним. Конечно, вам придется попробовать.

Я бы посоветовал сделать что-то из следующего, но если вы уверены, что единственный класс, который эти элементы <img> когда-либо будут иметь, – это lazy-load , то есть атрибут class всегда будет точно lazy-load , без каких-либо пробелов и / или других классы, вы могли бы также использовать этот, гораздо более простой, запрос:

 $images = $xpath->query( '//img[@class="lazy-load"]' ); 

или, если элементы <img> могут иметь несколько классов, но никогда не будут иметь других классов, которые содержат фразу lazy-load (например, class="thumbnail lazy-loading" lazy-load class="thumbnail lazy-loading" , например), вы можете использовать:

 $images = $xpath->query( '//img[contains(@class,"lazy-load")]' );