-
-
Save Karendev/36a496103de1dc49ec1e6e46eafdc085 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Add skip-lazy class to first image in content. | |
*/ | |
add_filter( 'the_content', function( $content ) { | |
// Check if we have no content. | |
if ( empty( $content ) ) { | |
return $content; | |
} | |
// Check if content contains caption shortcode. | |
if ( has_shortcode( $content, 'caption' ) ) { | |
return $content; | |
} | |
if ( ! class_exists( '\Masterminds\HTML5' ) || ! class_exists( '\FlorianBrinkmann\LazyLoadResponsiveImages\Helpers' ) ) { | |
return $content; | |
} | |
// Disable libxml errors. | |
libxml_use_internal_errors( true ); | |
// Create new HTML5 object. | |
$html5 = new \Masterminds\HTML5( array( | |
'disable_html_ns' => true, | |
) ); | |
// Preserve html entities, script tags and conditional IE comments. | |
// @link https://github.com/ivopetkov/html5-dom-document-php. | |
$content = preg_replace( '/&([a-zA-Z]*);/', 'lazy-loading-responsive-images-entity1-$1-end', $content ); | |
$content = preg_replace( '/&#([0-9]*);/', 'lazy-loading-responsive-images-entity2-$1-end', $content ); | |
$content = preg_replace( '/<!--\[([\w ]*)\]>/', '<!--[$1]>-->', $content ); | |
$content = str_replace( '<![endif]-->', '<!--<![endif]-->', $content ); | |
$content = str_replace( '<script>', '<!--<script>', $content ); | |
$content = str_replace( '<script ', '<!--<script ', $content ); | |
$content = str_replace( '</script>', '</script>-->', $content ); | |
// Load the HTML. | |
$dom = $html5->loadHTML( $content ); | |
$xpath = new \DOMXPath( $dom ); | |
// Get all image nodes. | |
// @link https://stackoverflow.com/a/19348287/7774451. | |
$nodes = $xpath->query( "//img[not(ancestor-or-self::noscript)]" ); | |
$is_modified = false; | |
$counter = 0; | |
foreach ( $nodes as $node ) { | |
$counter++; | |
if ( $counter > 1 ) { | |
break; | |
} | |
// Check if it is an element that should not be lazy loaded. | |
// Get the classes as an array. | |
$node_classes = explode( ' ', $node->getAttribute( 'class' ) ); | |
if ( in_array( 'skip-lazy', $node_classes ) ) { | |
continue; | |
} | |
// Check if it is one of the supported elements and support for it is enabled. | |
if ( 'img' === $node->tagName ) { | |
// Get the classes. | |
$classes = $node->getAttribute( 'class' ); | |
// Add lazyload class. | |
$classes .= ' skip-lazy'; | |
// Set the class string. | |
$node->setAttribute( 'class', $classes ); | |
$is_modified = true; | |
} | |
} | |
if ( true === $is_modified ) { | |
$helpers = new \FlorianBrinkmann\LazyLoadResponsiveImages\Helpers(); | |
$content = $helpers->save_html( $dom, $html5 ); | |
} | |
// Restore the entities and script tags. | |
// @link https://github.com/ivopetkov/html5-dom-document-php/blob/9560a96f63a7cf236aa18b4f2fbd5aab4d756f68/src/HTML5DOMDocument.php#L343. | |
if ( strpos( $content, 'lazy-loading-responsive-images-entity') !== false || strpos( $content, '<!--<script' ) !== false ) { | |
$content = preg_replace('/lazy-loading-responsive-images-entity1-(.*?)-end/', '&$1;', $content ); | |
$content = preg_replace('/lazy-loading-responsive-images-entity2-(.*?)-end/', '&#$1;', $content ); | |
$content = preg_replace( '/<!--\[([\w ]*)\]>-->/', '<!--[$1]>', $content ); | |
$content = str_replace( '<!--<![endif]-->', '<![endif]-->', $content ); | |
$content = str_replace( '<!--<script>', '<script>', $content ); | |
$content = str_replace( '<!--<script ', '<script ', $content ); | |
$content = str_replace( '</script>-->', '</script>', $content ); | |
} | |
return $content; | |
}, 99 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment