with * as part of their lazy-load feature. Yatra's gallery modal JavaScript reads * image URLs directly from the DOM, so it ends up with the placeholder instead * of the real URL. * * Three-layer defence: * 1. PHP templates add `data-yatra-src` (our own attribute, never altered by * third-party plugins) and `data-no-lazy="1"` (LiteSpeed's own opt-out). * 2. This class hooks into LiteSpeed's filters to exclude Yatra gallery * selectors from the lazy-loader entirely. * 3. trip.js uses `getImageSrc()` which reads `data-yatra-src` first before * falling back to common lazy-load attributes and finally `img.src`. */ final class Assets { /** @var bool Guard against double-registration. */ private static bool $registered = false; public static function register(): void { if ( self::$registered ) { return; } self::$registered = true; // Only wire up hooks if LiteSpeed Cache is active. if ( ! self::isActive() ) { return; } // Exclude Yatra gallery images from LiteSpeed lazy-loading. add_filter( 'litespeed_lazyload_excludes', [ self::class, 'excludeImages' ] ); // Exclude Yatra's trip.js from JS deferral / combination so the // gallery modal initialises at the correct time. add_filter( 'litespeed_optm_js_defer_excludes', [ self::class, 'excludeJs' ] ); add_filter( 'litespeed_optm_ccss_sep_posttype', [ self::class, 'excludeJs' ] ); // belt-and-suspenders // Prevent CSS combination for Yatra trip stylesheet so its selectors // remain intact (some LiteSpeed versions rewrite url() paths). add_filter( 'litespeed_optm_css_excludes', [ self::class, 'excludeCss' ] ); } // ------------------------------------------------------------------------- // Filter callbacks // ------------------------------------------------------------------------- /** * Exclude Yatra gallery image selectors from LiteSpeed lazy-loading. * * @param array $excludes CSS selectors / URL patterns to exclude. * @return array */ public static function excludeImages( array $excludes ): array { $excludes[] = '.yatra-hero-main-img'; $excludes[] = '.yatra-trip-hero-slide img'; $excludes[] = '.yatra-gallery-item img'; $excludes[] = '.yatra-side-image-item img'; $excludes[] = '.yatra-gallery-modal-image'; $excludes[] = '.yatra-gallery-thumbnail img'; return $excludes; } /** * Exclude Yatra's trip.js from JS defer / combination. * * @param array $excludes URL patterns. * @return array */ public static function excludeJs( array $excludes ): array { $excludes[] = 'yatra/assets/js/trip'; return $excludes; } /** * Exclude Yatra's trip.css from CSS combination. * * @param array $excludes URL patterns. * @return array */ public static function excludeCss( array $excludes ): array { $excludes[] = 'yatra/assets/css/trip'; return $excludes; } // ------------------------------------------------------------------------- // Detection // ------------------------------------------------------------------------- /** * Check whether LiteSpeed Cache is active. * Supports both the free plugin and LiteSpeed's enterprise build. */ private static function isActive(): bool { return defined( 'LSCWP_V' ) || class_exists( '\\LiteSpeed\\Core', false ) || class_exists( '\\LiteSpeed_Cache', false ) || function_exists( 'litespeed_purge_all' ); } }