Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/litespee.../src
File: media.cls.php
* @param int $post_id Attachment post ID.
[500] Fix | Delete
* @return void
[501] Fix | Delete
*/
[502] Fix | Delete
public function media_row_con( $post_id ) {
[503] Fix | Delete
$att_info = wp_get_attachment_metadata( $post_id );
[504] Fix | Delete
if ( empty( $att_info['file'] ) ) {
[505] Fix | Delete
return;
[506] Fix | Delete
}
[507] Fix | Delete
[508] Fix | Delete
$short_path = $att_info['file'];
[509] Fix | Delete
[510] Fix | Delete
$size_meta = get_post_meta( $post_id, Img_Optm::DB_SIZE, true );
[511] Fix | Delete
[512] Fix | Delete
echo '<p>';
[513] Fix | Delete
// Original image info.
[514] Fix | Delete
if ( $size_meta && ! empty( $size_meta['ori_saved'] ) ) {
[515] Fix | Delete
$percent = (int) ceil( ( (int) $size_meta['ori_saved'] * 100 ) / max( 1, (int) $size_meta['ori_total'] ) );
[516] Fix | Delete
[517] Fix | Delete
$extension = pathinfo( $short_path, PATHINFO_EXTENSION );
[518] Fix | Delete
$bk_file = substr( $short_path, 0, -strlen( $extension ) ) . 'bk.' . $extension;
[519] Fix | Delete
$bk_optm_file = substr( $short_path, 0, -strlen( $extension ) ) . 'bk.optm.' . $extension;
[520] Fix | Delete
[521] Fix | Delete
$link = Utility::build_url( Router::ACTION_IMG_OPTM, 'orig' . $post_id );
[522] Fix | Delete
$desc = false;
[523] Fix | Delete
[524] Fix | Delete
$cls = '';
[525] Fix | Delete
[526] Fix | Delete
if ( $this->info( $bk_file, $post_id ) ) {
[527] Fix | Delete
$curr_status = esc_html__( '(optm)', 'litespeed-cache' );
[528] Fix | Delete
$desc = esc_attr__( 'Currently using optimized version of file.', 'litespeed-cache' ) . '&#10;' . esc_attr__( 'Click to switch to original (unoptimized) version.', 'litespeed-cache' );
[529] Fix | Delete
} elseif ( $this->info( $bk_optm_file, $post_id ) ) {
[530] Fix | Delete
$cls .= ' litespeed-warning';
[531] Fix | Delete
$curr_status = esc_html__( '(non-optm)', 'litespeed-cache' );
[532] Fix | Delete
$desc = esc_attr__( 'Currently using original (unoptimized) version of file.', 'litespeed-cache' ) . '&#10;' . esc_attr__( 'Click to switch to optimized version.', 'litespeed-cache' );
[533] Fix | Delete
}
[534] Fix | Delete
[535] Fix | Delete
echo wp_kses(
[536] Fix | Delete
GUI::pie_tiny(
[537] Fix | Delete
$percent,
[538] Fix | Delete
24,
[539] Fix | Delete
sprintf(
[540] Fix | Delete
esc_html__( 'Original file reduced by %1$s (%2$s)', 'litespeed-cache' ),
[541] Fix | Delete
$percent . '%',
[542] Fix | Delete
Utility::real_size( $size_meta['ori_saved'] )
[543] Fix | Delete
),
[544] Fix | Delete
'left'
[545] Fix | Delete
),
[546] Fix | Delete
GUI::allowed_svg_tags()
[547] Fix | Delete
);
[548] Fix | Delete
[549] Fix | Delete
printf(
[550] Fix | Delete
esc_html__( 'Orig saved %s', 'litespeed-cache' ),
[551] Fix | Delete
(int) $percent . '%'
[552] Fix | Delete
);
[553] Fix | Delete
[554] Fix | Delete
if ( $desc ) {
[555] Fix | Delete
printf(
[556] Fix | Delete
' <a href="%1$s" class="litespeed-media-href %2$s" data-balloon-pos="left" data-balloon-break aria-label="%3$s">%4$s</a>',
[557] Fix | Delete
esc_url( $link ),
[558] Fix | Delete
esc_attr( $cls ),
[559] Fix | Delete
wp_kses_post( $desc ),
[560] Fix | Delete
esc_html( $curr_status )
[561] Fix | Delete
);
[562] Fix | Delete
} else {
[563] Fix | Delete
printf(
[564] Fix | Delete
' <span class="litespeed-desc" data-balloon-pos="left" data-balloon-break aria-label="%1$s">%2$s</span>',
[565] Fix | Delete
esc_attr__( 'Using optimized version of file. ', 'litespeed-cache' ) . '&#10;' . esc_attr__( 'No backup of original file exists.', 'litespeed-cache' ),
[566] Fix | Delete
esc_html__( '(optm)', 'litespeed-cache' )
[567] Fix | Delete
);
[568] Fix | Delete
}
[569] Fix | Delete
} elseif ( $size_meta && 0 === (int) $size_meta['ori_saved'] ) {
[570] Fix | Delete
echo wp_kses( GUI::pie_tiny( 0, 24, esc_html__( 'Congratulation! Your file was already optimized', 'litespeed-cache' ), 'left' ), GUI::allowed_svg_tags() );
[571] Fix | Delete
printf(
[572] Fix | Delete
esc_html__( 'Orig %s', 'litespeed-cache' ),
[573] Fix | Delete
'<span class="litespeed-desc">' . esc_html__( '(no savings)', 'litespeed-cache' ) . '</span>'
[574] Fix | Delete
);
[575] Fix | Delete
} else {
[576] Fix | Delete
echo esc_html__( 'Orig', 'litespeed-cache' ) . '<span class="litespeed-left10">—</span>';
[577] Fix | Delete
}
[578] Fix | Delete
echo '</p>';
[579] Fix | Delete
[580] Fix | Delete
echo '<p>';
[581] Fix | Delete
// WebP/AVIF info.
[582] Fix | Delete
if ( $size_meta && $this->webp_support( true ) && ! empty( $size_meta[ $this->_sys_format . '_saved' ] ) ) {
[583] Fix | Delete
$is_avif = 'avif' === $this->_sys_format;
[584] Fix | Delete
$size_meta_saved = $size_meta[ $this->_sys_format . '_saved' ];
[585] Fix | Delete
$size_meta_total = $size_meta[ $this->_sys_format . '_total' ];
[586] Fix | Delete
[587] Fix | Delete
$percent = ceil( ( $size_meta_saved * 100 ) / max( 1, $size_meta_total ) );
[588] Fix | Delete
[589] Fix | Delete
$link = Utility::build_url( Router::ACTION_IMG_OPTM, $this->_sys_format . $post_id );
[590] Fix | Delete
$desc = false;
[591] Fix | Delete
[592] Fix | Delete
$cls = '';
[593] Fix | Delete
[594] Fix | Delete
if ( $this->info( $short_path . '.' . $this->_sys_format, $post_id ) ) {
[595] Fix | Delete
$curr_status = esc_html__( '(optm)', 'litespeed-cache' );
[596] Fix | Delete
$desc = $is_avif
[597] Fix | Delete
? esc_attr__( 'Currently using optimized version of AVIF file.', 'litespeed-cache' )
[598] Fix | Delete
: esc_attr__( 'Currently using optimized version of WebP file.', 'litespeed-cache' );
[599] Fix | Delete
$desc .= '&#10;' . esc_attr__( 'Click to switch to original (unoptimized) version.', 'litespeed-cache' );
[600] Fix | Delete
} elseif ( $this->info( $short_path . '.optm.' . $this->_sys_format, $post_id ) ) {
[601] Fix | Delete
$cls .= ' litespeed-warning';
[602] Fix | Delete
$curr_status = esc_html__( '(non-optm)', 'litespeed-cache' );
[603] Fix | Delete
$desc = $is_avif
[604] Fix | Delete
? esc_attr__( 'Currently using original (unoptimized) version of AVIF file.', 'litespeed-cache' )
[605] Fix | Delete
: esc_attr__( 'Currently using original (unoptimized) version of WebP file.', 'litespeed-cache' );
[606] Fix | Delete
$desc .= '&#10;' . esc_attr__( 'Click to switch to optimized version.', 'litespeed-cache' );
[607] Fix | Delete
}
[608] Fix | Delete
[609] Fix | Delete
echo wp_kses(
[610] Fix | Delete
GUI::pie_tiny(
[611] Fix | Delete
$percent,
[612] Fix | Delete
24,
[613] Fix | Delete
sprintf(
[614] Fix | Delete
$is_avif ? esc_html__( 'AVIF file reduced by %1$s (%2$s)', 'litespeed-cache' ) : esc_html__( 'WebP file reduced by %1$s (%2$s)', 'litespeed-cache' ),
[615] Fix | Delete
$percent . '%',
[616] Fix | Delete
Utility::real_size( $size_meta_saved )
[617] Fix | Delete
),
[618] Fix | Delete
'left'
[619] Fix | Delete
),
[620] Fix | Delete
GUI::allowed_svg_tags()
[621] Fix | Delete
);
[622] Fix | Delete
printf(
[623] Fix | Delete
$is_avif ? esc_html__( 'AVIF saved %s', 'litespeed-cache' ) : esc_html__( 'WebP saved %s', 'litespeed-cache' ),
[624] Fix | Delete
'<span>' . esc_html( $percent ) . '%</span>'
[625] Fix | Delete
);
[626] Fix | Delete
[627] Fix | Delete
if ( $desc ) {
[628] Fix | Delete
printf(
[629] Fix | Delete
' <a href="%1$s" class="litespeed-media-href %2$s" data-balloon-pos="left" data-balloon-break aria-label="%3$s">%4$s</a>',
[630] Fix | Delete
esc_url( $link ),
[631] Fix | Delete
esc_attr( $cls ),
[632] Fix | Delete
wp_kses_post( $desc ),
[633] Fix | Delete
esc_html( $curr_status )
[634] Fix | Delete
);
[635] Fix | Delete
} else {
[636] Fix | Delete
printf(
[637] Fix | Delete
' <span class="litespeed-desc" data-balloon-pos="left" data-balloon-break aria-label="%1$s&#10;%2$s">%3$s</span>',
[638] Fix | Delete
esc_attr__( 'Using optimized version of file. ', 'litespeed-cache' ),
[639] Fix | Delete
$is_avif ? esc_attr__( 'No backup of unoptimized AVIF file exists.', 'litespeed-cache' ) : esc_attr__( 'No backup of unoptimized WebP file exists.', 'litespeed-cache' ),
[640] Fix | Delete
esc_html__( '(optm)', 'litespeed-cache' )
[641] Fix | Delete
);
[642] Fix | Delete
}
[643] Fix | Delete
} else {
[644] Fix | Delete
echo esc_html( $this->next_gen_image_title() ) . '<span class="litespeed-left10">—</span>';
[645] Fix | Delete
}
[646] Fix | Delete
[647] Fix | Delete
echo '</p>';
[648] Fix | Delete
[649] Fix | Delete
// Delete row btn.
[650] Fix | Delete
if ( $size_meta ) {
[651] Fix | Delete
printf(
[652] Fix | Delete
'<div class="row-actions"><span class="delete"><a href="%1$s" class="">%2$s</a></span></div>',
[653] Fix | Delete
esc_url( Utility::build_url( Router::ACTION_IMG_OPTM, Img_Optm::TYPE_RESET_ROW, false, null, [ 'id' => $post_id ] ) ),
[654] Fix | Delete
esc_html__( 'Restore from backup', 'litespeed-cache' )
[655] Fix | Delete
);
[656] Fix | Delete
echo '</div>';
[657] Fix | Delete
}
[658] Fix | Delete
}
[659] Fix | Delete
[660] Fix | Delete
/**
[661] Fix | Delete
* Get wp size info.
[662] Fix | Delete
*
[663] Fix | Delete
* NOTE: this is not used because it has to be after admin_init.
[664] Fix | Delete
*
[665] Fix | Delete
* @since 1.6.2
[666] Fix | Delete
* @return array $sizes Data for all currently-registered image sizes.
[667] Fix | Delete
*/
[668] Fix | Delete
public function get_image_sizes() {
[669] Fix | Delete
global $_wp_additional_image_sizes;
[670] Fix | Delete
$sizes = [];
[671] Fix | Delete
[672] Fix | Delete
foreach ( get_intermediate_image_sizes() as $_size ) {
[673] Fix | Delete
if ( in_array( $_size, [ 'thumbnail', 'medium', 'medium_large', 'large' ], true ) ) {
[674] Fix | Delete
$sizes[ $_size ]['width'] = get_option( $_size . '_size_w' );
[675] Fix | Delete
$sizes[ $_size ]['height'] = get_option( $_size . '_size_h' );
[676] Fix | Delete
$sizes[ $_size ]['crop'] = (bool) get_option( $_size . '_crop' );
[677] Fix | Delete
} elseif ( isset( $_wp_additional_image_sizes[ $_size ] ) ) {
[678] Fix | Delete
$sizes[ $_size ] = [
[679] Fix | Delete
'width' => $_wp_additional_image_sizes[ $_size ]['width'],
[680] Fix | Delete
'height' => $_wp_additional_image_sizes[ $_size ]['height'],
[681] Fix | Delete
'crop' => $_wp_additional_image_sizes[ $_size ]['crop'],
[682] Fix | Delete
];
[683] Fix | Delete
}
[684] Fix | Delete
}
[685] Fix | Delete
[686] Fix | Delete
return $sizes;
[687] Fix | Delete
}
[688] Fix | Delete
[689] Fix | Delete
/**
[690] Fix | Delete
* Exclude role from optimization filter.
[691] Fix | Delete
*
[692] Fix | Delete
* @since 1.6.2
[693] Fix | Delete
* @access public
[694] Fix | Delete
*
[695] Fix | Delete
* @param bool $sys_level Return system-level format if true.
[696] Fix | Delete
* @return string Next-gen format name or empty string.
[697] Fix | Delete
*/
[698] Fix | Delete
public function webp_support( $sys_level = false ) {
[699] Fix | Delete
if ( $sys_level ) {
[700] Fix | Delete
return $this->_sys_format;
[701] Fix | Delete
}
[702] Fix | Delete
return $this->_format; // User level next gen support.
[703] Fix | Delete
}
[704] Fix | Delete
[705] Fix | Delete
/**
[706] Fix | Delete
* Detect if browser supports next-gen format.
[707] Fix | Delete
*
[708] Fix | Delete
* @return bool
[709] Fix | Delete
*/
[710] Fix | Delete
private function _browser_support_next_gen() {
[711] Fix | Delete
$accept = isset( $_SERVER['HTTP_ACCEPT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_ACCEPT'] ) ) : '';
[712] Fix | Delete
if ( $accept ) {
[713] Fix | Delete
if ( false !== strpos( $accept, 'image/' . $this->_sys_format ) ) {
[714] Fix | Delete
return true;
[715] Fix | Delete
}
[716] Fix | Delete
}
[717] Fix | Delete
[718] Fix | Delete
$ua = isset( $_SERVER['HTTP_USER_AGENT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : '';
[719] Fix | Delete
if ( $ua ) {
[720] Fix | Delete
$user_agents = [ 'chrome-lighthouse', 'googlebot', 'page speed' ];
[721] Fix | Delete
foreach ( $user_agents as $user_agent ) {
[722] Fix | Delete
if ( false !== stripos( $ua, $user_agent ) ) {
[723] Fix | Delete
return true;
[724] Fix | Delete
}
[725] Fix | Delete
}
[726] Fix | Delete
[727] Fix | Delete
if ( preg_match( '/iPhone OS (\d+)_/i', $ua, $matches ) ) {
[728] Fix | Delete
if ( $matches[1] >= 14 ) {
[729] Fix | Delete
return true;
[730] Fix | Delete
}
[731] Fix | Delete
}
[732] Fix | Delete
[733] Fix | Delete
if ( preg_match( '/Macintosh.+Version\/([0-9.]+)/i', $ua, $matches ) ) {
[734] Fix | Delete
if ( version_compare( $matches[1], '16.4', '>=' ) ) {
[735] Fix | Delete
return true;
[736] Fix | Delete
}
[737] Fix | Delete
}
[738] Fix | Delete
[739] Fix | Delete
if ( preg_match( '/Firefox\/(\d+)/i', $ua, $matches ) ) {
[740] Fix | Delete
if ( $matches[1] >= 65 ) {
[741] Fix | Delete
return true;
[742] Fix | Delete
}
[743] Fix | Delete
}
[744] Fix | Delete
}
[745] Fix | Delete
[746] Fix | Delete
return false;
[747] Fix | Delete
}
[748] Fix | Delete
[749] Fix | Delete
/**
[750] Fix | Delete
* Get next gen image title.
[751] Fix | Delete
*
[752] Fix | Delete
* @since 7.0
[753] Fix | Delete
* @return string
[754] Fix | Delete
*/
[755] Fix | Delete
public function next_gen_image_title() {
[756] Fix | Delete
$next_gen_img = 'WebP';
[757] Fix | Delete
if ( 2 === $this->conf( Base::O_IMG_OPTM_WEBP ) ) {
[758] Fix | Delete
$next_gen_img = 'AVIF';
[759] Fix | Delete
}
[760] Fix | Delete
return $next_gen_img;
[761] Fix | Delete
}
[762] Fix | Delete
[763] Fix | Delete
/**
[764] Fix | Delete
* Run lazy load process.
[765] Fix | Delete
* NOTE: As this is after cache finalized, can NOT set any cache control anymore.
[766] Fix | Delete
*
[767] Fix | Delete
* Only do for main page. Do NOT do for esi or dynamic content.
[768] Fix | Delete
*
[769] Fix | Delete
* @since 1.4
[770] Fix | Delete
* @access public
[771] Fix | Delete
*
[772] Fix | Delete
* @param string $content Final buffer.
[773] Fix | Delete
* @return string The buffer.
[774] Fix | Delete
*/
[775] Fix | Delete
public function finalize( $content ) {
[776] Fix | Delete
if ( defined( 'LITESPEED_NO_LAZY' ) ) {
[777] Fix | Delete
self::debug2( 'bypass: NO_LAZY const' );
[778] Fix | Delete
return $content;
[779] Fix | Delete
}
[780] Fix | Delete
[781] Fix | Delete
if ( ! defined( 'LITESPEED_IS_HTML' ) ) {
[782] Fix | Delete
self::debug2( 'bypass: Not frontend HTML type' );
[783] Fix | Delete
return $content;
[784] Fix | Delete
}
[785] Fix | Delete
[786] Fix | Delete
if ( ! Control::is_cacheable() ) {
[787] Fix | Delete
self::debug( 'bypass: Not cacheable' );
[788] Fix | Delete
return $content;
[789] Fix | Delete
}
[790] Fix | Delete
[791] Fix | Delete
self::debug( 'finalize' );
[792] Fix | Delete
[793] Fix | Delete
$this->content = $content;
[794] Fix | Delete
$this->_finalize();
[795] Fix | Delete
return $this->content;
[796] Fix | Delete
}
[797] Fix | Delete
[798] Fix | Delete
/**
[799] Fix | Delete
* Run lazyload replacement for images in buffer.
[800] Fix | Delete
*
[801] Fix | Delete
* @since 1.4
[802] Fix | Delete
* @access private
[803] Fix | Delete
* @return void
[804] Fix | Delete
*/
[805] Fix | Delete
private function _finalize() {
[806] Fix | Delete
/**
[807] Fix | Delete
* Use webp for optimized images.
[808] Fix | Delete
*
[809] Fix | Delete
* @since 1.6.2
[810] Fix | Delete
*/
[811] Fix | Delete
if ( $this->webp_support() ) {
[812] Fix | Delete
$this->content = $this->_replace_buffer_img_webp( $this->content );
[813] Fix | Delete
}
[814] Fix | Delete
[815] Fix | Delete
/**
[816] Fix | Delete
* Check if URI is excluded.
[817] Fix | Delete
*
[818] Fix | Delete
* @since 3.0
[819] Fix | Delete
*/
[820] Fix | Delete
$excludes = $this->conf( Base::O_MEDIA_LAZY_URI_EXC );
[821] Fix | Delete
if ( ! defined( 'LITESPEED_GUEST_OPTM' ) ) {
[822] Fix | Delete
$request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
[823] Fix | Delete
$result = $request_uri ? Utility::str_hit_array( $request_uri, $excludes ) : false;
[824] Fix | Delete
if ( $result ) {
[825] Fix | Delete
self::debug( 'bypass lazyload: hit URI Excludes setting: ' . $result );
[826] Fix | Delete
return;
[827] Fix | Delete
}
[828] Fix | Delete
}
[829] Fix | Delete
[830] Fix | Delete
$cfg_lazy = ( defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_LAZY ) ) && ! $this->cls( 'Metabox' )->setting( 'litespeed_no_image_lazy' );
[831] Fix | Delete
$cfg_iframe_lazy = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_IFRAME_LAZY );
[832] Fix | Delete
$cfg_js_delay = defined( 'LITESPEED_GUEST_OPTM' ) || 2 === $this->conf( Base::O_OPTM_JS_DEFER );
[833] Fix | Delete
$cfg_trim_noscript = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_OPTM_NOSCRIPT_RM );
[834] Fix | Delete
$cfg_vpi = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_VPI );
[835] Fix | Delete
[836] Fix | Delete
// Preload VPI.
[837] Fix | Delete
if ( $cfg_vpi ) {
[838] Fix | Delete
$this->_parse_img_for_preload();
[839] Fix | Delete
}
[840] Fix | Delete
[841] Fix | Delete
if ( $cfg_lazy ) {
[842] Fix | Delete
if ( $cfg_vpi ) {
[843] Fix | Delete
add_filter( 'litespeed_media_lazy_img_excludes', [ $this->cls( 'Metabox' ), 'lazy_img_excludes' ] );
[844] Fix | Delete
}
[845] Fix | Delete
list( $src_list, $html_list, $placeholder_list ) = $this->_parse_img();
[846] Fix | Delete
$html_list_ori = $html_list;
[847] Fix | Delete
} else {
[848] Fix | Delete
self::debug( 'lazyload disabled' );
[849] Fix | Delete
}
[850] Fix | Delete
[851] Fix | Delete
// image lazy load.
[852] Fix | Delete
if ( $cfg_lazy ) {
[853] Fix | Delete
$__placeholder = Placeholder::cls();
[854] Fix | Delete
[855] Fix | Delete
foreach ( $html_list as $k => $v ) {
[856] Fix | Delete
$size = $placeholder_list[ $k ];
[857] Fix | Delete
$src = $src_list[ $k ];
[858] Fix | Delete
[859] Fix | Delete
$html_list[ $k ] = $__placeholder->replace( $v, $src, $size );
[860] Fix | Delete
}
[861] Fix | Delete
}
[862] Fix | Delete
[863] Fix | Delete
if ( $cfg_lazy ) {
[864] Fix | Delete
$this->content = str_replace( $html_list_ori, $html_list, $this->content );
[865] Fix | Delete
}
[866] Fix | Delete
[867] Fix | Delete
// iframe lazy load.
[868] Fix | Delete
if ( $cfg_iframe_lazy ) {
[869] Fix | Delete
$html_list = $this->_parse_iframe();
[870] Fix | Delete
$html_list_ori = $html_list;
[871] Fix | Delete
[872] Fix | Delete
foreach ( $html_list as $k => $v ) {
[873] Fix | Delete
$snippet = $cfg_trim_noscript ? '' : '<noscript>' . $v . '</noscript>';
[874] Fix | Delete
if ( $cfg_js_delay ) {
[875] Fix | Delete
$v = str_replace( ' src=', ' data-litespeed-src=', $v );
[876] Fix | Delete
} else {
[877] Fix | Delete
$v = str_replace( ' src=', ' data-src=', $v );
[878] Fix | Delete
}
[879] Fix | Delete
$v = str_replace( '<iframe ', '<iframe data-lazyloaded="1" src="about:blank" ', $v );
[880] Fix | Delete
$snippet = $v . $snippet;
[881] Fix | Delete
[882] Fix | Delete
$html_list[ $k ] = $snippet;
[883] Fix | Delete
}
[884] Fix | Delete
[885] Fix | Delete
$this->content = str_replace( $html_list_ori, $html_list, $this->content );
[886] Fix | Delete
}
[887] Fix | Delete
[888] Fix | Delete
// Include lazyload lib js and init lazyload.
[889] Fix | Delete
if ( $cfg_lazy || $cfg_iframe_lazy ) {
[890] Fix | Delete
$lazy_lib = '<script data-no-optimize="1">window.lazyLoadOptions=Object.assign({},{threshold:' . apply_filters( 'litespeed_lazyload_threshold', 300 ) . '},window.lazyLoadOptions||{});' . File::read( LSCWP_DIR . self::LIB_FILE_IMG_LAZYLOAD ) . '</script>';
[891] Fix | Delete
if ( $cfg_js_delay ) {
[892] Fix | Delete
// Load JS delay lib.
[893] Fix | Delete
if ( ! defined( 'LITESPEED_JS_DELAY_LIB_LOADED' ) ) {
[894] Fix | Delete
define( 'LITESPEED_JS_DELAY_LIB_LOADED', true );
[895] Fix | Delete
$lazy_lib .= '<script data-no-optimize="1">' . File::read( LSCWP_DIR . Optimize::LIB_FILE_JS_DELAY ) . '</script>';
[896] Fix | Delete
}
[897] Fix | Delete
}
[898] Fix | Delete
[899] Fix | Delete
$this->content = str_replace( '</body>', $lazy_lib . '</body>', $this->content );
[900] Fix | Delete
}
[901] Fix | Delete
}
[902] Fix | Delete
[903] Fix | Delete
/**
[904] Fix | Delete
* Parse img src for VPI preload only.
[905] Fix | Delete
* Note: Didn't reuse the _parse_img() because it contains replacement logic which is not needed for preload.
[906] Fix | Delete
*
[907] Fix | Delete
* @since 6.2
[908] Fix | Delete
* @since 7.6 - Added attributes fetchpriority="high" and decode="sync" for VPI images.
[909] Fix | Delete
* @return void
[910] Fix | Delete
*/
[911] Fix | Delete
private function _parse_img_for_preload() {
[912] Fix | Delete
// Load VPI setting.
[913] Fix | Delete
$is_mobile = $this->_separate_mobile();
[914] Fix | Delete
$vpi_files = $this->cls( 'Metabox' )->setting( $is_mobile ? VPI::POST_META_MOBILE : VPI::POST_META );
[915] Fix | Delete
if ( $vpi_files ) {
[916] Fix | Delete
$vpi_files = Utility::sanitize_lines( $vpi_files, 'basename' );
[917] Fix | Delete
}
[918] Fix | Delete
if ( ! $vpi_files ) {
[919] Fix | Delete
return;
[920] Fix | Delete
}
[921] Fix | Delete
if ( ! $this->content ) {
[922] Fix | Delete
return;
[923] Fix | Delete
}
[924] Fix | Delete
[925] Fix | Delete
$content = preg_replace( [ '#<!--.*-->#sU', '#<noscript([^>]*)>.*</noscript>#isU' ], '', $this->content );
[926] Fix | Delete
if ( ! $content ) {
[927] Fix | Delete
return;
[928] Fix | Delete
}
[929] Fix | Delete
[930] Fix | Delete
$vpi_fp_search = [];
[931] Fix | Delete
$vpi_fp_replace = [];
[932] Fix | Delete
preg_match_all('#<img\s+([^>]+)/?>#isU', $content, $matches, PREG_SET_ORDER);
[933] Fix | Delete
foreach ($matches as $match) {
[934] Fix | Delete
$attrs = Utility::parse_attr($match[1]);
[935] Fix | Delete
[936] Fix | Delete
if ( empty( $attrs['src'] ) ) {
[937] Fix | Delete
continue;
[938] Fix | Delete
}
[939] Fix | Delete
[940] Fix | Delete
if ( false !== strpos( $attrs['src'], 'base64' ) || 0 === strpos( $attrs['src'], 'data:' ) ) {
[941] Fix | Delete
self::debug2( 'lazyload bypassed base64 img' );
[942] Fix | Delete
continue;
[943] Fix | Delete
}
[944] Fix | Delete
[945] Fix | Delete
if ( false !== strpos( $attrs['src'], '{' ) ) {
[946] Fix | Delete
self::debug2( 'image src has {} ' . $attrs['src'] );
[947] Fix | Delete
continue;
[948] Fix | Delete
}
[949] Fix | Delete
[950] Fix | Delete
// If the src contains VPI filename, then preload it.
[951] Fix | Delete
if ( ! Utility::str_hit_array( $attrs['src'], $vpi_files ) ) {
[952] Fix | Delete
continue;
[953] Fix | Delete
}
[954] Fix | Delete
[955] Fix | Delete
self::debug2( 'VPI preload found and matched: ' . $attrs['src'] );
[956] Fix | Delete
[957] Fix | Delete
$this->_vpi_preload_list[] = $attrs['src'];
[958] Fix | Delete
[959] Fix | Delete
// Add attributes fetchpriority="high" and decode="sync"
[960] Fix | Delete
// after WP 6.3.0 use: wp_img_tag_add_loading_optimization_attrs().
[961] Fix | Delete
$new_html = [];
[962] Fix | Delete
$attrs[ 'fetchpriority' ] = 'high';
[963] Fix | Delete
$attrs[ 'decoding' ] = 'sync';
[964] Fix | Delete
// create html with new attributes.
[965] Fix | Delete
foreach ( $attrs as $k => $attr ) {
[966] Fix | Delete
$new_html[] = $k . '="' . $attr . '"';
[967] Fix | Delete
}
[968] Fix | Delete
[969] Fix | Delete
if ( $new_html ) {
[970] Fix | Delete
$vpi_fp_search[] = $match[1];
[971] Fix | Delete
$vpi_fp_replace[] = implode( ' ', $new_html);
[972] Fix | Delete
}
[973] Fix | Delete
}
[974] Fix | Delete
[975] Fix | Delete
// if VPI fetchpriority changes, do the replacement
[976] Fix | Delete
if ( $vpi_fp_search && $vpi_fp_replace ) {
[977] Fix | Delete
$this->content = str_replace( $vpi_fp_search, $vpi_fp_replace, $this->content );
[978] Fix | Delete
}
[979] Fix | Delete
unset( $vpi_fp_search );
[980] Fix | Delete
unset( $vpi_fp_replace );
[981] Fix | Delete
}
[982] Fix | Delete
[983] Fix | Delete
/**
[984] Fix | Delete
* Parse img src.
[985] Fix | Delete
*
[986] Fix | Delete
* @since 1.4
[987] Fix | Delete
* @access private
[988] Fix | Delete
* @return array{0:array,1:array,2:array} All the src & related raw html list with placeholders.
[989] Fix | Delete
*/
[990] Fix | Delete
private function _parse_img() {
[991] Fix | Delete
/**
[992] Fix | Delete
* Exclude list.
[993] Fix | Delete
*
[994] Fix | Delete
* @since 1.5
[995] Fix | Delete
* @since 2.7.1 Changed to array.
[996] Fix | Delete
*/
[997] Fix | Delete
$excludes = apply_filters( 'litespeed_media_lazy_img_excludes', $this->conf( Base::O_MEDIA_LAZY_EXC ) );
[998] Fix | Delete
[999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function